stm32F103C8T6基于FreeRTOS操作系统的多任务(STM32CUBEMX)
一、简介
FreeRTOS,是指实时操作系统,是可以多任务进行的一个操作系统,相当于裸机开发而已,任务的实现相对方便很多。FreeRTOS(读作"free-arr-toss")是一个嵌入式系统使用的开源实时操作系统。FreeRTOS被设计为“小巧,简单,和易用”,能支持许多不同硬件架构以及交叉编译器。 FreeRTOS自2002年Richard Barry开始开发以来,一直都在积极开发中。就像所有操作系统一样,FreeRTOS的主要工作是执行任务。大部分FreeRTOS的代码都涉及优先权、调度以及执行用户自定义任务。但又与所有其他操作系统不同,FreeRTOS是一款运行在嵌入式系统上的实时操作系统。
二、任务要求
学习嵌入式实时操作系统(RTOS),将其移植到stm32F103上,构建至少3个任务(task):其中两个task分别以1s和3s周期对LED等进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。记录详细的移植过程。
三、创建项目
- 打开cubeMx 创建项目,配置2个GPIO为output(PB0,PC13),在配置一个Usart1 我的配置如下:
- 配置SYS
- 配置FREERTOS
- 添加多任务,我添加了一个串口输出,两个LED闪烁的任务
- 在完成之后选择Project Manager 里面的Project,根据对应的MDK选择的MDK-ARM V5
- 然后在Code Generator 里面勾选
7.右上角点击GENERATE CODE 生成工程,打开工程之后,在freertos.c文件里面,就已经有生成的相应任务定义
三、编写任务代码
在ferrrtos.c中的任务函数里面写相应的程序
void StartUsartTask(void const * argument) { /* USER CODE BEGIN StartUsartTask */ /* Infinite loop */ for(;;) { osDelay(2000); printf("hello uc/OS! 欢迎来到RTOS多任务环境!"); } /* USER CODE END StartUsartTask */ } /* USER CODE BEGIN Header_StartTaskLed1 */ /** * @brief Function implementing the TaskLed1 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTaskLed1 */ void StartTaskLed1(void const * argument) { /* USER CODE BEGIN StartTaskLed1 */ /* Infinite loop */ for(;;) { osDelay(1000); HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); } /* USER CODE END StartTaskLed1 */ } /* USER CODE BEGIN Header_StartTaskLed2 */ /** * @brief Function implementing the TaskLed2 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTaskLed2 */ void StartTaskLed2(void const * argument) { /* USER CODE BEGIN StartTaskLed2 */ /* Infinite loop */ for(;;) { osDelay(3000); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); } /* USER CODE END StartTaskLed2 */ }
我这里重写了printf,添加以下代码在ferrrtos.c文件里面即可
/* USER CODE BEGIN Includes */ #include "usart.h" #include "stdio.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ int fputc(int ch,FILE *f){ uint8_t temp[1]={ ch}; HAL_UART_Transmit(&huart1,temp,1,2); return ch; }
注意:重写printf后运行代码前一定要勾选Use MicroLiB,否则项目烧录后无法执行。