我使用FreeRTOS和STM32F407。我有错误的上下文切换恢复问题。代码在任务代码中如下所示:
char *ptr = pvPortMalloc(sizeof(char) * size);
memcpy(ptr, buf, size);
...
log("Before:");
logItoa((int)ptr);
blockingFunction(); // Here preemption will occur
log("After:");
logItoa((int)ptr);
blockingFunction()不使用ptr
。
当我调试时,我可以看到,ptr
指向的地址与指令一起存储:
STR R0, [R7, #24]
所以我检查数据存储器中地址(R7 + 24)(^ 1)下的值,看是否成功保存了动态分配数据的地址。
在上下文恢复之后,我检查变量ptr
并看到它没有指向我新分配的数据,所以我检查地址下的值(^ 1)并看到值保持不变,但R7寄存器中的值(用于地址计数)与抢占前的值不同
这导致我的每个局部变量都不相同的情况,因为它们被错误地从数据存储器中取出。
如果是堆栈溢出问题,我该如何调试呢?
答案 0 :(得分:1)
Cortex-M上的大多数问题都归结为不正确的中断优先级分配和堆栈溢出,因此FreeRTOS的后续版本会为这两个错误提供大量陷阱,以便在发生错误时立即通知您 - 但您必须打开能够捕获这些常见错误,如下所示:
您是否定义了configASSERT(),以及您使用的是哪个版本的FreeRTOS?版本越晚,configASSERT()就会越有用。
您是否将configCHECK_FOR_STACK_OVERFLOW设置为2并定义了堆栈溢出挂钩?
答案 1 :(得分:0)
我找到了问题的根源。在blockingFunction()
里面有明确填充的缓冲区。缓冲区太小,覆盖了我的任务TCB。