Freertos----中断管理
一、中断概念
在RTOS中,需要应对各类事件。这些事件很多时候是通过硬件中断产生,怎么处理中断呢?
假设当前系统正在运行Task1时,用户按下了按键,触发了按键中断。这个中断的处理流程如下:
- CPU跳到固定地址去执行代码,这个固定地址通常被称为中断向量,这个跳转时硬件实现的
- 执行代码做什么?
- 保存现场:Task1被打断,需要先保存Task1的运行环境,比如各类寄存器的值
- 分辨中断、调用处理函数(这个函数就被称为ISR,interrupt service routine)
- 恢复现场:继续运行Task1,或者运行其他优先级更高的任务
你要注意到,ISR是在内核中被调用的,ISR执行过程中,用户的任务无法执行。ISR要尽量快,否则:
- 其他低优先级的中断无法被处理:实时性无法保证
- 用户任务无法被执行:系统显得很卡顿
二、freertos得ISR函数
以xQueueSendToFront和xQueueSendToFrontFromISR为例
任务A中,他在while循环里面执行xQueueSendToFront,去写入队列。
xQueueSendToFront:在写入队列后,会分三种情况,如上图的红色方框。
会耗时的情况:
写入失败:阻塞耗时。写入成功:唤醒其他任务,马上并进行切换。
假如其他任务优先级高,会切换执行其他高优先级任务,而自己的任务运行很久,这样子是不能放入中断中的,因此需要有xQueueSendToFrontFromISR中断函数去写入队列。
xQueueSendToFrontFromISR:
反正使用这个函数要加上红色方框就对了。