uCOS-II整理之中断和时钟

1、中断
系统收到中断请求后,中止当前任务的运行(前提:中断时开放的),按照中断向量的指向转而无运行中断服务子程序,中断服务子程序运行结束后,系统根据情况运行一次任务调度去运行任务优先级最高的就绪任务,不一定继续运行被中断的任务。
uCOS-II允许中断嵌套,嵌套层数存储在OSIntNesting中。
中断响应过程如下图:
这里写图片描述
中断服务程序两个重要的函数:
A)OSIntEnter():把全局变量OSIntNesting加1,从而用它来记录中断嵌套层数
B)OSIntExit():退出中断,进行一次任务调度返回至被中断处或者运行更高优先级的任务,流程图如下:
这里写图片描述
中断服务子程序的流程:
这里写图片描述
2、中断级任务切换
前面已经讲到中断程序结束时会进行一次任务调度,而并不一定时返回到被中断处,因此系统需要一个中断级任务调度器。
任务级的调度器:OSCtxSw()
中断级的调度器:OSIntCtxSw()
(两者代码相似)
3、应用程序中的临界段
CPU具有开中断和关中断的指令,以便使一些代码段不受中断的干扰,那些不希望被中断的代码段叫做临界段。
uCOS-II用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏封装了开中断和关中断指令,其有3种不同的实现方法,方法取决于处理器及C编译器,用户可通过定义移植文件OS_CPU.H中的常数OS_CRITICAL_METHOD来选择实现的方法。

4、uCOS-II的时钟
uCOS-II用一个硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟,两次中断之间的间隔时间,叫做时钟节拍。
硬件定时器以时钟节拍为周期产生中断,中断服务程序为OSTickISR()(汇编语言编写的),OSTickISR()调用OSTimeTick()来完成相应工作。
OSTimeTick()的工作:一是给计数器OSTime加1;二是遍历任务控制块链表中的所有任务快,把各个任务控制块中用来存放延时的OSTCBDly减1,并且让该项为0,又不是被挂起的任务进入就绪装状态,OSTimeTick()相关核心代码如下:
这里写图片描述
另外,在上图代码的第一行有一个OSTimeTickHook()函数,这是一个钩子(hook)函数,当CPU运行OSTimeTick()函数时,会调用OSTimeTickHook()函数,用户就可以在钩子函数中书写自己的代码以便完成想要的效果。

5、任务的延时和取消延时
嵌入式系统的任务时一个无限循环,为了使高优先级任务不独占CPU使用权,除了空闲任务之外额所有任务都需要在合适的位置调用系统提供的延时函数,以让出CPU的使用权。
延时函数:
A)OSTimeDly(INT16U ticks):参数为延时的节拍数
B)OSTimeDlyHMSM(INT8U hours,INT8U minutes,INT8U seconds,INT8U milli):参数为小时、分钟、秒以及毫秒。
取消延时函数:OSTimeDlyResume()
延时的任务通过在其他任务中调用取消延时函数而进入就绪状态。
6、获取和设置系统时间
获取时间:INT32U OSTimeGet(void)
设置时间:void OSTimeSet(INTU32 ticks)(节拍数)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值