FreeRTOS入门
任务简述
在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task。 task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
移植FreeRtos
- 简述
RTOS(Real Time Operating System 实时操作系统。
FreeRTOS是其中应用最为广泛的一种,开源免费,源码和相应的官方书籍均可从官网 www.freertos.org 获得。
使用FreeRTOS移植源码,创建多任务进行编程可以使单片机可实现功能更多,多任务管理编程更加简单。
这就是区别于裸机系统单片机编程的一点。 - 打开野火提供的资料盘
资料链接:野火指南者资料
提取码:dsaf - 代码
任务创建句柄
/*创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1任务句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;
/* helloworld任务句柄 */
static TaskHandle_t LED2_Task_Handle = NULL;
- 代码修改
static void LED2_Task(void* parameter)
{
while (1)
{
LED2_ON;//亮灯
vTaskDelay(2000); /* 设置2000的延迟 */
printf("hello world\n");
}
}
- 完整代码
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;
static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void LED2_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
printf("这是一个动态创建的多任务程序\r\n");
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
(const char* )"AppTaskCreate",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )&AppTaskCreate_Handle);
/* Æô¶¯ÈÎÎñµ÷¶È */
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1);}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
(const char* )"LED1_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED1_Task_Handle);
if(pdPASS == xReturn)
printf("´´½¨LED1_TaskÈÎÎñ³É¹¦!\r\n");
xReturn = xTaskCreate((TaskFunction_t )LED2_Task,
(const char* )"LED2_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&LED2_Task_Handle);
if(pdPASS == xReturn)
printf("´´½¨LED2_TaskÈÎÎñ³É¹¦!\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
static void LED1_Task(void* parameter)
{
while (1)
{
LED1_ON;
vTaskDelay(500);
printf("LED1_Task Running,LED1_ON\r\n");
LED1_OFF;
vTaskDelay(500);
printf("LED1_Task Running,LED1_OFF\r\n");
}
}
static void LED2_Task(void* parameter)
{
while (1)
{
LED2_ON;
vTaskDelay(2000);
printf("hello world\n");
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
- 编译
- 配置烧录选项
要选择自己适配的连接器选项
结果
将程序烧录过后就会自动运行
- 任务一实现LED灯闪烁:
- 任务二利用野火串行口调试助手显示指令数据“hello World!":