首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FreeRTOS任务间通讯(3)

FreeRTOS任务间通讯(3)

计数信号灯
正如二进制信号灯可以认为长度是 1 的队列,计数信号灯可以看成是长度大于 1 的队列。同样,用户的信号不是对队列数据的数值感兴趣 - 只需要看队列是不是空的。
计数信号灯典型用于两个方面:

计数事件。
在这个情况下使用一个事件处理程序将在每次事件发生时 '给出' 信号 (增加信号计数值), 同时每次处理事件时处理任务将 '获得' 信号 (减少信号计数值)。因此计数值是事件发生次数和处理次数的差,信号创建时,这个计数值是0。


资源管理。
在这个情况下,计数值代表可用的资源数。为了获得一个资源的控制,任务必须先获得信号 - 减少信号的计数值。当计数值达到 0,代表没有剩余的自由资源。当任务使用完资源后,需要 '返还' 信号 - 增加信号计数值。在这种方式下信号创建时的计数值等于最大计数值。

参考 信号灯/互斥 小节查看相关的 API 函数。搜索 FreeRTOS/Demo/Common/Minimal 文件夹下的文件可以查看关于这种用法的例子。注意中断里不能使用不以 "FromISR" 结束的 API 函数。



--------------------------------------------------------------------------------

互斥
互斥是包含优先级继承机制的 二进制信号灯。对于同步(在任务之间或者任务与中断之间)来说二进制信号灯是更好的选择,互斥对于简单的互相排斥更方便 (mutex 就是 'MUT'ual 'EX'clusion).
当用于互相排斥时,互斥就像是资源保护。当一个任务需要访问资源,它必须先获得 ('take') 令牌;当访问结束后,它必须释放令牌 - 允许其他任务能够访问这个资源。

互斥使用了和信号灯相同的 API 函数,所以也可以指定阻塞时间。阻塞时间代表了任务因为试图获取一个不可马上使用的信号而进入阻塞状态的最大 '节拍' 数。和二进制信号灯不同 - 互斥采用了优先级继承关系。这意味着如果高优先级任务因为试图获取被低优先级任务保持的互斥信号(令牌)而阻塞,那么低优先级任务的优先级将临时上升到被阻塞的任务。这个机制保证了高优先级任务被阻塞的时间最短,并减少了已经发生的 '优先级反转'。

优先级继承并不能解决优先级反转的问题!它只是在某些条件下降低了它的影响。硬实时系统要把防止优先级反转放在第一位来考虑。


   
使用互斥来保护共享的资源
继承事业,薪火相传
返回列表