FreeRTOS错误的上下文切换恢复

时间:2017-03-20 12:09:09

标签: stm32 freertos

我使用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寄存器中的值(用于地址计数)与抢占前的值不同 这导致我的每个局部变量都不相同的情况,因为它们被错误地从数据存储器中取出。
如果是堆栈溢出问题,我该如何调试呢?

2 个答案:

答案 0 :(得分:1)

Cortex-M上的大多数问题都归结为不正确的中断优先级分配和堆栈溢出,因此FreeRTOS的后续版本会为这两个错误提供大量陷阱,以便在发生错误时立即通知您 - 但您必须打开能够捕获这些常见错误,如下所示:

您是否定义了configASSERT(),以及您使用的是哪个版本的FreeRTOS?版本越晚,configASSERT()就会越有用。

您是否将configCHECK_FOR_STACK_OVERFLOW设置为2并定义了堆栈溢出挂钩?

答案 1 :(得分:0)

我找到了问题的根源。在blockingFunction()里面有明确填充的缓冲区。缓冲区太小,覆盖了我的任务TCB。