一、FreeRTOS简单介绍
FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议,由美国的 Richard Barry 于 2003 年发布,Richard Barry 是FreeRTOS 的拥有 者和维护者,在过去的十多年中FreeRTOS历经了 9 个版本,与众多半导体厂商合作密切, 累计开发者数百万,是目前市场占有率最高的 RTOS。
FreeRTOS于 2018 年被亚马逊收购,改名为 AWS FreeRTOS,版本号升级为 V10,且 开源协议也由原来的 GPLv2+修改为 MIT,与 GPLv2+相比,MIT 更加开放,你完全可以理解为是为所欲为的免费。V9 以前的版本还是维持原样,V10 版本相比于 V9 就是加入了一 些物联网相关的组件,内核基本不变。亚马逊收购FreeRTOS也是为了进军眼下炒的火热 的物联网和人工智能。
- 随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,我们可以考虑引入RTOS 实现多任务管理,这是使用RTOS 的最大优势。
二、移植准备
- 下面的网址是官方最新源码的下载地址:
https://sourceforge.net/projects/freertos/files/latest/download?source=files
FreeRTOS源码在解压目录下的路径FreeRTOS_V9.0.0rc2\FreeRTOS\Source
- FreeRTOS的源码核心部分是tasks.c和list.c,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等。include文件夹里面的文件是操作系统相关的头文件,portable文件夹里的文件与平台相关
- 进入portable文件夹,打开keil文件夹,里面只有一个文件,文件提示See-also-the-RVDS-directory,意思是参照RVDS目录下的文件,以MDK建工程时,就是拿RVDS目录下的文件来替代的,因此应该把RVDS目录下的文件拷贝到Keil目录下,我们只需要把RVDS文件夹中的ARM_CM3文件拷贝到keil中即可。
- 这时portable文件夹中其他文件可以删除了,只保留keil,MemMang文件即可。
三、移植
(1)新建MDK工程
- 首先新建一个MDK工程,这里我使用的是正点原子的库函数模板,可以在www.openedv.com的资料下载里下载。
(2)添加FreeRTOS文件
- 点击上方
- 新建好FreeRTOS文件,将
FreeRTOS\tasks.c
FreeRTOS\list.c
FreeRTOS\portable\Keil\ARM_CM3\port.c
FreeRTOS\portable\MemMang\heap_4.c
这四个文件添加进来
第五个文件FreeRTOSConfig.h文件在FreeRTOS\Demo\CORTEX_STM32F103_Keil,这里我将它拷贝过来与这四个文件放在了一起,在添加的时候文件类型是默认显示.c文件的,要想看到.h文件需要选择All Files。
(3)添加头文件路径
- 点击上方
- 选择C/C++
- 点击右上角的新建,将图中的文件路径添加进来
(4)修改文件
- 修改stm32f10x_it.c文件
- 修改startup_stm32f10x_hd.s
四、应用
-
任务要求:
task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据 -
主函数main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "LED.h"
//LED周期性闪烁任务1
void LedTask1(void *parameter)
{
while(1)
{
LED0=0; //点亮LED
printf("灯亮\r\n");
vTaskDelay(500);
LED0=1;//熄灭LED
printf("灯灭\r\n");
vTaskDelay(500);
}
}
void SendTask2(void *parameter)
{
while(1)
{
printf("helloworld!\r\n");
vTaskDelay(2000);
}
}
void CollectTask3(void *parameter)
{
while(1)
{
printf("温度采集\r\n");
vTaskDelay(5000);
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
LED_init();
uart_init(115200);
xTaskCreate(LedTask1,"LED_TASK1",40,NULL,1,NULL);
xTaskCreate(SendTask2,"Send_TASK2",40,NULL,2,NULL);
xTaskCreate(CollectTask3,"Collect_TASK2",40,NULL,3,NULL);
vTaskStartScheduler();
while(1)
{
}
}
- 将程序烧录进核心板
- 效果展示
由于本人硬件不齐全,所以使用串口调试来展示效果。
五、总结
通过这次移植FreeRTOS到stm32F103的实践,我对RTOS有了更深刻的了解,它能实现多任务管理,能降低编程的难度。这次实验我也是参考他人的教程进行的,但途中还是会遇到问题,结合其他人的教程才得以解决,所以我们在实践的时候可以多看看不同的教程,取长补短。
六、参考资料
1、https://blog.csdn.net/fzf1996/article/details/89035075
2、http://www.openedv.com/thread-77593-1-1.html