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
原创粉丝点击