您的位置:首页 > 其它

STM32-RTX中signal与semaphore的区别

2016-05-08 10:16 489 查看
区别: 信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用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 Family
Semaphore 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 1
osThreadDef(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-RTOS

LED_Initialize ();
sem1 = osSemaphoreCreate(osSemaphore(sem1), 0);
T_ledOff = osThreadCreate(osThread(led_Thread2), NULL);
T_ledOn = osThreadCreate(osThread(led_Thread1), NULL);

osKernelStart ();                         // start thread execution
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: