互斥信号量
如果有三个任务ABC,优先级的顺序也是ABC,A和C共用一个信号。如果在C占用信号的时候,A处于等待状态,当B处于就绪状态的时候就会打断C任务的执行,从而影响A任务得到信号量。这样B任务就会出现优先级的反转。UCOS中引出一个互斥信号量来解决这个问题。
互斥信号量会在使用的过程中暂时的提高两个任务的优先级比任何任务的优先级都高,从而尽快使用完共享资源, 在释放完信号量以后恢复正常的优先级。
互斥型信号量将OSEventCnt分为两个部分,高八位用来存放避免优先级出现反转现象需要暂时提高的优先级prio,低八位用来存放信号值(0xFF表示信号量有效,否则信号量无效)
互斥型信号量的操作函数
创建
请求
如果等不到信号量就不等了使用
发送
获取互斥型信号量当前信息
删除
消息邮箱
用来在任务与任务之间传递一个数据
消息邮箱的操作函数
创建
向消息邮箱发信息
如果消息只发给等待任务中优先级最高的任务就调用下面的发送函数
如果消息发给每个等待任务,就调用下面的广播发送函数
请求消息邮箱
如果等待不到消息邮箱就不等了,执行后面的代码就使用
查询当前消息邮箱状态
删除消息邮箱
消息队列
消息队列可以在任务之间传递多条消息,消息队列又多了一个消息队列控制块,可以说是消息邮箱的升级版也不为过。
消息队列控制块
OSQStart 是消息队列的起始地址
OSQSize 是消息队列的大小
OSQOut 指向消息被取出的位置
OSOIn 指向消息被写入的位置
OSQEnd 指向消息队列的末尾地址
OSQEntries 已经存放消息的数目
书中有一个很形象的图,描述了消息队列
有两种方式使用消息队列,一种是先进先出,一种是后进先出
先进先出
IN指针写入消息然后后移,再然后到END位置的时候,会自动跳转到Start地址,
OUT指针跟在后面取出消息
后进先出
OUT指针写OUT指针读,写一个指针后移,读一个指针前移。
系统在初始化的时候也会根据OS_MAX_QS定义一个消息队列控制块链表,创建一个消息队列的时候,就会从链表中取出一个控制块
消息队列的操作函数
创建消息队列
请求消息队列
向消息队列发送消息
OSQPost()是先进先出的方式写入消息
OSQPostFront()是后进先出的方式写入消息
以广播的形式发消息