Keil5使用AC6编译后,生成bin文件变为生成文件夹的解决办法

Keil5使用AC6编译后,生成bin文件变为生成文件夹的解决办法


最近同事咨询改用keil的最新版本编译器编译原来的程序后,出现了报警以及生成bin文件异常的情况(源程序为IAP升级程序app程序部分)。经过查找相关资料后,问题得到解决。现在将该过程记录如下。

KEIL AC5到AC6需要注意的地方

Keil5 目前安装完毕编译选项会出现两种不同的编译器
在这里插入图片描述

从AC5移植到AC6

Keil官方有一个文档特别针对这个有说明,具体链接如下
https://www.keil.com/appnotes/files/apnt_298.pdf
在这里插入图片描述

解决流程

原工程为CORTEX M0的IAP升级的APP程序,因为cortexM0在执行跳转时需要将中断跳转地址复制到RAM内才能实现跳转(这一点和cortexM3有很大不同)。原工程选择的AC5编译版本,采用的绝对地址定义如下:

__IO uint32_t VectTable[VECTOR_SIZE] __attribute__((at(APP_VectStoreAddr)));

采用V6.14版本即AC6编译后,由于编译器不同,keil会提示“warning: unknown attribute ‘at’ ignored [-Wunknown-attributes]“。针对AC6在keil的官方文档提到的信息,我们可以采用如下代码来替换之前的at方式达到指定存储地址的目的。

__IO uint32_t VectTable[VECTOR_SIZE] __attribute__((section(".ARM.__at_0x20000000")));

或者

#define APP_VectStoreAddr "0x20000000"
__IO uint32_t VectTable[VECTOR_SIZE] __attribute__((section(".ARM.__at_"APP_VectStoreAddr)));

做出如上修改后,采用AC6能够正常编译,使用
fromelf.exe --bin --output $L@L.bin $L@L.axf 命令会在输出目录下生成一个.bin的目录,目录内含有以下两个文件。
在这里插入图片描述

关键步骤

这个时候需要将target设置选项下的iram地址分成两段写,如图位置
在这里插入图片描述
具体设置的大小要根据实际规划的内容区域进行相应的设置。
设置完毕后,先删除object目录下的文件,然后点击编译,则可以正常生成bin文件。
通过对比是否增加IRAM1和IRAM2的内容后生成的sct文件可以看出一定的差别
在这里插入图片描述

在这里插入图片描述

个人理解:由于采取在定义绝对位置时采用了section的办法,编译器会将程序分成两个区域来对待,而在target界面之前我们仅仅指定义了个偏移量,原来程序空间前面保留部分未进行强制定义,导致使用fromelf.exe无法正确执行生成bin操作。在target界面显示的进行区域设定后,问题得到了解决。仅为个人理解,可能存在错误,还望大家能够帮忙指正。

(参考链接)

https://www.keil.com/support/docs/4030.htm
https://blog.csdn.net/ybhuangfugui/article/details/109375969

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值