缩短实时 *** 作系统μCOS-II中断关闭时间的方法

缩短实时 *** 作系统μCOS-II中断关闭时间的方法,第1张

 

  笔者将以μC/OS-II实时内核为例,通过对μC/OS-II的改进,向读者描述一种缩短实时 *** 作系统中断关闭时间的方法。之所以选择μC/OS-II,一是因为读者容易获得相关代码,国内很多读者也对μC/OS-II有一定程度了解;二是因为其自身结构简单,适合运用于低档嵌入式处理器,关中断时间的问题更加突出。低档嵌入式处理器的处理速度慢,在关中断时间里处理相同的软件代码,花费的时间更长,相对地延长了关中断时间,这时尽量从软件着手解决关中断时间的问题。

  1 系统状态标志法概述

  μC/OS-II中在进入临界区之前为什么要关闭中断?通过相关资料[1]的介绍和对μC/OS-II源代码的理解,我们知道在μC/OS-II中一旦不关中断就进入临界区。当某一任务进入临界区时,若恰好发生中断,那么这时有可能引起两种对临界区 *** 作的冲突:①在中断服务程序中要 *** 作同一临界区;②因为中断的产生而引起任务的转换,在新的任务中要 *** 作同一临界区。所以μC/OS-II中在进入临界区前要关闭中断。

  针对μC/OS-II关中断机制的分析,考虑用一种系统状态标志法来解决这样的临界冲突。在μC/OS-II增加一个全局布尔变量来表示系统的状态,称为"系统状态标志"。

  对于μC/OS-II中所有可以在中断中出现又要对临界区 *** 作的函数,可以在进入临界区之前先查询系统状态标志。如果目前系统没有进入临界 *** 作状态,则首先将该标志置位,表示系统进入临界 *** 作状态,然后该函数就可以 *** 作临界区;而如果发现系统已进入临界 *** 作状态,则将该函数对临界区 *** 作的部分单独形成一个函数,放到一个系统循环函数数组里,等待系统任务调度时执行。

  对于μC/OS-II中所有不可能在中断程序中出现而又要对临界区 *** 作的函数,因为函数不在中断中出现,所以函数开始时系统状态标志肯定不会在临界 *** 作状态,因此可在函数 *** 作临界区时直接将系统状态标志置位,表示系统进入临界 *** 作状态,然后即可进行临界区的 *** 作。

  系统状态标志的复位在任务调度函数中执行。当然对系统状态标志的设置是要在关中断的条件下执行的,这应该算是系统新的一个临界区。

  2 该方法的具体实现

  下面以对μC/OS-II v2.61代码的改进为例,具体讲解该方法的具体实现。

  2.1 任务调度函数OS_Sched的修改

  修改后的任务调度函数OS_Sched的伪代码如下:

  

缩短实时 *** 作系统μCOS-II中断关闭时间的方法,第2张
缩短实时 *** 作系统μCOS-II中断关闭时间的方法,第3张
缩短实时 *** 作系统μCOS-II中断关闭时间的方法,第4张

 

  因为在任务调度函数OS_Sched中要执行循环函数数组里的函数,同时还要对系统状态标志复位,退出系统临界 *** 作状态,所以修改过的函数在遇到以下3种情况--该函数是在中断里调用时、在任务调度锁定时、当前任务就是最高优先级任务时,都将执行系统循环函数数组里的函数,并将系统状态标志复位,而原任务调度函数在遇到以上3种情况时是直接返回的。

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2713147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存