我使用GCC 5.3 2016q1编译STM32微控制器。 在主要的开头我放置了一个小例程来填充图案的堆栈。后来我搜索仍保留此模式的最高地址,以了解堆栈使用情况,您肯定知道这一点。这是我的惯例:
uint32_t* Stack_ptr = 0;
uint32_t Stack_bot;
uint32_t n = 0;
asm volatile ("str sp, [%0]" :: "r" (&Stack_ptr));
Stack_bot = (uint32_t)(&_estack - &_Min_Stack_Size);
//*
n = 0;
while ((uint32_t)(Stack_ptr) > Stack_bot)
{
Stack_ptr--;
n++;
*Stack_ptr = 0xAA55A55A;
} // */
之后我初始化硬件,也是UART并打印出Stack_ptr,Stack_bot和n的值,然后堆栈内容。 结果为0x20007FD8 0x20007C00 0 Stack_bot是期望值,因为我在32k RAM中有0x400字节,从0x20000000开始。但是我希望Stack_ptr在循环结束后为0x20008000并且在某种程度上低于0x400。堆栈内容也不显示0xAA55A55A的条目。这意味着不执行循环。 我只能设法通过创建一个小函数来执行它,该函数保存上述例程并禁用此函数的优化。 谁知道为什么会这样?关于它的最奇怪的事情是,我可以发誓它几天前工作。我在堆栈转储中看到了很多0xAA55A55A。
非常感谢
马丁
答案 0 :(得分:1)
可能问题在于汇编程序功能,在我的代码中我使用了这个:
_heap_start
它将在SP
和当前TypeError: create_crawler() takes exactly 2 arguments (1 given)
之间填充内存。