移植FreeRTOS比较简单。仅需要注意以下几点:
1.系统核心文件提取。
2.Keil工程目录搭建。
3.FreeRTOS配置文件修改。
4.单片机核心中断函数定义和中断函数冲突处理,Systick中断函数代码移植。
5.Main函数文件处理。
系统核心文件提取:
① FreeRTOS文件夹下的source目录下,所有的.c文件全部都要。
② Include文件夹全部都要。
③ Portable目录下的RVDS和MemMang文件夹都要。分别是进程切换底层实现和内存管理相关文件。
Keil工程目录搭建:
① 分为三个文件夹目录:
② Include 文件夹,本质上就是从源码中直接复制过来的。
③ Port文件夹,主要存放RVDS和MemMang文件夹。
④ Src文件夹,存放source目录下,所有的.c文件。
⑤ 工程中,创建src分类,主要存放.c文件。Port分类,主要存放MemMang文件夹中的heap4和RVDS文件夹中对应的core,(我这边用的是STM32L475,所以选择ARM_CM4F文件夹下的port.c文件加入。)
⑥ 头文件索引路径的话,主要是include文件夹路径;port/RVDS文件夹下面对应的core路径(我用的是ARM_CM4F文件夹下的.h)
FreeRTOS配置文件修改:
① FreeRTOSConfig.h 系统配置文件,主要用于裁剪FreeRTOS内核功能。
② 从源码中的demo文件夹下,找个单片机STM32的例程中复制过来,肯定有不兼容的部分,可以按照实际情况修改。
③ 先修改包含的头文件,我是从STM32F103那边复制过来的。但是我的是L475所以包含的头文件要改成L4的。对应的log串口相关的,修改为自己定义的log串口头文件名称。
④ 剩下的就是对RTOS中的一些功能进行裁剪的操作,例如是否使用信号量,消息队列,软件定时器等,还有就是默认任务栈空间大小,优先级相关的等,以及一些功能函数是否启用等,与动态内存分配相关的,堆空间的大小。
⑤ 编译不报错说明修改的都没啥问题,一般是直接从demo下的例程复制过来几乎能直接使用。
单片机核心中断函数定义冲突处理:
① SVC和PendSV中断定义已经在配置文件中定义过了,所以xxxit.c文件中的可以注释掉。
② Systick中断函数需要重新实现,一般也是从demo例程中直接复制过来,与基本上可以直接用。但是还是需要仔细移植。把平台相关性的代码移植正确即可。
Main函数文件处理
① 添加FreeRTOS.h和task.h的头文件包含。
② 删除所有与裸机外设相关的驱动函数。
③ 直接复制裸机中的时钟配置代码HAL_Init和SystemClock_Config函数。进行一开始的时钟配置。
④ 初始化led和log串口相关驱动。
⑤ 然后就可以通过xTaskCreate创建第一个线程,再调用vTaskStartScheduler函数启动操作系统任务调度,就完成了FreeRTOS的移植和启动了。
⑥ 接下来就可以在第一个线程中AppTaskCreate,进行其他的应用线程的创建了(还是使用xTaskCreate这个函数创建)。