SEM旗语模块通过对旗语的计数完成任务的同步和相互作用。
据个人了解:可以有两个功能
(1):使用信号量旗语发送消息(类似MBX)
旗语是一种DSP/BIOS内核定义的数据结构,用于任务线程之间的通信,同步以及访问共享数据。
通过SEM_pend()来等待旗语的到来,未到来前将此任务挂起。通过SEM_post发送旗语。
参考例程:semtest
该例程SEM配合QUE一起使用:定义一个队列,然后写任务和读任务轮流访问该队列。三个写任务的优先级相同,如果不调用任务切换函数(TSK_yield()或者是sleep),第一个写任务会一直执行完毕,然后第二个,第三个,如果调用了任务切换函数,三个任务轮流执行。
图形化配置里的参数:initial semaphore
count 旗语计数器的初始值
主要是配合SEM_pend()使用,如果旗语计数值大于0,SEM_pend()函数简单的减少计数值并返回,如果旗语计数值为0,那么任务将等待另一线程调用SEM_post()来发送旗语。
(2):利用旗语解决冲突(区别MBX)
如果两个任务共享一个数据结构,当其中一个任务线程修改这个数据结构时,如何使用旗语来阻止另一个任务线程访问该数据结构。为了解决这个冲突,两个任务都有一段通过使用同一个旗语调用SEM_pend来保护的代码。在第一个任务执行这段受保护代码期间,另一个任务即使抢先了第一个任务,也不能执行这段受保护的代码,这就是“互斥”。
参考例程:mutex
个人理解:实现互斥问题图解
SEM_pend()
/受保护的代码/
SEM_post()
如果两个不同优先级的任务都有这么一段保护代码,则即使高优先级的代码抢占了线程,也必须等低优先级的任务把代码执行完,然后发出post指令,高优先级的才能运行。我觉得这是sem区别与mbx的一点,邮箱不能实现互斥问题。