为什么这个循环没有被执行?

时间:2018-01-25 10:55:14

标签: gcc optimization stm32

我使用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。

非常感谢

马丁

1 个答案:

答案 0 :(得分:1)

可能问题在于汇编程序功能,在我的代码中我使用了这个:

_heap_start

它将在SP和当前TypeError: create_crawler() takes exactly 2 arguments (1 given)之间填充内存。