文章目录
概要
本文章主要根据FreeRTOS-Kernel 版本V10.5.0来分析TASK Stack;
提示:FreeRTOS-Kernel V10.5.0, 需保存好编译firmware时所生成的.map文件
整体Analysis流程
1. Task句柄申明:
static TaskHandle_t TaskHandle;
2. 获取Task句柄:
TaskHandle = xTaskGetCurrentTaskHandle();
printf(“xTaskGetCurrentTaskHandle:0x%08X\r\n”, TaskHandle);
3. PRINT输出STACK实现函数:
void printTaskStackInfo(TaskHandle_t taskHandle, uint32_t stackSize)
{
StackType_t *pStackStart;
StackType_t *pStackEnd;
StackType_t *pxStack;
uint32_t size;
TaskStatus_t pTaskStatus;
vTaskGetInfo(taskHandle, &pTaskStatus, pdTRUE, eInvalid);
pStackStart = pTaskStatus.pxStackBase;
pStackEnd = (uint32_t)pStackStart + stackSize;
size = stackSize/4;
printf("Task Stack ,Start: 0x%08x, End:0x%08x\n", pStackStart, pStackEnd);
printf("-----------------------------------\n");
pxStack = pStackStart;
for (uint32_t i=0; i<size; i++) {
printf("0x%08x: 0x%08x\n", (unsigned int)pxStack, (unsigned int)*pxStack);
pxStack++;
}
printf("-----------------------------------\n");
printf("\r\n\r\n");
}
4. DEBUG调用:
#define TASKs_LIST_LOG_SIZE 512
char CPU_RunInfo[TASKs_LIST_LOG_SIZE] = {0}; //保存任务运行时间信息
vTaskList(CPU_RunInfo); //获取任务运行时间信息
printf(“TaskName State Prio LeftStack TaskSeqNum\r\n”);
printf(“-----------------------------------------------------------\r\n”);
printf(“%s”, CPU_RunInfo);
vTaskDelay(100);
printf(“-----------------------------------------------------------\r\n”);
vTaskDelay(100);
printTaskStackInfo(TaskHandle, 0x2400);
5. STACK Details PRINTF 分析:
0x08038374: 0xa1000000
0x08038378: 0x41d616ff
0x0803837c: 0xffefffff
0x08038380: 0xbf7feffd
0x08038384: 0xdfffffdf
0x08038388: 0xfdfefddf
0x0803838c: 0xfffeffff
0x08038390: 0xfbffffbf
0x08038394: 0xf7f7ff7d
0x08038398: 0xffffff6f
0x0803839c: 0x3d26b50b
0x080383a0: 0x41c22cbb
0x080383a4: 0x41a00000
0x080383a8: 0x3fce5604
0x080383ac: 0x3f52f1ac
0x080383b0: 0x3ffae148
0x080383b4: 0x3b9aca00
0x080383b8: 0x00000000
0x080383bc: 0x10060c09
0x080383c0: 0x00000000
0x080383c4: 0x00000000
0x080383c8: 0x0803254c
0x080383cc: 0x08004da0
0x080383d0: 0x00000001
0x080383d4: 0x08004d9c
0x080383d8: 0x100978c9
0x080383dc: 0x1005ff65
0x080383e0: 0xffffffff
0x080383e4: 0x00000000
0x080383e8: 0xa5a5a5a5
0x080383ec: 0x00000007
0x080383f0: 0xa5a5a5a5
0x080383f4: 0x00000000
0x080383f8: 0xa5a5a5a5
0x080383fc: 0xa5a5a5a5
0x08038400: 0xa5a5a5a5
0x08038404: 0xa5a5a5a5
0x08038408: 0xa5a5a5a5
0x0803840c: 0xa5a5a5a5
0x08038410: 0xa5a5a5a5
0x08038414: 0xa5a5a5a5
0x08038418: 0xa5a5a5a5
0x0803841c: 0xa5a5a5a5
0x08038420: 0xa5a5a5a5
0x08038424: 0x1005e5ab
0x08038428: 0xa5a5a5a5
0x0803842c: 0xa5a5a5a5
6. 结合map文件,FLASH相关取址进行分析:
0x1005e61e prvCopyDataFromQueue.lto_priv.0
0x1005e64a prvAddNewTaskToReadyList.lto_priv.0
0x1005e750 vTaskSwitchContext
0x1005e7f8 xTaskCheckForTimeOut
0x1005e84c prvResetNextTaskUnblockTime.lto_priv.0
0x1005e9d4 xTaskResumeAll
0x1005eaf8 prvIdleTask.lto_priv.0
0x1005ed90 xTaskRemoveFromEventList
0x1005ee50 prvUnlockQueue.lto_priv.0
0x1005eed4 vTaskRemoveFromUnorderedEventList
0x1005ef70 xTaskGetSchedulerState
0x1005ef90 prvAddCurrentTaskToDelayedList.lto_priv.0
0x1005f01c vTaskDelay
0x1005f054 xQueueReceive
0x1005f16c xQueueSemaphoreTake## 技术名词解释
小结
-
当FreeRTOS系统TASK运行出现异常时,参考这个method去debug TASK stack, 需结合.map
文件,可定位到FLASH取址的大概位置,起到协助分析问题的作用。 -
嗯,也还有其他debug的方法,比如:Jlink仿真等
623

被折叠的 条评论
为什么被折叠?



