keil出现fatal error: error in backend: ran out of registers during register allocation的解决方案

最近用GD32E230单片机开发一款产品在配置GPIO时出现了以下错误:

Build started: Project: ****
*** Using Compiler 'V6.12', folder: 'D:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'Target 1'
fatal error: error in backend: ran out of registers during register allocation
ArmClang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Product: MDK Professional 5.27
Component: ARM Compiler 6.12
Tool: armclang [5d624a00]
Target: arm-arm-none-eabi
ArmClang: note: diagnostic msg: PLEASE submit a bug report to http://ds.arm.com/developer-resources/ds-5-technical-support/ and include the crash backtrace, preprocessed source, and associated run script.
ArmClang: note: diagnostic msg: 
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
ArmClang: note: diagnostic msg: C:\Users\ADMINI~1\AppData\Local\Temp\key-ca855f.c
ArmClang: note: diagnostic msg: C:\Users\ADMINI~1\AppData\Local\Temp\key-ca855f.sh
ArmClang: note: diagnostic msg: 
********************
compiling key.c...
".\Objects\DEMO.axf" - 1 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

错误来的很突然,项目刚开始时我把输入引脚都配置为全部配置为浮空输入,这时编译当然是没问题,后面要根据具体功能将输入IO口配置不同输入状态,结果问题就来了,编译后就产生了以上错误,看着这描述我是很懵逼的,是寄存器配置出问题?看了几遍GD的官方库函数和芯片数据手册,都没有发现问题呀!后面尝试逐条添加每个IO口的配置函数,发现了问题原因。当要将不同的IO口输入配置为不同上下拉情况时,调用的函数一样,可能被编译器给优化了,结果造成编译器报错。

 

后面修改编译器优化等级,确实是这个问题,值得一提的是,我是这几天刚好装上的MDK Professional 5.27,这个版本多了几种优化等级设置。

由于创建工程的时候粗心了,没注意到这个问题,使用了默认的优化等级(-Oz image size),吃一堑,长一智,后面把优化等级改了就编译正常了。

有兴趣了解新版keil优化等级的同学可以参考这篇文章:https://www.eet-china.com/mp/a6037.html

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值