🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
UCOS-III笔记(十二)
中断管理
异常与中断的基本概念
异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则会导致系统毁灭性瘫痪。所以正确地处理异常,避免错误的发生是提高软件鲁棒性(稳定性)非常重要的一环,对于实时系统更是如此。
异常是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。异常通常可以分成两类:同步异常和异步异常。
中断,中断属于异步异常。
中断的运作机制
当中断产生时,处理机将按如下的顺序执行:
-
保存当前处理机状态信息
-
载入异常或中断处理函数到PC寄存器
-
把控制权转交给处理函数并开始执行
-
当处理函数执行完成时,恢复处理器状态信息
-
从异常或中断中返回到前一个程序执行点
中断发生的环境有两种情况:在任务的上下文中,在中断服务函数处理上下文中。
在任务的上下文中:

在中断服务函数处理上下文中:

中断延迟
即使操作系统的响应很快了,但对于中断的处理仍然存在着中断延迟响应的问题,我们称之为中断延迟(Interrupt Latency) 。中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。
也就是:系统接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。也可以简单地理解为:(外部)硬件(设备)发生中断,到系统执行中断服务子程序(ISR)的第一条指令的时间。
中断延迟 = 识别中断时间 + 等待中断打开时间 + 关闭中断时间
中断恢复时间定义为:执行完ISR中最后一句代码后到恢复到任务级代码的这段时间。
任务延迟时间定义为:中断发生到恢复到任务级代码的这段时间。
中断管理讲解
ARM Cortex-M 系列内核的中断是由硬件管理的,而μC/OS是软件,它并不接管由硬件管理的相关中断。
ARM Cortex-M NVIC支持中断嵌套功能:当一个中断触发并且系统进行响应时,处理器硬件会将当前运行的任务上下文寄存器自动压入任务中,这部分的寄存器包括PSR,R0,R1,R2,R3以及R12寄存器。
当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样的会打断当前运行的中断服务例程,然后把老的中断服务例程上下文的PSR,R0,R1,R2,R3和R12寄存器自动保存到中断栈中
中断延迟发布
μC/OS-III有两种方法处理来自于中断的事件,直接发布(或者称为释放)和延迟发布。通过os_cfg.h中的OS_CFG_ISR_POST_DEFERRED_EN来选择,当设置为0时,μC/OS使用直接发布的方法。当设置为1时,使用延迟发布方法。
直接发布:

延迟发布:

中断队列控制块struct os_int_q
如果启用中断延迟发布,在中断中调用内核对象发布(释放)函数,系统会将发布的内容存放在中断队列中控制块中
中断延迟发布任务初始化OS_IntQTaskInit()
中断延迟发布队列存储空间(位于os_cfg_app.c)
OS_INT_Q OSCfg_IntQ [OS_CFG_INT_Q_SIZE];
CPU_STK OSCfg_IntQTaskStk [OS_CFG_INT_Q_TASK_STK_SIZE];

中断延迟发布过程OS_IntQPost()
如果启用了中断延迟发布,并且发送消息的函数是在中断中被调用,此时就不该立即发送消息,而是将消息的发送放在指定发布任务中,此时系统就将消息发布到租单消息队列中,等待到中断发布任务唤醒再发送消息
中断延迟发布任务OS_IntQTask()
7288





