STM32-RTX中signal与semaphore的区别
来源:互联网 发布:索尼人工智能音乐 编辑:程序博客网 时间:2024/05/18 12:04
区别: 信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。 参考资料
1.信号:(signal)是一种处理异步事件的方式。信号时比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。linux除了支持unix早期的信号语义函数,还支持语义符合posix.1标准的信号函数sigaction。
2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 通过STM32的simulaiton,我发现他的执行顺序是这样的:首先进入main函数,一系列初始化后,完成osKernelStart ();后,马上进入led_Thread2,执行到osSemaphoreRelease(sem1);,转到led_Thread1,LED_On(1); osDelay(500);还没开始delay就又转到led_Thread2。恰好线程2又是delay,程序中没什么可执行,索性线程1和线程2就delay了500ms,然后又回到线程1执行led关,等待semaphore。
/*----------------------------------------------------------------------------Designers Guide to the Cortex-M FamilySemaphore Example*----------------------------------------------------------------------------*/#include "stm32f10x.h"#include "cmsis_os.h"#include "Board_LED.h"void led_Thread1 (void const *argument);void led_Thread2 (void const *argument);osThreadDef(led_Thread1, osPriorityAboveNormal, 1, 0);//note the raised priority for led_thread 1osThreadDef(led_Thread2, osPriorityNormal, 1, 0);osThreadId T_ledOn;osThreadId T_ledOff;/*---------------------------------------------------------------------------- Define the semaphore *---------------------------------------------------------------------------*/osSemaphoreId sem1;osSemaphoreDef(sem1);/*---------------------------------------------------------------------------- Wait to acquire a semaphore token from sem1 then flash LED 1 *---------------------------------------------------------------------------*/void led_Thread1 (void const *argument) {for (;;) {osSemaphoreWait(sem1, osWaitForever);LED_On(1); osDelay(500);LED_Off(1);}}/*---------------------------------------------------------------------------- Flash LED 2 and 'release' a semaphore token to sem1 *---------------------------------------------------------------------------*/void led_Thread2 (void const *argument) {for (;;) {LED_On(2);osSemaphoreRelease(sem1);osDelay(500);LED_Off(2);osDelay(500);}}/*---------------------------------------------------------------------------- Initilise the LED's, Create the semaphore and start the threads *---------------------------------------------------------------------------*/int main (void) {osKernelInitialize (); // initialize CMSIS-RTOSLED_Initialize ();sem1 = osSemaphoreCreate(osSemaphore(sem1), 0);T_ledOff = osThreadCreate(osThread(led_Thread2), NULL);T_ledOn = osThreadCreate(osThread(led_Thread1), NULL);osKernelStart (); // start thread execution }
1 0
- STM32-RTX中signal与semaphore的区别
- signal、semaphore机制在Linux内核和System V的IPC中使用的区别
- mutex与semaphore的区别
- mutex与semaphore的区别
- mutex与semaphore的区别
- semaphore与mutexes的区别
- mutex与semaphore的区别
- mutex与semaphore的区别
- AVR编程中 (GCC) SIGNAL与ISR的区别
- 互斥锁Mutex与信号量Semaphore的区别
- 互斥锁Mutex与信号量Semaphore的区别
- linux中mutex和semaphore的区别
- linux中mutex和semaphore的区别
- Linux信号(signal) 机制和Linux信号量(semaphore)机制的区别
- Keil5创建基于RTX的STM32工程
- stm32启动文件中heap与stack的区别
- stm32启动文件中heap与stack的区别
- spinlock,mutex,semaphore,vitical section的作用与区别?
- [shell] vim 设置
- SparkStreaming on Kafka之Kafka解析和安装实战
- 基于两两交互张量分解模型的个性化标签推荐
- 多线程编程
- C语言:关注EOF
- STM32-RTX中signal与semaphore的区别
- setup_per_cpu_areas 函数
- IntelliJ IDEA —— grnadle配置文件
- Java图形用户界面编程(GUI)部分知识
- android通用的添加错误提示
- AC自动机应用(2)LA 4670出现次数最多的子串
- 常用类
- XMG Quartz2D 绘制文字和图片
- ORA-12154TNS无法解析指定的连接标识符