FreeRTOS互斥量的实验

互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量,它和 信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性, 用于实现对临界资源的独占式处理。本章要实现的功能是:创建了 3 个任务与 1 个二值信号量,任务分别是高优先级任务,中优先级任务,低优先级任务,用于 模拟产生优先级翻转。低优先级任务在获取信号量的时候,被中优先级打断,中 优先级的任务执行时间较长,因为低优先级还未释放信号量,那么高优先级任务 就无法取得信号量继续运行,此时就发生了优先级翻转,任务在运行中,使用串 口打印出相关信息。本章分为如下几部分内容: 8.1 互斥量简介 8.2 常用互斥量 API 函数 8.3 硬件设计 8.4 软件设计 8.5 实验现 象

8.1 互斥量简介

互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中 (任务与任务或中断与任务之间的同步)二值信号量最适合。互斥信号量适合用于 那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一个钥匙,当任务 想要使用资源的时候就必须先获得这个钥匙,当使用完资源以后就必须归还这个 钥匙,这样其他的任务就可以拿着这个钥匙去使用资源。 互斥信号量使用和二值信号量相同的 API 操作函数,所以互斥信号量也可 以设置阻塞时间,不同于二值信号量的是互斥信号量具有优先级继承的特性。当 一个互斥信号量正在被一个低优先级的任务使用,而此时有个高优先级的任务也 尝试获取这个互斥信号量的话就会被阻塞。不过这个高优先级的任务会将低优先 级任务的优先级提升到与自己相同的优先级,这个过程就是优先级继承。优先级 继承尽可能的降低了高优先级任务处于阻塞态的时间,并且将已经出现的“优先 级翻转”的影响降到最低。

8.1.1 互斥量的优先级继承机制

在 FreeRTOS 操作系统中为了降低优先级翻转问题利用了优先级继承算法。 优先级继承算法是指,暂时提高某个占有某种资源的低优先级任务的优先级,使 之与在所有等待该资源的任务中优先级最高那个任务的优先级相等,而当这个低 优先级任务执行完毕释放该资源时,优先级重新回到初始设定值。因此,继承优 先级的任务避免了系统资源被任何中间优先级的任务抢占。 互斥量与二值信号量最大的不同是:互斥量具有优先级继承机制,而信号量 没有。也就是说,某个临界资源受到一个互斥量保护,如果这个资源正在被一个 低优先级任务使用,那么此时的互斥量是闭锁状态,也代表了没有任务能申请到 这个互斥量,如果此时一个高优先级任务想要对这个资源进行访问,去申请这个 互斥量,那么高优先级任务会因为申请不到互斥量而进入阻塞态,那么系统会将 现在持有该互斥量的任务的优先级临时提升到与高优先级任务的优先级相同,这 个优先级提升的过程叫做优先级继承。这个优先级继承机制确保高优先级任务进 入阻塞状态的时间尽可能短,以及将已经出现的“优先级翻转”危害降低到最小。 没有理解?没问题,结合过程示意图再说一遍。我们知道任务的优先级在创 建的时候就已经是设置好的,高优先级的任务可以打断低优先级的任务,抢占 CPU 的使用权。但是在很多场合中,某些资源只有一个,当低优先级任务正在占 用该资源的时候,即便高优先级任务也只能乖乖的等待低优先级任务使用完该资 源后释放资源。这里高优先级任务无法运行而低优先级任务可以运行的现象称为 “优先级翻转”。 为什么说优先级翻转在操作系统中是危害很大?因为在我们一开始创造这 个系统的时候,我们就已经设置好了任务的优先级了,越重要的任务优先级越高。 但是发生优先级翻转,对我们操作系统是致命的危害,会导致系统的高优先级任 务阻塞时间过长。 举个例子,现在有 3 个任务分别为 H 任务(High)、M 任务(Middle)、 L 任务(Low),3 个任务的优先级顺序为 H 任务>M 任务>L 任务。正常运行的 时候 H 任务可以打断 M 任务与 L 任务,M 任务可以打断 L 任务,假设系统中 有一个资源被保护了,此时该资源被 L 任务正在使用中,某一刻,H 任务需要 使用该资源,但是 L 任务还没使用完,H 任务则因为申请不到资源而进入阻塞 态,L 任务继续使用该资源,此时已经出现了“优先级翻转”现象,高优先级任 务在等着低优先级的任务执行,如果在 L 任务执行的时候刚好 M 任务被唤醒 了,由于 M 任务优先级比 L 任务优先级高,那么会打断 L 任务,抢占了 CPU 的 使用权,直到 M 任务执行完,再把 CUP 使用权归还给 L 任务,L 任务继续执 行,等到执行完毕之后释放该资源,H 任务此时才从阻塞态解除,使用该资源。 这个过程,本来是最高优先级的 H 任务,在等待了更低优先级的 L 任务与 M 任 务,其阻塞的时间是 M 任务运行时间+L 任务运行时间,这只是只有 3 个任务 的系统,假如很多个这样子的任务打断最低优先级的任务,那这个系统最高优先 级任务岂不是崩溃了,这个现象是绝对不允许出现的,高优先级的任务必须能及 时响应。所以,没有优先级继承的情况下,使用资源保护,其危害极大如下图。

图(1):L 任务正在使用某临界资源, H 任务被唤醒,执行 H 任务。但 L 任 务并未执行完毕,此时临界资源还未释放。 图(2):这个时刻 H 任务也要对该临界资源进行访问,但 L 任务还未释放 资源,由于保护机制,H 任务进入阻塞态,L 任务得以继续运行,此时已经发生 了优先级翻转现象。 图(3):某个时刻 M 任务被唤醒,由于 M 任务的优先级高于 L 任务, M 任 务抢占了 CPU 的使用权,M 任务开始运行,此时 L 任务尚未执行完,临界资源 还没被释放。 图(4):M 任务运行结束,归还 CPU 使用权,L 任务继续运行。 图(5):L 任务运行结束,释放临界资源,H 任务得以对资源进行访问,H 任 务开始运行。 在这过程中,H 任务的等待时间过长,这对系统来说这是很致命的,所以这 种情况不允许出现,而互斥量就是用来降低优先级翻转的产生的危害。 假如有优先级继承呢?那么,在 H 任务申请该资源的时候,由于申请不到 资源会进入阻塞态,那么系统就会把当前正在使用资源的 L 任务的优先级临时 提高到与 H 任务优先级相同,此时 M 任务被唤醒了,因为它的优先级比 H 任 务低,所以无法打断 L 任务,因为此时 L 任务的优先级被临时提升到 H&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值