目录

第一步

下载FreeRTOS

第二步

新建文件夹,复制文件

​编辑

复制FreeRTOSConfig.h文件

根据型号选择文件

添加路径

最终效果

添加头文件路径

问题汇总及解决办法

问题1

解决办法

问题2

解决办法


第一步

下载FreeRTOS

https://sourceforge.net/projects/freertos/files/FreeRTOS/下载FreeRTOS的V9.0.0版本

第二步

新建文件夹,复制文件

复制FreeRTOSConfig.h文件

选择移植的单片机相同的系列和内核复制

根据型号选择文件

添加路径

最终效果

添加头文件路径

问题汇总及解决办法

完成后编译工程,可能会出现以下问题

问题1

..\FreeRTOS\port\RVDS\ARM_CM0\port.c(345): error:  #20: identifier "SystemCoreClock" is undefined

解决办法

/* 不论什么编译器,都声明这个变量 */
#include <stdint.h>
extern uint32_t SystemCoreClock;

/* 如果一定要区分编译器,Keil 使用 __CC_ARM 或 __ARMCC_VERSION */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__ARMCC_VERSION)
    /* 这里的声明在 IAR 和 Keil 下都会生效 */
#endif

问题2

CTW\CTW.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
CTW\CTW.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
CTW\CTW.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.

解决办法

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
/* 1. 堆栈溢出钩子函数 */
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
    /* 当某个任务的堆栈超过预设大小时,会进入这里 */
    /* 调试时可以查看 pcTaskName 确认是哪个任务溢出了 */
    __disable_irq();
    while(1);
}

/* 2. 滴答定时器钩子函数 */
void vApplicationTickHook(void)
{
    /* 每个 Tick 中断都会调用一次,如果不需要功能,可以留空 */
}

/* 3. 内存申请失败钩子函数 */
void vApplicationMallocFailedHook(void)
{
    /* 当 pvPortMalloc 申请不到内存(堆内存不足)时,会进入这里 */
    __disable_irq();
    while(1);
}

移植结束,编译没有报错,写一个点灯程序程序,功能正常。

HAL_GPIO_TogglePin(GPIOA, DBG_Pin);
HAL_Delay(100);

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐