首先,要明确,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文件夹中(通用)

Freemodbus 移植 485_系统时钟

2.删掉文件夹中除keil、MemMang和RVDS其余的文件夹(通用)

Freemodbus 移植 485_函数调用_02

3.向工程分组中添加文件(通用)

Freemodbus 移植 485_Freemodbus 移植 485_03

Freemodbus 移植 485_函数调用_04

备注:

(1) port.c 是 RVDS 文件夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择 ARM_CM3中的 port.c 文件

(2)heap_4.c 是 MemMang 文件夹中的,跟内存管理相关。在五个中选择一个合适的heap

4.添加相应的头文件路径(通用)

Freemodbus 移植 485_函数调用_05

5.拷贝对应MCU例程的FreeRTOSConfig.h文件(通用)

Freemodbus 移植 485_Freemodbus 移植 485_06

FreeRTOSConfig.h用于裁剪、配置操作系统

FreeRTOSConfig.h如下

Freemodbus 移植 485_函数调用_07

6. 修改SYSTEM文件(STM32特有)

a.修改sys.h文件

Freemodbus 移植 485_系统时钟_08

b.修改usart.c文件

添加 FreeRTOS.h 头文件

Freemodbus 移植 485_系统时钟_09

默认添加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特有)

Freemodbus 移植 485_Freemodbus 移植 485_10

8.编译后无错误,移植完成

9.验证

在main.c创建任务并观察现象