关于keil ARM编译器bug --- Internal fault: 0xb3b91b

本文禁止转载。

本文提供了几种不切换ARM编译器版本的情况下解决该问题的方法。

在编写程序时,

大概编写的即使这样一个程序,这个96个字节的变量定义在main函数内部,上面还定义了一些其他变量

编译的时候遇到错误:

Build started: Project: ble_app_uart_pca10056_s140
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'nrf52840_xxaa'
linking...
.\_build\nrf52840_xxaa.axf: Internal fault: [0xb3b91b:5060750]
.\_build\nrf52840_xxaa.axf: Please contact your supplier.
".\_build\nrf52840_xxaa.axf" - 2 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

这个错误具体的原因及解决方法如下:

Documentation – Arm Developer

这个是ARM官方的一个解决方案。但是官方的这个解决方案好像并不是能够解决问题。

本文提供了一种新的解决方式。

首先介绍一下这个问题产生的原因,这个问题主要是因为ARM编译器版本产生的

具体的,是这两个版本产生了问题。 升级到6.13版本理论上就可以解决该问题了。

但是,升级ARM编译器的版本是比较耗时的。

首先,要下载新的ARM版本,然后要做一系列的配置,让keil5 开发环境能够支持6.13的ARM编译器。

但是这个配置是耗时的,这个配置可以到网上去搜索对应的参考解决方案。

但是可能不一定能成功。(我具体的没试过,我觉得太浪费时间了,之前在另一款IDE中,是不得不升级ARM编译器的版本,我才升级的,配置过程比较繁琐)

为什么升级ARM编译器的版本不一定成功?

This issue was solved in Arm Compiler version 6.13 which will be part of Keil MDK version 5.29. 

因为官方介绍的是keil版本是5.29

而我的版本是5.27

我想,这条路还是算了吧。万一升级不成功,还要先升级keil5 的版本。为了解决这么个ARM编译器的错误,不至于,不值得浪费这么多时间。

我当前的keil环境下,有这么几个ARM编译器的版本,都尝试了切换了一下,编译,继续报错。

 所以感觉,这不应该是ARM6.11和6.12 存在的问题,应该是以前的版本都有类似的问题。

官方提供了几种解决方案:

尝试了一下,都不行, 

第一种方法,更改优化方案,优化方案从-O0 到-O3,都不行

第二种方法,勾选掉 One ELF Section per Function,不行。这个其实也是一种优化方案,意思就是对没有调用到的函数就直接优化掉,不要放到最终的ELF二进制文件中

以上两种方法,官方也都认为是不安全的。

第三种方法,修改Scatter 文件

可是我们也没有应用到Scatter文件,所以这种也不行

最后,提出我的几种解决方案。

(1)把这个96字节的数组变量放到全局变量中去定义,放在main函数之外,错误没有了

(2)把这个96字节的数组变量加上static 关键字,错误没有了。加上static关键字之后,不管是放在main函数里面还是main函数外面,错误都解决

(3)定义这个96字节的数组变量的时候,不要赋初值,然编译器给他赋初值。错误解决。

(4)给这96个字节的数组扩展为97个字节的数组,但是最后一个成员不要赋值。

 

之所以提出这个第四点方案,是基于第三点优化方案的考虑。当时不想把这个数组放在全局变量中,或者加上static关键字。第三点就取消掉定义的时候赋初值。然编译器默认给这个数组赋初值(一般情况下,默认赋初值就是为0)

然后我想,是不是ARM编译器赋初值之后 ,这个bug就自动规避掉了,我就扩展数组,扩大一个字节,最后一个字节不赋初值,然后发现好像确实是如自己所预测的那样。

如果大家遇到这个问题,能定位出来是哪个变量导致这个问题,可以尝试使用我这种方式,让编译器默认赋初值,然后自己在别的地方给这个变量手动赋值(虽然这种方式不是我们想要的,我们的编程习惯中一般是定义的时候即赋初值)

如果大家不想这么解决,就按照官方的介绍,首先先升级keil的版本,然后再升级ARM的版本。

这两个升级版本不在本文介绍范围之内

 

 

 

 

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Keil arm-none-eabi-gcc是Keil软件提供的一个工具链,用于编译和链接ARM架构的嵌入式系统的代码。它是GCC(GNU Compiler Collection)的一个版本,专门为ARM架构的嵌入式设备而设计和优化。这个工具链包括了arm-none-eabi-gcc编译器、链接器以及其他必要的工具,用于将源代码编译成可执行文件。通过使用arm-none-eabi-gcc,可以方便地编译、调试和部署嵌入式系统的代码。 要在Windows下安装keil arm-none-eabi-gcc,需要下载并安装arm-none-eabi-gcc、MinGW(GNU make)和Jlink驱动这三个软件。首先,您需要从Keil官方网站下载arm-none-eabi-gcc,并按照安装说明进行安装。接下来,您还需要安装MinGW,它是一个包含了GNU make的软件集合,用于构建和管理工程,也可从官方网站下载并按照安装说明进行安装。最后,您需要下载并安装Jlink驱动,它是一种用于连接和调试嵌入式系统的硬件接口。安装完成后,您就可以使用keil arm-none-eabi-gcc进行ARM嵌入式系统的开发了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi.exe](https://download.csdn.net/download/tcjy1000/85256846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [STM32高级开发(5)-gcc-arm-none-eabi](https://blog.csdn.net/zhengyangliu123/article/details/54783443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [(arm-none-eabi-gcc + GNU make + Makefile +嵌入式单片机)环境搭建篇(linux+windows)](https://blog.csdn.net/qq_35333978/article/details/110398968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgmcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值