STM32 HAL freertos零基础(十一)中断管理

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 测试

上文如有错误,恳请各位大佬指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值