股票

STM32 内存、栈、全局变量、局部变量

这两天调试程序升级,在flash读写函数中,总是造成MCU跑死,一步步定位,发现在下面的一段代码中发生了错误:

  1. // write flash
  2.     for(ui_jj=0, ul_idx=0; ui_jj<(IFLASH_PAGE_SIZE/4); ++ui_jj)
  3.     {
  4.         ul_page_buffer[ui_jj] = pData[ul_idx++]<<24;
  5.         ul_page_buffer[ui_jj] += (pData[ul_idx++]<<16);
  6.         ul_page_buffer[ui_jj] += (pData[ul_idx++]<<8);
  7.         ul_page_buffer[ui_jj] += pData[ul_idx++];
  8.     }

奇怪的是,这段程序本身的执行没问题,但是它把另一个变量的值给改掉了!然后内存溢出,MCU死机。

由于用的芯片是STM32F103RCT6,属于大容量,IFLASH_PAGE_SIZE值为2048,对应的ul_page_buffer[ui_jj]的数组大小就是2048个字节,但是,在这里,由于ul_page_buffer[]属于局部变量,查看STM的资料,局部变量保存在栈中,默认最大的栈空间和启动函数有关,在启动代码 startup_stm32f10x_hd.s中查到:

  1. ; Amount of memory (in bytes) allocated for Stack
  2. ; Tailor this value to your application needs
  3. ; <h> Stack Configuration
  4. ;   <o> Stack Size (in Bytes) <0x00xFFFFFFFF:8>
  5. ; </h>
  6. Stack_Size      EQU     0x00000400
  7.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  8. Stack_Mem       SPACE   Stack_Size
  9. __initial_sp
  10. ; <h> Heap Configuration
  11. ;   <o>  Heap Size (in Bytes) <0x00xFFFFFFFF:8>
  12. ; </h>
  13. Heap_Size       EQU     0x00000200
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  15. __heap_base
  16. Heap_Mem        SPACE   Heap_Size
  17. __heap_limit
  18.                 PRESERVE8
  19.                 THUMB

栈大小只有0x400,1024字节,这段代码中,数组执行到后面已经溢出了,直接改变了内存中别的数据的值。

修改方法很简单,把栈空间变大,0x400变为0x800,0x200变为0x400,这样一切都正常了。

打赏
原文链接:,转发请注明来源!

发表评论