2201_76126970 2025-01-10 02:20 采纳率: 0%
浏览 297

FreeRTOS系统运行时卡死

在用STM32F103C8T6开发FreeRTOS时,程序一跑起来就在

if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )和

while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
之间来回跳转,debug也收不到任何数据,有没有什么较好的解决办法?

  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-10 02:21
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    问题分析: 从你描述的情况来看,在两个条件判断之间不断来回跳转,并且无法进行debug,可能是由于任务调度出现问题引起的。这种情况可能是由于任务优先级设置不当或者任务阻塞的原因导致的。 解决方法:
    1. 检查任务优先级设置:确保所有任务的优先级设置是正确的,避免出现优先级反转等问题。可以使用FreeRTOS提供的函数vTaskPrioritySet()来动态改变任务的优先级。
    2. 检查任务阻塞原因:当任务在等待某种事件发生时可能会发生阻塞,造成任务调度不正常。可以使用FreeRTOS提供的函数vTaskDelay()、vTaskSuspend()等来控制任务的阻塞。
    3. 检查内存相关问题:内存相关问题也可能导致任务调度不正常,可以使用FreeRTOS提供的函数uxTaskGetStackHighWaterMark()来检查任务堆栈的使用情况。 示例代码:
    /* 设置任务优先级 */
    vTaskPrioritySet(xTaskHandle, uxNewPriority);
    /* 使任务延时 */
    vTaskDelay(pdMS_TO_TICKS(1000));
    /* 挂起任务 */
    vTaskSuspend(xTaskHandle);
    /* 获取任务堆栈使用情况 */
    uxHighWaterMark = uxTaskGetStackHighWaterMark(xTaskHandle);
    

    通过以上方法来排查并解决问题,可以帮助你解决STM32F103C8T6开发FreeRTOS时出现的任务调度问题。如果问题仍然存在,可能需要更详细的调试信息来定位问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月10日
  • 创建了问题 1月10日