《FreeRTOS初步移植出现的xTaskGetSchedulerState()函数报错,taskSCHEDULER_NOT_STARTED没有定义的问题》

目录

1.taskSCHEDULER_NOT_STARTED没有定义的问题

才发现需要添加//#include "task.h"    的头函数,

 2.xTaskGetSchedulerState()函数报错问题

即在FreeRTOS.h中将下图中INCLUDE_xTaskGetSchedulerState的0,改为1


1.taskSCHEDULER_NOT_STARTED没有定义的问题

这个问题的起因是在移植FreeRTOS后出现下列error:

才发现需要添加//#include "task.h"    的头函数,

注意此头函数不能添加在#include "FreeRTOS.h"头函数之前,否者也会发生报错,下图是报错警告

 2.xTaskGetSchedulerState()函数报错问题

问题图片如下:

在解决 STM32F103ZET6 FreeRTOS 移植过程中 `portmacro.h` 文件的报错问题时,可以从以下几个方面入手: ### 1. 检查宏定义是否正确 确保 `INCLUDE_xTaskGetSchedulerState` 和 `INCLUDE_xTaskGetCurrentTaskHandle` 宏已正确定义。如果这些宏未被定义,则可能导致编译器无法识别某些函数调用或变量声明。 以下是正确的宏定义方式[^4]: ```c #ifndef INCLUDE_xTaskGetSchedulerState #define INCLUDE_xTaskGetSchedulerState 1 /* 修改日期:2021.9.25 */ #endif #ifndef INCLUDE_xTaskGetCurrentTaskHandle #define INCLUDE_xTaskGetCurrentTaskHandle 1 /* 修改日期:2021.9.25 */ #endif ``` 通过上述代码片段可以确认这两个宏已被设置为 `1`,从而启用对应的功能支持。 --- ### 2. 配置 SysTick 中断处理程序 在移植 FreeRTOS 的过程中,通常需要调整 `stm32f10xx_it.c` 文件中的中断服务例程 (ISR),特别是 `SysTick_Handler()` 函数。如果该部分未正确配置,可能会引发与时间管理相关的错误。 建议按照以下方法操作: - **注释掉原始实现**:将默认的 `SysTick_Handler()` 实现注释掉[^1]。 - **替换为 FreeRTOS 提供的标准版本**:使用 FreeRTOS 自带的时间管理机制替代原有的实现。 具体代码如下所示: ```c // 原始实现需注释掉 /* void SysTick_Handler(void) { HAL_IncTick(); } */ // 替换为 FreeRTOS 版本 #include "FreeRTOS.h" #include "task.h" void SysTick_Handler(void) { if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { xPortSysTickHandler(); // 调用 FreeRTOS 时间管理函数 } } ``` 此更改可确保 FreeRTOS 正确接管系统滴答定时器功能。 --- ### 3. 添加延迟函数并声明至头文件 为了防止因任务切换引起的潜在冲突,在编写自定义延迟函数时需要注意其设计逻辑。例如,`delay_xms()` 可用于提供精确到毫秒级的阻塞延时而不触发任务调度。 以下是推荐的实现方式[^2][^3]: ```c // 头文件中声明 extern void delay_xms(uint32_t nms); // C 文件中定义 void delay_xms(uint32_t nms) { uint32_t i; for (i = 0; i < nms; i++) { delay_us(1000); // 使用微秒级延时完成总延时 } } // 微秒级延时函数(假设已存在) void delay_us(uint32_t us); ``` 注意:此类低级别硬件访问函数应谨慎使用,尤其是在多任务环境下可能影响实时性能。 --- ### 4. 更新 main.c 文件以适配 FreeRTOS 初始化流程 最后一步涉及修改项目入口点 (`main.c`) 来适应 FreeRTOS 架构需求。这包括但不限于创建初始任务、启动调度器以及初始化外设资源等步骤。 典型结构化代码示例如下: ```c int main(void) { HAL_Init(); // 初始化 HAL 库 SystemClock_Config(); // 配置系统时钟 // 创建任务... xTaskCreate(TaskFunction, "TaskName", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); vTaskStartScheduler(); // 启动 FreeRTOS 调度器 while (1) {} // 如果到达此处则表明调度失败 } ``` 在此基础上还需验证所有依赖库路径是否正确加载,并重新构建工程环境直至无误为止。 --- ### 总结 针对 STM32F103ZET6 平台上的 FreeRTOS 移植工作,重点在于合理分配软硬件资源的同时兼顾兼容性和稳定性。通过对关键组件逐一排查优化即可有效规避诸如 `portmacro.h` 类型的常见问题发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值