STM32下基于FreeRTOS的多任务程序
文章目录
一、FreeRTOS的移植
FreeRTOS是一个热门的嵌入式设备用即时操作系统核心,已被经成功移植到35种不同的微控制器上。小巧且简易,整个核心代码可能只有3到4个C文件。
1、对文件FreeRTOSv9.0.0的操作
把FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h放到source文件目录下:
把FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR目录下的ARM_CM3复制到keil文件目录下:
portable文件夹,我们只需要留下keil、MemMang和RVDS这三个文件夹,其他的都可以删除掉,完成以后如图所示:
2、任意打开一个工程文件,进行移植。
向工程分组中添加文件
打开基础工程,新建分组FreeRTOS_CORE和 FreeRTOS_PORTABLE,然向这两个分组中添加文件,如图所示:
3、添加相应的头文件路径
添加完FreeRTOS源码中的C文件以后还要添加FreeRTOS源码的头文件路径,如图:
至此,就配置完成可以写代码了。
二、基于FreeRTOS的多任务程序
任务:
task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
1、打开工程,动态创建多任务
把main.c里的static void LED2_Task()函数的内容改为以下:
while (1)
{
printf("hello world!\n");
vTaskDelay(2000);
}
代码见图:
#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("ÕâÊÇÒ»¸ö[Ò°»ð]-STM32ȫϵÁпª·¢°å-FreeRTOS-¶¯Ì¬´´½¨¶àÈÎÎñʵÑé!\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)
{
printf("hello world!\n");
vTaskDelay(2000);
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
2、结果展示
每间隔500ms闪烁(变化)一次LED
总结
参考:STM32F1 FreeRTOS开发手册第2章节