赞
踩
本文目的是在Keil uVision5(MDK)上把FreeRTOS移植到STM32平台上去,并练习使用FreeRTOS的任务调度功能
网上已经有许多博主写得十分详细,我这里就不在赘述,详细移植步骤可参考下面这篇文章。
Demo\CORTEX_STM32F103_Keil
路径下的FreeRTOSConfig.h头文件加入到工程中去。IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
DCD vPortSVCHandler ;由FreeRTOS管理
DCD xPortPendSVHandler ;由FreeRTOS管理
DCD xPortSysTickHandler ;由FreeRTOS管理
基于刚移植好的FreeRTOS操作系统实现一个多任务程序,执行4个周期性的任务,具体任务如下:
task1:每间隔500ms闪烁(变化)一次LED0;
task2:每间隔1000ms闪烁(变化)一次LED1;
task3,每间隔2000ms,向串口发送一次指令数据hello LYJ!!!
;
task4,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)
/*LED0周期性闪烁任务*/ void LED0Task(void *pvParameters) { while(1) { LED0=0; printf("LED0亮\r\n"); vTaskDelay(500); //睡眠500ms LED0=1; printf("LED0灭\r\n"); vTaskDelay(500); } } /*LED1周期性闪烁任务*/ void LED1Task(void *pvParameters) { while(1) { LED1=0; printf("LED1亮\r\n"); vTaskDelay(1000); //睡眠1000ms LED1=1; printf("LED1灭\r\n"); vTaskDelay(1000); } } /*串口周期性发送任务*/ void USARTTask(void *pvParameters) { while(1) { printf("hello LYJ!!!\r\n"); vTaskDelay(2000); //睡眠2000ms } } /*温湿度周期性采集任务*/ void AHT20Task(void *pvParameters) { while(1) { /*仅作为框架使用,代码后续添加*/ printf("已采集温湿度\r\n"); vTaskDelay(5000); //睡眠5000ms } } int main(void) { delay_init(); //延时函数初始化 uart_init(115200); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); LED_Init(); //初始化与LED连接的硬件接口 //创建LED0任务 xTaskCreate( LED0Task, //任务函数指针 "LED_TASK1",//任务名称 40, //堆栈深度(字) NULL, //任务参数为空 1, //任务优先级 NULL //任务句柄为空 ); //创建LED1任务 xTaskCreate(LED1Task,"LED1_TASK2",40,NULL,1,NULL); //创建串口任务 xTaskCreate(USARTTask,"USART_TASK3",40,NULL,1,NULL); //创建温湿度采集任务 xTaskCreate(AHT20Task,"AHT20_TASK4",40,NULL,1,NULL); //启动任务调度器(开始运行操作系统) vTaskStartScheduler(); while(1) { } }
从结果可以看出,LED0每500ms亮一次,LED1每1000ms亮一次,串口每2000ms发一次,温湿度每5000ms采集一次。
在这次实验之前,我都用的是裸机编程,但是通过FreeRTOS嵌入式操作系统的移植实验,使我感觉仿佛找到了新大陆。对我来说,使用一个十分小巧的操作系统就能实现多个任务之间的调度运行是一件非常棒的事情,这也让我想去更加深入的了解这一方面的内容。
1.FreeRTOS-百度百科
2.FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植
3.FreeRTOS移植到STM32上的移植过程
4.freertos移植stm32 步骤分析
5.STM32F1 FreeRTOS开发手册_V1.1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。