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用起来比较负载,设计的知识面也比较广泛,本文章只是简单的跑了两个任务,也比较简单,以后会增加其他的功能在和大家分享。