? ? ? ? 监控栈有没有溢出,监控栈顶地址有没有超出边界是一种很好的方式,那么程序中如何获取栈顶地址呢,看下图:
uint32_t getStackTop()
{
uint32_t stackPointer;
__asm volatile (
"mov %0, sp\n"
: "=r"(stackPointer)
);
return stackPointer;
}
? ? ? ? 有了栈顶地址再加上栈底地址(__initial_sp)和栈的大小就可以判断出当前栈有没有溢出了。
? ? ? ? 值得注意的是:如果是嵌入了操作系统的,那么如果是在某个任务中调用此函数的话那么获取到的是当前任务的任务栈顶地址,此时就要结合任务栈的栈底地址和栈大小来判断任务栈有没有溢出了;当然对于很多嵌入式操作系统来说都会提供一个获取任务最高水位线的函数,如对于freertos是:uxTaskGetStackHighWaterMark()。