armink / CmBacktrace

Advanced fault backtrace library for ARM Cortex-M series MCU | ARM Cortex-M 系列 MCU 错误追踪库
MIT License
1.58k stars 640 forks source link

针对FreeRTOS10没有vTaskStackAddr,vTaskStackSize,vTaskName这三个函数,以及任务控制块无uxSizeOfStack成员的问题。 #81

Open sdfvsdcw opened 2 months ago

sdfvsdcw commented 2 months ago

前情提要:
chatgpt:在 FreeRTOS v10 版本中,确实移除了 vTaskStackSize 函数,这是因为不是所有平台都能支持直接获取任务的栈大小。在这个版本及以后的版本中,FreeRTOS 推荐的方式是在创建任务时自行记录栈大小,以便在需要时能够查询这些信息。 chatgpt太谨慎了,不敢让我改内核。推荐我新建个函数,每次创建任务时记录一下该任务的栈大小。但是这个删除任务时,不好同步。 我不接受gpt的建议,于是我参照v9版本,做出以下修改。pxCurrentTCB是内核自用的,是全局变量,指向当前正在运行的任务控制块,我们也可以用。如果它私有化了,那就在task.c里用 ---------------1在task.c中加了以下几个函数:-------------------、

uint32_t * vTaskStackAddr()
{
    return pxCurrentTCB->pxStack;
}
 uint32_t vTaskStackSize()
{
    #if ( portSTACK_GROWTH > 0 )

    return (pxNewTCB->pxEndOfStack - pxNewTCB->pxStack + 1);

    #else /* ( portSTACK_GROWTH > 0 )*/

   return pxCurrentTCB->uxSizeOfStack;

    #endif /* ( portSTACK_GROWTH > 0 )*/
}

char * vTaskName()
{
    return pxCurrentTCB->pcTaskName;
}

----------------------2.修改task_create函数及TCB_t------------------- a.找到TCB_t结构体定义添加一个新成员 UBaseType_t uxSizeOfStack; b.在 xTaskCreate函数的合适的位置加上 pxNewTCB->uxSizeOfStack=usStackDepth; 就OK了 但是:这样勉强能用。如果删除了这个任务,这个栈深度成员怎么处理?希望有大佬能进一步优化 chatgpt给的注意事项: 内存使用:确保数组或记录结构有足够的空间来保存所有任务的信息。 线程安全:如果你的系统在多个任务中创建新任务,确保相应函数的操作是线程安全的。 资源管理:如果任务被删除,相应的记录也应当从数组或链表中移除。