UCOS学习日(4)中断和时钟

UCOS的中断

UCOS系统发生了中断的时候,响应的过程如下
1.保存CPU的寄存器,中止当前任务。
2.跳转到中断子程序中。
3.中断子程序执行完成之后,使用中断级调度器去调度,任务就绪表中优先级最高的任务。

注意:由于中断允许嵌套,所以进一次中断UCOS中有一个OSIntNesting全局变量++一次,退出的一个中断就把OSIntNesting - - 一次。当中断嵌套未0 ,且调度器没被上锁。才能进行一次任务调度。

而中断事件的执行通常是,一个任务来进行异步事件的处理,而中断服务子程序只是去激活这个任务。

中断级任务切换函数OSIntCtxSW()和任务级任务切换函数OSCtxSW()大致相似

如果不希望任务被中断打断,可以在代码中添加中断临界区隔离开
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来隔离
正点原子的例程中使用的是方法三:将程序状态字保存到一个C函数的局部变量中,结束临界区代码执行后再恢复。
方法二:是把CPU允许中断保存到堆栈。

UCOS的时钟

UCOS的时钟节拍是一个毫秒级的,可以周期性的产生中断来进行任务切换。
当时钟节拍发生中断时,它的中断服务程序会调用OSTimeTick()时钟节拍服务函数。
这个函数会用一个计数器记录发生节拍的数OSTime。,然后遍历任务链表,把结构体里面存放延时时限的变量减一,时限为0同时又不是被挂起的任务,就让他进入就绪状态。
UCOS系统中提供了很多钩子函数可以给用户使用 钩子函数也就是 系统调用这个一个函数的时候,也会执行这个函数相应的钩子函数,然后钩子函数里面可以让用户写自己想进行的操作,在系统调用的那个函数的时候,也会达到用户的目的。
在这里插入图片描述

UCOS系统中的任务,不能独占内核,所以所有的任务都需要在合适的时候延时。OSTimeDly(时钟节拍)
在这里插入图片描述
OSTimeDlyResume()取消延时而进入就绪状态。
UCOS中可以更改系统的时钟节拍数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值