首先,要明确,FreeRTOS是一个纯软程序,可以移植到不同的MCU上,学会一个MCU的移植要举一反三。移植的话要清楚FreeRTOS的入口和出口:(就是我提供了什么接口,我需要你怎么调用我的接口,让我运行起来)
FreeRTOS要想启动,必须有一个类似心跳的节拍给到它,然后系统会根据这个节拍运行。
两个接口:configTICK_RATE_HZ和xPortSysTickHandler();
工作原理:FreeRTOS通过配置configTICK_RATE_HZ来获得想要的系统频率,MCU利用configTICK_RATE_HZ去初始化滴答定时器(也可能是其他的),然后获得一个FreeRTOS想要的频率中断服务函数,在中断服务函数调用xPortSysTickHandler来启动FreeRTOS
接下来我以STM32+keil为例移植,学会一个其他的通吃,不管换一个MCU或者环境
1.找一个简单的工程,例如跑马灯工程,将源码拷贝到新创建的FreeRTOS文件夹中(通用)
2.删掉文件夹中除keil、MemMang和RVDS其余的文件夹(通用)
3.向工程分组中添加文件(通用)
备注:
(1) port.c 是 RVDS 文件夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择 ARM_CM3中的 port.c 文件
(2)heap_4.c 是 MemMang 文件夹中的,跟内存管理相关。在五个中选择一个合适的heap
4.添加相应的头文件路径(通用)
5.拷贝对应MCU例程的FreeRTOSConfig.h文件(通用)
FreeRTOSConfig.h用于裁剪、配置操作系统
FreeRTOSConfig.h如下
6. 修改SYSTEM文件(STM32特有)
a.修改sys.h文件
b.修改usart.c文件
i 添加 FreeRTOS.h 头文件
默认添加UCOS中的includes.h
ii USART1 的中断服务函数,删除OSIntEnter()和 OSIntExit()
在使用 UCOS 的时候进出中断的时候需要添加,FreeRTOS不需要
c.修改delay.c文件
i SysTick_Handler()函数调用FreeRTOS 的 API 函数 xPortSysTickHandler()
此函数是滴答定时器的中断服务函数。
FreeRTOS 的系统时钟就是由滴答定时器提供的,根据 FreeRTOS 的系统时钟节拍configTICK_RATE_HZ设置好滴答定
时器的周期,这样就会周期触发滴答定时器中断
ii 修改delay_init()函数初始化滴答定时器和延时函数
iii 修改延时函数delay_us/delay_xms/delay_ms
delay_ms会引起任务调度,因为调用了系统延时
7.屏蔽stm32f10x_it.c中的三个中断(STM32特有)
8.编译后无错误,移植完成
9.验证
在main.c创建任务并观察现象