本帖最后由 小北爱编程 于 2022-4-27 15:33 编辑
#申请原创#
FreeRTOS移植步骤 1、源码获取 去官网下载FreeRTOS最新的版本,官网地址:www.freertos.org 2、准备基础工程 准备一个基础工程,用于FreeRTOS移植。 3、向工程中添加相应文件文件 在基础工程中新建一个名为 FreeRTOS 的文件夹, 如图 1 所示: 图 1 新建 FreeRTOS 文件夹 将FreeRTOSv10.3.1\FreeRTOS\Source中的文件添加到该文件夹中,如图2所示: 图 2 添加 FreeRTOS 源码 我们只需要留下portable 文件夹下的keil、 MemMang 和 RVDS这三个文件夹, 其他的都可以删除掉(此处针对的为KEIL移植)。 4、向工程分组中添加相应的文件 打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组中添加文件,如图 3 所示: 图 3 添加文件 分组 FreeRTOS_CORE 中的文件在新建的FreeRTOS文件下就能看到,添加过程不再细说。 FreeRTOS_PORTABLE 分组中的 port.c 和 heap_4.c的来源则是本操作系统系统的移植关键。port.c 是RVDS 文件夹下的文件,根据所移植的CPU的内核选择相对应的port.c文件,RVDS文件夹内容如图4所示: 图4 RVDS文件夹内容 可以看到不同的内核对应不同的文件,选择自己所需要的内核进行添加port.c文件。 heap_4.c 是 MemMang 文件夹中的,前面说了 MemMang 是跟内存管理相关的,里面有 5 个 c 文件: heap_1.c、 heap_2.c、 heap_3.c、 heap_4.c 和 heap_5.c。 这5 个 c 文件是五种不同的内存管理方法,此处选择heap_4.c文件。 5、添加相应的头文件路径 添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径,具体过程此处不再细说。 6、添加FreeRTOSConfig.h文件 此时编译工程会显示FreeRTOSConfig.h找不到,需要自己手动添加该文件,此文件可以在FreeRTOS文件源码中的Demo中寻找,查看其官网的移植例程,在里面获取FreeRTOSConfig.h文件,将其复制到自己的工程中,具体存放路径看自己个人习惯。 7、设置系统节拍 将 at32f403a_407_int.c 中的 PendSV_Handler()、SVC_Handler()和 Systick_Handler()这三个函数屏蔽掉。 将FreeRTOSConfig.h中的#define xPortSysTickHandler SysTickHandler宏定义屏蔽掉,如图5所示: 图5 系统节拍定时器我在此处使用的为定时器2,重写定时器2中断函数,代码如下: void TMR2_GLOBAL_IRQHandler(void) { if(tmr_flag_get(TMR2, TMR_OVF_FLAG) != RESET) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行 { xPortSysTickHandler(); } tmr_flag_clear(TMR2, TMR_OVF_FLAG); } } 此时系统节拍中断函数已设置完成,此时还需要进行定时器的初始化,初始化节拍时间则根据FreeRTOSConfig.h文件中的宏定义获得, #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms。将定时器2中断周期初始化为1ms,此时操作系统的移植基本完成,编译根据错误信息进行对应的修改,直至无错误则移植完成。 8、可能的编译错误如下: 可能会显示一些以Hook 结尾的函数未定义,这些函数有个共同的名称: 钩子函数,这是因为在 FreeRTOSConfig.h中开启了这些钩子函数,但是却没有定义这些钩子函数而导致的,我们在 FreeRTOSConfig.h 中关闭这些钩子函数就行了,关闭的方法很简单, 将相应的宏定义改为 0 即 可 , 这 里 将 宏 configUSE_IDLE_HOOK 、 configUSE_TICK_HOOK 、configUSE_MALLOC_FAILED_HOOK 和configCHECK_FOR_STACK_OVERFLOW 定义为 0。 9、FreeRTOSConfig.h文件对FreeRTOS的配置 系统各配置项信息请查看FreeRTOSConfig.h文件。
|