stm32使用keil5编写程序时,显式指定一个变量的内存地址,可以使用__attribute__((section(".ARM.__at_0x68000000")));这样的定义方式。此方式在使用jlink调试下载时完全正常,但无法生成bin文件:
1 s16 wave_store_buf[WAVE_STORE_N][16][MCU_PRO_N] __attribute__((section(".ARM.__at_0x68000000"))); //这样定义导致bin生成有问题
使用fromelf.exe生成bin文件时,报错:
Error: Q0147E: Failed to create Directory ..\..\out\firmware.bin\ER_IROM1: File exists
命令行为:fromelf.exe --bin -o ..\..\out\firmware.bin ..\obj\test.axf
检查生成的hex文件,发现hex文件尾部0x68000000处多了一段代码:

导致无法生成bin文件,使用hex下载也出问题,必须删除这一段代码才能下载。因为程序中这一段变量定义并不需要实际数据,所以删除他是没有问题的。
具体这段代码的生成原因还没弄明白,在程序中对数组进行修改,可以避免麻烦:
1 s16 (*wave_store_buf)[16][MCU_PRO_N]=(s16 (*)[16][MCU_PRO_N])0x68000000;
通过定义数组的指针,避免产生实体代码,且用法一致。
此时生成的hex和bin文件都是正常的