1、简介
在FreeRTOS中,中断管理是一个重要的方面,尤其是在嵌入式系统中。正确地处理中断可以确保系统的实时响应能力,并且能够在中断服务程序(ISR)中执行关键操作。FreeRTOS提供了一些机制来帮助开发者管理中断,并确保在多任务环境下中断处理的安全性和高效性。
任何中断的优先级都大于任务!
在我们的操作系统,中断的优先级并不是从 0~15 ,默认情况下它是从 5~15 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。

使用中断需要注意:
中断函数运行时间越短越好!
在中断函数中要使用中断相关API函数,例如队列、信号等相关API都对应有两套API,常规API以及中断API!
2、Keil 5程序设计与测试
试验:
串口中断接收,在串口中断函数中向队列发送数据,在任务中进行队列接收。
2.1 队列建立
在文件中添加Queue文件,并且在文件中建立Src、Inc文件,分别添加Queuethread.cpp、Queuethread.h文件
在Keil 5内添加Queuethread.cpp、Queuethread.h:

2.2 程序设计
在main.h中添加Queuethread.h头文件:

#include "Queuethread.h"
2.3 Queuethread.h
/**
******************************************************************************
* File Name : MainThread.h
* Description :
******************************************************************************
* @attention
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __Queuethread_H
#define __Queuethread_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "FreeRTOS.h"
#include "task.h"
void Queuethread_Init(void);
extern osMessageQueueId_t myQueueHandle;
#ifdef __cplusplus
}
#endif
#endif
/**
* @}
*/
/**
* @}
*/
/**********************************END OF FILE***********************************/
2.4 Queuethread.Cpp
/**
******************************************************************************
* File Name : BinarySem.cpp
* Description : BinarySem
******************************************************************************
* @attention
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "Queuethread.h"
QueueHandle_t myQueueHandle = NULL;
/* Functions -----------------------------------------------------------------*/
/**
* @brief myQueue初始化
* @retval None
*/
void Queuethread_Init(void){
const osMessageQueueAttr_t myQueue_attributes = {"myQueue"};
myQueueHandle = osMessageQueueNew (16, sizeof(uint16_t), &myQueue_attributes);
}
/**********************************END OF FILE*********************************/
2.5 主线程进行串口中断队列发送
/**
******************************************************************************
* File Name : MainThread.cpp
* Description : 主控制线程
******************************************************************************
* @attention
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "MainThread.h"
#include "FreeRTOS.h"
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{
if(huart1.Instance == USART1)
{
if(buf=='A'){
uint32_t queue_it = 1;
xQueueSendFromISR(myQueueHandle, &queue_it, NULL);
}
else{
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, sizeof(buf));
}
/* Functions -----------------------------------------------------------------*/
/**
* @brief 主线程函数(应用层)
* @retval None
*/
void MainTask(void *argument){
while(1){
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, sizeof(buf));
osDelay(1);
}
}
/**
* @brief 主控制线程初始化
* @retval None
*/
void MainThread_Init(void){
const osThreadAttr_t MainTask_attributes = {"MainTask",0,0,0,0,128,(osPriority_t) osPriorityNormal};
osThreadNew(MainTask, NULL, &MainTask_attributes);//创建主线程
}
/**********************************END OF FILE*********************************/
2.6 任务1接收队列
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
uint32_t rev_it = 0;
BaseType_t status;
/* Infinite loop */
for(;;)
{
status = xQueueReceive(myQueueHandle, &rev_it, portMAX_DELAY);
if (status == pdTRUE){
printf("rev_it = %d\r\n", rev_it);
}
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
2.7 测试

上文如有错误,恳请各位大佬指正!!!
中断管理&spm=1001.2101.3001.5002&articleId=142282974&d=1&t=3&u=d8c7056ab84e49c798586472c1f9e426)
592

被折叠的 条评论
为什么被折叠?



