1:初始STM32H533的freertos操作平台
本文章简单介绍一下,在STM32H5平台上面,建立Freertos操作平台。
RTOS是专门位实时应用程序设计的操作系统,而裸机的意思是直接在硬件上面运行的程序,没有操作系统的支持。
简单介绍一下RTOS的优点:专门位实时应用程序设计,可以提供可以预测的相应时间和任务调度,可以支持多任务并且同时执行的优点,通过任务调度来实现任务的切换,而且RTOS提供丰富的功能接口和复位。
相比之前使用的消息队列的处理方式,我觉得RTOS的实时性能更好,可以同时进行多种任务的调度。
打开串口输出项目中的ico文件,添加freertos的驱动函数,如下图所示,首次打开的时候,由于电脑上面没有安装支持包,我们要在官网上面下载支持包,安装过程如下:

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


点击生成代码:
打开生成的代码,在freertos中添加两个任务:
、
软件代码如下:
/* 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 */实验效果:

为了方便看到试验效果,这里我定义两个输出函数数组,用来显示实时的单片机工作状态。
在开发中遇到的问题和解决的办法:
任务调度冲突的问题,主要是高优先级任务会被低优先级的任务阻塞,导致系统响应迟钝或者崩溃,进入硬件错误,总之RTOS用起来比较负载,设计的知识面也比较广泛,本文章只是简单的跑了两个任务,也比较简单,以后会增加其他的功能在和大家分享。
我要赚赏金
