- 简述
- 中断:处理器正在处理某件事的时候,请求处理器迅速处理,中断当前的操作,处理发生的事件,处理完毕,再回到原来被中断的地方继续工作
- 异常是指任何打断处理器正常运行,并且迫使处理器进入一个有特权的特殊指令执行的事件
- 中断机制避免CPU把大量时间耗费在等待、查询外设状态的操作上,提高系统实时性和执行效率
- 快进快出
- 异常分类
- 同步异常:处理器指令运行产生的事件引起的异常
- 异步异常:内外部硬件设备产生的事件引起的异常
- 引起中断的硬件
- 外设:外接硬件设备
- 向量中断控制器:NVIC
- 接收其它其它外设中断信号的输入,发出中断信号给CPU
- 可设置中断源的优先级、触发方式、打开和关闭中断源等
- NVIC最多支持240个中断,每个中断最多256个优先级
- CPU本身:响应中断请求,中断当前任务,执行中断程序
- 中断运行机制
- 产生中断
- 保存当前处理器状态信息
- 载入异常或者中断处理函数到PC寄存器
- 把控制权转交给处理函数并开始执行
- 当处理函数执行完毕,恢复处理器状态信息
- 从异常或中断中返回前一个程序执行点
- 中断延迟时间
- 硬件中断发生到开始执行中断处理程序的第一条指令的这段时间
- 任务延迟时间
- 中断发生到恢复到任务级代码的这段时间
- 中断的应用场景
- 略
- 中断延迟发布
- 分类:
- 直接发布(或称为释放):
- 延迟发布:
- 设置OS_CFG_ISR_POST_DEFERRED_EN选择,0:直接发布,1:延迟发布
- 使能中断延时发布,可以将中断级发布转换成任务级发布,
- 而且在进入临界段时也可以使用锁调度器代替关中断,
- 大大减小了关中断时间,有利于提高系统的实时性
- 分类:
- 相关函数
- os_int_q(); 中断队列信息块
- OS_InitQTaskInit(); 中断延迟发布任务初始化
- OS_IntQPost(); 中断延迟发布过程
- OS_IntQTask(); 中断延迟发布任务
- 例程
- 发布
/********************************************************* * 函数名:EXTI3_IRQHandler() * 描述 :按键中断服务函数 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ extern OS_TCB AppTaskKeyTCB; void EXTI3_IRQHandler(void) { OS_ERR err; OSIntEnter(); //进入中断 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_3) != RESET) //确保是否产生了EXTI_Line中断 { //发送任务信号量到任务AppTaskKey OSTaskSemPost( (OS_TCB *)&AppTaskKeyTCB, //目标任务 (OS_OPT )OS_OPT_POST_NONE, //没选项要求 (OS_ERR *)&err); //返回错误类型 //清除中断标志位 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); } OSIntExit(); //退出中断 }
- 接收
/************************************************** * 函数名:static void AppTaskKey(void *p_arg) * 描述 :按键检测 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskKey(void *p_arg) { OS_ERR err; CPU_TS_TMR ts_int; CPU_INT32U cpu_clk_freq; (void)p_arg; cpu_clk_freq = BSP_CPU_ClkFreq(); //获取系统时钟 for(;;) { OSTaskSemPend( (OS_TICK )0, //阻塞任务,直接按键按下 (OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待 (CPU_TS *)0, //获取信号量被发布的时间戳 (OS_ERR *)&err); //返回错误类型 ts_int = CPU_IntDisMeasMaxGet(); //获取最大关中断时间,默认是关闭的 printf ( "触发按键中断,最大中断时间是%dus\r\n", ts_int / ( cpu_clk_freq / 1000000 ) ); } }
- 发布
- 下载验证
- 总结
- uC/OS支持中断嵌套,即当前中断可以被更高优先级中断打断
- 在OS中,很多时候我们会主动进入临界段,系统不允许当前状态被中断打断
- 进入与退出时需要调用OSIntEnter()和OSIntExit(),方便中断嵌套管理
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【12】uC/OS-III应用开发————>异常与中断管理(STM32F767)
最新推荐文章于 2022-04-02 13:14:23 发布