STM32-RTX中signal与semaphore的区别

区别: 信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用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 
}



版权声明:本文为LinLingPeng_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。