STM32下完成一个基于FreeRTOS的多任务程序
STM32下完成一个基于FreeRTOS的多任务程序
一、 FreeRTOS简介
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。FreeRTOS-百度百科
FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是GPLv2+的许可协议。
二、 MDK下移植FreeRTOS
2.1 资料获取
FreeRTOS的源码和相应的官方书籍均可从官网FreeRTOS获得。
本实践源码版本是v9.0.0。
百度网盘:FreeRTOSv9.0.0提取码:yv8r
2.2资料整理并导入STM32工程中
具体步骤参考FreeRTOS移植到STM32F103步骤与注意事项
PS:其中有IAR和MDK版,请在导入工程时仔细看清要求。
具体导入就是以上文件。
2.3 补充
再添加完文件之后还需要对startup_stm32f10x.hd.s进行以下更改。
2.4 主要代码
任务要求:
在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:
-
task1,每间隔500ms闪烁(变化)一次LED;
-
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
-
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
-
main.c
void LedTask1(void* pvParameters) //任务一:每间隔500ms闪烁(变化)一次LED
{
while(1)
{
LED0=0;
printf("灯亮!\r\n");
vTaskDelay(500);
LED0=1;
printf("灯灭!\r\n");
vTaskDelay(500);
}
}
void USART_printfTask2(void* pvParameters) //任务二:每间隔2000ms,向串口发送一次指令数据“helloworld!"
{
while(1)
{
vTaskDelay(1000);
printf("Hello Windows!\r\n");
}
}
void AHT20Task3(void* pvParameters) //任务三:每间隔5000ms,从AHT20采集一次温湿度数据
{
/* 由于没有硬件,以后更新 */
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
LED_Init(); //LED初始化
uart_init(115200); //UART初始化并设置波特率115200
//任务一:每间隔500ms闪烁(变化)一次LED
xTaskCreate(LedTask1, //任务函数指针
"LedTask1", //任务名称
40, //堆栈深度(字)
NULL, //任务参数为空
1, //任务优先级
NULL); //任务句柄为空
//任务二:每间隔2000ms,向串口发送一次指令数据“helloworld!"
xTaskCreate(USART_printfTask2,
"LedTask1",
40,
NULL,
2,
NULL);
//任务三:每间隔5000ms,从AHT20采集一次温湿度数据
/* xTaskCreate(AHT20Task3,
"AHT20Task3",
40,
NULL,
3,
NULL);*/
vTaskStartScheduler(); //启动任务调度器(操作系统开始运行〕
while(1)
{
}
}
编译成功之后就可以进行烧录至STM32中并进行串口调试了。
三、 实现效果
以上就是LED闪烁和串口输出“Hello Windows!”实现效果。
四、 总结
通过此次实践学习,我初识了FreeRTOS多任务系统,并基本掌握了FreeRTOS的多任务的创建和实践。此次试验中我遇到了不少问题,特别感谢我的老师和同学对我的帮助,以及网上大佬们的资料。
五、 参考资料
[1]野火官方书籍《FreeRTOS内核实现与应用开发实战》
[2]FreeRTOS移植到STM32F103步骤与注意事项
[3]freertos移植stm32 步骤分析
[4]FreeRTOS移植到STM32上的移植过程