stm32程序里定义的数组是存到Flash里还是SRAM
STM32被设置为从内部FLASH启动,即BOOT0给的低电平。然后程序是不是就下载到flash里了?然后我在程序里定义一个全局变量的数组,不赋初值,中断里给数组赋值。再...
STM32被设置为从内部FLASH启动,即BOOT0给的低电平。然后程序是不是就下载到flash里了?然后我在程序里定义一个全局变量的数组,不赋初值,中断里给数组赋值。再下电之后程序里的数组的有值吗?
展开
1个回答
展开全部
ARM芯片复位后都是从0x0000 0004地址启动。STM32会转入一段自己的bootloader。然后根据BOOT引脚,选择启动位置。如果是FLASH则跳转到0x0800 0000(不知道地址有没记错)执行。
程序一般指定FLASH的地址是链接地址(ARM使用绝对地址,运行和链接地址必须一致)。
数组分2类,用const标示的常量数组,普通数组。
const数组一般位于FLASH中的一个特定位置。
普通数组位于堆,一般是RAM的低地址往上生长。
数组的初值存在FLASH中,即RODATA段,开机时通过一段程序(通常是汇编) ,拷贝到地址的RAM中。
如果数组没给初值,会通过bss段全部清成0。
如果是用KEIL、IAR等不用关心这些。因为这些设置建立工程时候都已经做好了(链接地址&启动文件)。
从初学者使用的角度建议,数组要赋初值,即使是0。
程序一般指定FLASH的地址是链接地址(ARM使用绝对地址,运行和链接地址必须一致)。
数组分2类,用const标示的常量数组,普通数组。
const数组一般位于FLASH中的一个特定位置。
普通数组位于堆,一般是RAM的低地址往上生长。
数组的初值存在FLASH中,即RODATA段,开机时通过一段程序(通常是汇编) ,拷贝到地址的RAM中。
如果数组没给初值,会通过bss段全部清成0。
如果是用KEIL、IAR等不用关心这些。因为这些设置建立工程时候都已经做好了(链接地址&启动文件)。
从初学者使用的角度建议,数组要赋初值,即使是0。
追问
OK!那如果我用的一款stm32的芯片内部有20KB的内存,我在程序里定义一个30KB的数组,那程序能执行吗?
追答
如果是普通数组肯定不行。
如果只是常量你可以通过const修饰,放在ROM区
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询