这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 基于STM32h芯片搭建FreeRtos的软件功能

共5条 1/1 1 跳转至

基于STM32h芯片搭建FreeRtos的软件功能

菜鸟
2024-09-18 21:59:28     打赏

1:初始STM32H533freertos操作平台

本文章简单介绍一下,在STM32H5平台上面,建立Freertos操作平台。

RTOS是专门位实时应用程序设计的操作系统,而裸机的意思是直接在硬件上面运行的程序,没有操作系统的支持。

简单介绍一下RTOS的优点:专门位实时应用程序设计,可以提供可以预测的相应时间和任务调度,可以支持多任务并且同时执行的优点,通过任务调度来实现任务的切换,而且RTOS提供丰富的功能接口和复位。

相比之前使用的消息队列的处理方式,我觉得RTOS的实时性能更好,可以同时进行多种任务的调度。

打开串口输出项目中的ico文件,添加freertos的驱动函数,如下图所示,首次打开的时候,由于电脑上面没有安装支持包,我们要在官网上面下载支持包,安装过程如下:

图片9.png

下载好支持包后,我们只需要选择下图中的文件即可

图片10.png

图片11.png

点击生成代码:

打开生成的代码,在freertos中添加两个任务:

图片12.png

软件代码如下:

/* Includes ------------------------------------------------------------------*/
#include "app_freertos.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
const uint8_t freertos_str[] = "Hello STM32! Usart Tast0 FREERTOS!\r\n"; 

const uint8_t LED_str[] =      "Hello STM32! LED0  Tast1 TEST! \r\n"; 
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
#include "stdint.h"
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
osThreadId_t LEDTaskHandle;
osThreadId_t usartTaskHandle;

/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;


const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */

const osThreadAttr_t LEDTask_attributes = {
  .name = "LEDTask",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};

const osThreadAttr_t usartTask_attributes = {
  .name = "usartTask",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};

void STARTLEDTask(void *argument)
{
  /* USER CODE BEGIN defaultTask */
  /* Infinite loop */
  for(;;)
  {
	 HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
	 HAL_UART_Transmit(&huart2,LED_str,sizeof(LED_str),10);
	 osDelay(500);
  }
  /* USER CODE END defaultTask */
/* USER CODE END defaultTask */
}

void STARTusartTask(void *argument)
{
  /* USER CODE BEGIN defaultTask */
  /* Infinite loop */
  for(;;)
  {
  	HAL_UART_Transmit(&huart2,freertos_str,sizeof(freertos_str),10);
	  osDelay(1000);
  }
  /* USER CODE END defaultTask */
/* USER CODE END defaultTask */
}
/* USER CODE END FunctionPrototypes */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */
  /* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */

  LEDTaskHandle = osThreadNew(STARTLEDTask, NULL, &LEDTask_attributes);	
	
	usartTaskHandle = osThreadNew(STARTusartTask, NULL, &usartTask_attributes);	

	
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}
/* 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 *argument)
{
  /* USER CODE BEGIN defaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END defaultTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */


实验效果:

图片13.png

为了方便看到试验效果,这里我定义两个输出函数数组,用来显示实时的单片机工作状态。

在开发中遇到的问题和解决的办法:

任务调度冲突的问题,主要是高优先级任务会被低优先级的任务阻塞,导致系统响应迟钝或者崩溃,进入硬件错误,总之RTOS用起来比较负载,设计的知识面也比较广泛,本文章只是简单的跑了两个任务,也比较简单,以后会增加其他的功能在和大家分享。





关键词: FreeRtos         

高工
2024-09-18 23:36:43     打赏
2楼

我也喜欢FreeRTOS,但我确实不喜欢CMSIS的封装


高工
2024-09-19 08:06:17     打赏
3楼

谢谢分享


高工
2024-09-19 20:33:11     打赏
4楼

谢谢分享


专家
2024-09-19 21:38:00     打赏
5楼

感谢分享


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]