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。
参考资料
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 }
相关文章推荐
- android通用的添加错误提示
- setup_per_cpu_areas 函数
- Java图形用户界面编程(GUI)部分知识
- HashMap的实现原理
- 菜鸟记录使用AD画PCB板定位孔的方法
- 第11周阅读程序写出执行结果1(1)
- Android statusbar 透明后 toolbar与之重叠问题的解决方法
- 多线程编程
- Java多线程编程4--Lock的实例--顺序打印
- 基于两两交互张量分解模型的个性化标签推荐
- 计算行列式的值
- C语言:关注EOF
- vtk等值面体绘制|纹理映射体绘制 附:不透明传输函数,颜色传输函数、光照与阴影
- 安卓逆向之smali语法
- toString 方法在数组中的使用
- javadoc使用
- Memcache-Java-Client-Release源码阅读(之七)
- 2016SDAU课程练习三1013 Problem M
- 反射
- Linux大文件的切割与合并