这两天调试程序升级,在flash读写函数中,总是造成MCU跑死,一步步定位,发现在下面的一段代码中发生了错误:
- // write flash
- for(ui_jj=0, ul_idx=0; ui_jj<(IFLASH_PAGE_SIZE/4); ++ui_jj)
- {
- ul_page_buffer[ui_jj] = pData[ul_idx++]<<24;
- ul_page_buffer[ui_jj] += (pData[ul_idx++]<<16);
- ul_page_buffer[ui_jj] += (pData[ul_idx++]<<8);
- ul_page_buffer[ui_jj] += pData[ul_idx++];
- }
奇怪的是,这段程序本身的执行没问题,但是它把另一个变量的值给改掉了!然后内存溢出,MCU死机。
由于用的芯片是STM32F103RCT6,属于大容量,IFLASH_PAGE_SIZE值为2048,对应的ul_page_buffer[ui_jj]的数组大小就是2048个字节,但是,在这里,由于ul_page_buffer[]属于局部变量,查看STM的资料,局部变量保存在栈中,默认最大的栈空间和启动函数有关,在启动代码 startup_stm32f10x_hd.s中查到:
- ; Amount of memory (in bytes) allocated for Stack
- ; Tailor this value to your application needs
- ; <h> Stack Configuration
- ; <o> Stack Size (in Bytes) <0x0–0xFFFFFFFF:8>
- ; </h>
- Stack_Size EQU 0x00000400
- AREA STACK, NOINIT, READWRITE, ALIGN=3
- Stack_Mem SPACE Stack_Size
- __initial_sp
- ; <h> Heap Configuration
- ; <o> Heap Size (in Bytes) <0x0–0xFFFFFFFF:8>
- ; </h>
- Heap_Size EQU 0x00000200
- AREA HEAP, NOINIT, READWRITE, ALIGN=3
- __heap_base
- Heap_Mem SPACE Heap_Size
- __heap_limit
- PRESERVE8
- THUMB
栈大小只有0x400,1024字节,这段代码中,数组执行到后面已经溢出了,直接改变了内存中别的数据的值。
修改方法很简单,把栈空间变大,0x400变为0x800,0x200变为0x400,这样一切都正常了。