前言
在RTOS
中,需要应对各类事件。这些事件很多时候是通过硬件中断产生。假设当前系统正在运行Task1
任务,用户按下了按键,触发了按键中断。触发中断后:硬件负责: CPU跳到固定地址去执行代码,这个固定地址通常被称为中断向量。
软件负责:
- 保存现场:
Task1
被打断,需要先保存Task1
的运行环境,比如各类寄存器的值; - 调用处理函数(这个函数就被称为ISR,interrupt service
routine) - 恢复现场:继续运行
Task1
,或者运行其他优先级更高的任务。
本章主要涉及
- 两套API
- 两类中断
- 优先级
一、ISR的API函数
FreeRTOS中很多API函数都有两套:一套在任务中使用,另一套在ISR中使用。这两套区别主要在于可否阻塞和是否挑出最高优先级任务运行。
类型 | 在任务中 | 在ISR中 |
---|---|---|
队列(queue) | xQueueSendToBack | xQueueSendToBackFromISR |
xQueueSendToFront | xQueueSendToFrontFromISR | |
xQueueReceive | xQueueReceiveFromISR | |
xQueueOverwrite | xQueueOverwriteFromISR | |
xQueuePeek | xQueuePeekFromISR | |
信号量(semaphore) | xSemaphoreGive | xSemaphoreGiveFromISR |
xSemaphoreTake | xSemaphoreTakeFromISR | |
事件组(event group) | xEventGroupSetBits | xEventGroupSetBitsFromISR |
以写队列为例,来看一下这两个API有什么区别
xQueueSendToBack | xQueueSendToBackFromISR | |
---|---|---|
参数不同 | xTicksToWait: 队列满阻塞时间 | 没有xTicksToWait |
唤醒等待的任务 | 写队列后,会唤醒等待数据的任务,如果唤醒任务优先级高会发起调度 | 写队列后, |