打印

DSP/BIOS中的SEM

[复制链接]
519|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Orchids|  楼主 | 2017-11-13 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP/BIOS中的SEM


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的一点,邮箱不能实现互斥问题。

相关帖子

沙发
shenmu2012| | 2017-11-13 13:55 | 只看该作者
SEM旗语模块通过对旗语的计数完成任务的同步和相互作用。这是讲信号量的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

697

主题

993

帖子

4

粉丝