打印本文 关闭窗口 | |
μC/OS-II中缩短中断关闭时间的方法来源于瑞达科技网 | |
作者:佚名 文章来源:不详 点击数 更新时间:2011/12/29 文章录入:瑞达 责任编辑:瑞达科技 | |
|
|
引 言 1 系统状态标志法概述 μC/OS-II中在进入临界区之前为什么要关闭中断?通过相关资料[1]的介绍和对μC/OS-II源代码的理解,我们知道在μC/OS-II中一旦不关中断就进入临界区。当某一任务进入临界区时,若恰好发生中断,那么这时有可能引起两种对临界区操作的冲突:①在中断服务程序中要操作同一临界区;②因为中断的产生而引起任务的转换,在新的任务中要操作同一临界区。所以μC/OS-II中在进入临界区前要关闭中断。 系统状态标志的复位在任务调度函数中执行。当然对系统状态标志的设置是要在关中断的条件下执行的,这应该算是系统新的一个临界区。 2 该方法的具体实现 修改后的任务调度函数OS_Sched的伪代码如下: 2.2 增加任务重调度函数OS_Resched 任务重调度函数OS_Resched的伪代码如下: 任务重调度函数在以下两处执行: (1) 当μC/OS-II将当前任务控制块压栈,而还没有将最高优先级任务的控制块弹出栈时执行,因为这时在系统循环函数数组里有可能还有未执行的函数,这些函数的执行有可能导致另外一个更高优先级任务的就绪。 2.3 中断返回函数OSIntExit的修改 中断返回函数OSIntExit的伪代码如下: 原函数的返回是void,而改动后的函数返回一个布尔量,用来表示下一步是要正常中断返回(返回布尔假值时),还是要调用任务重调度函数(返回布尔真值时);同时,改动后还增加对系统状态标志的查询,如果发现系统在临界操作状态,则直接返回布尔假值。所以在中断服务程序的最后不是象原来那样简单的调用,而是调用后根据返回值作相应的处理。 2.4 信号量发送函数OSSemPost的修改 这里将以信号量发送函数OSSemPost为例来描述对可在中断中调用而又会对临界区操作的函数的改进。对于μC/OS-II中的其他函数,改进的方法大致相同。 信号量发送函数OSSemPost的伪代码如下: 在这里,改动后的函数将先判断系统状态标志,如果系统在临界区操作状态,则将临界操作作为另一个函数放入全局函数循环数组,等待在任务调度时执行,如果不在临界区操作状态,则关中断后将系统状态标志置位,然后开中断进行原函数的那些临界操作和任务调度。 2.5 信号量等待函数OSSemPend的修改 同理,这里以信号量等待函数OSSemPend为例来描述对不能在中断中调用而又会对临界区操作的函数的改进。 信号量等待函数OSSemPend的伪代码如下: 在这里,改动后的函数先将系统状态标志置位,然后进行原来函数的临界区操作。需要说明的是,对于函数因为等待信号量时间到、还未获取信号量而返回的情况的处理机制,改动后的函数与原函数不同,改动后的函数将OS_EventTO函数放到时间节拍函数OSTimeTick中执行,并将OS_EventTO函数的输入参数由原来的事件pevent指针,改为任务控制块指针ptcb,因为在函数OSTimeTick中是按照任务控制块指针操作的。 结语 上述方法已经在笔者的一个电力微机继电保护项目中成功运用,该方面的实现,提高了μC/OS-II的性能,扩大了μC/OS-II的应用范围,使得单边及工程师能更好的利用μC/OS-II提高嵌入式软件编程水平。特别要说明的是,虽然笔者是以μC/OS-II为例来介绍的,但该方法的原理可以运用到其他实时操作系统上,笔者正在将该方法在实时操作系统RTEMS上实现。从这个意义上讲,该方法的提出也对那些致力于编写自己的实时操作系统的嵌入式软件工程师具有借鉴意义。 |
|
打印本文 关闭窗口 |