UCOS学习笔记——中断

UCOS的中断管理和中断服务程序的结构

UCOS的系统时钟及实现方法

UCOS的时间管理服务:延时和取消延时


一. UCOS中断过程

中断服务子程序(Interrupt Service Routines,ISR),中断服务子程序入口地址叫做中断向量。


1. 中断过程

对于可剥夺类型的UCOS,ISR执行完之后,系统执行一次调度,转而去执行优先级别最高的就绪任务,不一定转回执行被中断的任务。

UCOS学习笔记——中断_第1张图片

ISR中用到的两个函数:

OSIntEnter():将全局变量INTNesting加1,记录中断嵌套层数

OSIntExt():

UCOS学习笔记——中断_第2张图片

UCOS学习笔记——中断_第3张图片


2. 中断级任务切换函数

中断级任务调度器:OSIntCtxSw()

与任务级中断函数OSCtxSw()一样,通常用汇编语言编写。


3. 应用程序的临界段

利用两个宏实现:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL();

另:不要在临界段调用UCOS提供的功能函数,以免崩溃。

通过定义移植文件OS_CPU.H中的CRITICAL_METHOD的值来选择两个宏的实现方法。


二. UCOS的时钟

UCOS同大多数计算机系统一样,用硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间的间隔,这个最小时钟单位就叫做时钟节拍。

每个时钟节拍硬件定时器产生的中断服务程序:OSTickISR();中断服务程序通过调用函数OSTimeTick()完成系统在每个时钟节拍应该做的事。

OSTimeTick()主要完成两件事:一是给计数器OSTime加1,二是遍历任务控制块链表中的所有任务控制块,将各个任务控制块中用来存放延时时限的OSTCBDly变量减1,并使该项为0,同时又不使被挂起的任务进入就绪状态。

简单的说,时钟节拍服务函数就是在每个时钟节拍中断过程中了解每个任务的延时状态,并将其中到达延时限制的非挂起任务转为就绪状态。

OSTimeTick()是系统调用的函数,为了方便应用程序设计人员能在系统调用函数中插入一些自己的工作,UCOS提供了时钟节拍服务函数的钩子函数OSTimeTickHook()。

此外,UCOS还提供了其他10个钩子函数,以供用户在系统调用函数中书写自己的代码。


三. 时间管理


1. 任务的延时

UCOS规定除空闲任务外,所有的任务都要在合适的位置插入系统提供的任务延时函数OSTimeDly(),使当前任务暂停运行一段时间并引发一次任务调度,以防止优先级高的任务时钟霸占CPU的使用权。

为了更方便的使用任务延时,系统提供了以时分秒为单位的任务延时函数OSTimeDlyHSHM().


2. 取消任务的延时

延时的任务通过在其他任务中调用OSTimeDlyResume()取消延时而进入就绪状态。并引发一次任务调度。


3. 设置系统时间

UCOS定义了全局变量OSTime用来记录时钟节拍数。在调用OSStart()时被初始化为0,以后每发生一个时钟节拍,OSTime的值就加一。

OSTimeSet()用于设定OSTime,OSTimeGet()用于获取OSTime的值。








你可能感兴趣的:(UCOS_II)