Simplicity Studio编译EFM32 Release版本“FLASH memory overflowed”问题解决方法

近期,在开发EFM32相关项目过程中,发现Debug版本Flash空间并没有超,甚至还预留有相当一部分空间,但在切换到Release版本编译时,却发现编译器报错“FLASH memory overflowed”,按说,切换到Release版本去掉调试信息,并进行代码优化后,编译的固件空间相比Debug版本应该更小才对。

经过探索,发现问题出现在Linker Scripts,在Release版本的Settings中,Memory Layout不可设置,而是由系统自动拷贝,并根据实际情况作必要的修改的。如图1。

经系统拷贝的Linker Scripts放在工程目录下的xxx-Release文件夹下,查看*.ld文件,发现报错的地方:

  /* Check if FLASH usage exceeds FLASH size */
  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")

 这里有一个断言,判断芯片Flash空间大小是否大于编译生成的代码末端(__etext)和数据段长度(SIZEOF(.data)),但这个地方代码末端是以芯片Flash的起始地址(EFM32的为0x08000000)的,不是0x00000000,而LENGTH(FLASH)为0x80000(我用的512KB Flash空间的芯片),SIZEOF(.data)值大于0,所以编译一定会报错。

错误原因在于计算Flash占用空间的方法出错,没有减去芯片Flash起始地址,知道问题原因,解决就简单了,但这里不能直接修改当前目录下的*.ld文件,因为编译器在链接时,每次都重新从系统中拷贝Linker Scripts模板文件到此目录,需要修改原始的Linker Scripts文件。

原始Linker Scripts文件目录:

xxx\SiliconLabs\SimplicityStudio\v5\configuration\org.eclipse.osgi\883\0\.cp\linker_scripts

"xxx"取决于你的Simplicity Studio安装路径。修改"linker_scripts"最后一行如下:

ASSERT( LENGTH(FLASH) >= (__etext - ORIGIN(FLASH) + SIZEOF(.data)), "FLASH memory overflowed !")

减去Flash起始地址(ORIGIN(FLASH))即可。

修改后,在编译Release版本就不会报超出Flash空间了。

猜你喜欢

转载自blog.csdn.net/propor/article/details/131127648
今日推荐