学习FreeRTOS(中断管理)
1.中断管理
1.1 什么是中断?
中断是CPU暂停当前程序以处理内部或外部事件,完成后再继续原程序的过程
在ARM体系中,中断主要由外设输入或软件触发,用于响应紧急事件如定时器溢出、按键输入或串口数据到达。
1.2 中断的意义
中断的核心作用是提升CPU效率,通过事件驱动机制实现:
避免空转:相比轮询(持续检测),中断仅在事件发生时触发处理,减少CPU资源浪费
实时响应:立即处理紧急事件(如按键、数据到达)
多任务支持:通过快速切换实现伪并行执行
1.3 中断优先级
任何中断的优先级都大于任务!
在我们的操作系统,中断同样是具有优先级的,并且我们也可以设置它的优先级,但是他的优先级并不是从 0~15 ,默认情况下它是从 5~15 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。
1.4 中断执行流程
1.外设触发中断请求
2.CPU暂停当前任务,保存现场(PC等寄存器入栈)
3.跳转执行对应的ISR
4.ISR完成后恢复现场(出栈)
5.返回原程序继续执行
1.5 相关注意
1. 在中断中必需使用中断相关的函数;
2. 中断服务函数运行时间越短越好。
2. 实操
实验需求
创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任务则阻塞接 收队列数据。
CubeMX配置


代码实现
stm32f1xx_it.c文件代码编写
#include "cmsis_os.h"extern osMessageQId myQueue01Handle;void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){uint32_t snd = 1;xQueueSendFromISR(myQueue01Handle, &snd, NULL);}
freertos.c文件代码编写
/* USER CODE BEGIN Header_StartDefaultTask */
/*** @brief Function implementing the defaultTask thread.* @param argument: Not used* @retval None*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask */uint32_t rev=0;/* Infinite loop */for(;;){if(xQueueReceive(myQueue01Handle,&rev,portMAX_DELAY)==pdTRUE){printf("rev:%d\r\n",rev);}osDelay(1);}/* USER CODE END StartDefaultTask */
}
实验现象
1. 打开串口助手观察实验现象(按下key1往队列发送一个数据,并接收)

