中断定义
中断是指在程序执行的过程中,突然发生了某种事件,需要立即停止当前正在执行的程序,并转而处理这个事件,处理完后再回到原来的程序执行点继续执行的过程。
中断可以是硬件中断(由硬件设备触发)或软件中断(由程序执行中断指令触发)。
中断可以提高计算机的响应速度和效率,使得计算机可以同时处理多个任务。
中断优先级
任何中断的优先级都大于任务!
在我们的操作系统,中断同样是具有优先级的,并且我们也可以设置它的优先级,但是他的优先 级并不是从 0~15 ,默认情况下它是从 5~15 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是 取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。
相关注意
1. 在中断中必需使用中断相关的函数;
2. 中断服务函数运行时间越短越好。
中断相关函数
1.队列
xQueueReceiveFromISR()
- 在中断中从队列头部读取消息,并删除消息
xQueuePeekFromISR()
- 在中断中从队列头部读取消息
2.信号量
xSemaphoreGiveFromISR()
- 在中断中释放信号量
xSemaphoreTakeFromISR()
- 在中断中获取信号量
3.事件标志组
xEventGroupClearBitsFromISR()
- 在中断中清零事件标志位
xEventGroupSetBitsFromISR()
- 在中断中设置事件标志位
4.任务通知
xTaskNotifyFromISR()
- 在中断中发送任务通知
xTaskNotifyAndQueryFromISR()
- 在中断中发送任务通知
vTaskNotifyGiveFromISR()
- 在中断中发送任务通知
5.软件定时器
xTimerStartFromISR()
- 在中断中开启软件定时器定时
xTimerStopFromISR()
- 在中断中停止软件定时器定时
xTimerResetFromISR()
- 在中断中复位软件定时器定时
xTimerChangePeriodFromISR()
- 在中断中更改定时超时时间
中断管理实操
创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任 务则阻塞接收队列数据。
打开CubeMX
1.将FreeRTOS移植到STM32F103C8T6,具体看我之前写过的文章
2.在NVIC中使能中断
3.中断代码示例:
用到的中断函数
- xQueueSendFromISR()
stm32f1xx_it.c
#include "cmsis_os.h" // 增加CubeMX封装好的头文件 extern osMessageQId myQueue01Handle; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { uint32_t snd = 1; xQueueSendFromISR(myQueue01Handle, &snd, NULL); }
4.主程序代码示例:
freertos.c
void StartDefaultTask(void const * argument) { uint32_t rev = 0; for(;;) { if (xQueueReceive(myQueue01Handle, &rev, portMAX_DELAY) == pdTRUE) printf("rev = %d\r\n", rev); osDelay(1); } }
5.打开串口助手,查看结果