关于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
    评论
1. FX3 SDK main components. User firmware Libraries ThreadX RTOS (cyu3threadx.a) FX3 API Library (cyfxapi.a) Serial Peripheral API Library (cyu3lpp.a) Storage API Library (cyu3sport.a) MIPI CSI-2 API Library (cyu3mipicsi.a) Take the example firmware lowpowertest debug reversion for the test, need link following library. libcyu3lpp.a libcyfxapi.a libcyu3threadx libc.a libgcc.a -lcyu3lpp -lcyfxapi -lcyu3threadx -lc -lgcc While the search path will be: -L"C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\ARM GCC\lib\gcc\arm-none-eabi\4.8.1" -L"C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\ARM GCC\arm-none-eabi\lib" -L"C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\fw_lib\1_3_3\fx3_debug" Link script will be fx3.ld for 512KB SRAM. From fx3 initialization block, could understand the fx3 entry point is CyU3PFirmwareEntry() function, so need manually assign entry point by follow linker command. --entry,CyU3PFirmwareEntry So Keil 4.74 IDE Linker page needs to configure as following pic. 2. Specific GNU cross compile tool path. Under tap project->Manage Project Items… -> Folders/Extensions Point to use GCC cross compile tools, please fill GNU-Tool-Prefix “arm-none-eabi-” while GNU-Tool Folder “C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\ARM GCC\” 3. C compile tap page configure. Predefined symbols __CYU3P_TX__=1. Include Path: ..\inc Without optimizations 4. Specific output file type. Under tap page Project->Options for target fx3->Output Need create object file with debug information. 5. After build elf file, execute user command. After precompiler, compiler and linker could get object file fx3.elf, need to convert to img file for download. So need execute user command: "C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\util\elf2img\elf2img.exe" -i fx3.elf -o fx3.img –v Summary After configuration, click Build button will show build output log like following pic.
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、付费专栏及课程。

余额充值