1、heap region was used, but no heap region was defined
工程中,我使用的是自己的分散加载文件,并且没有定义arm_lib_stackheap,arm_lib_stack,arm_lib_heap这些符号,因为我自己要重新定义堆栈,就没有使用这些符号,因此在c代码中加入下述代码:
// 不使用arm提供的堆函数__asm(.global __use_no_heap);
但是编译的时候还是报错:error: l6915e: library reports error: heap region was used, but no heap region was defined。最初我以为是分散加载文件的问题,后来查看分析,觉得分散加载没问题,于是就换个方向思考。
因为我在c代码中添加了不使用arm提供的堆函数的声明,然而arm_lib_stackheap,arm_lib_stack,arm_lib_heap这些符号会在arm官方代码的堆栈初始化函数中进行使用,那么我只要分析出是谁在调用arm官方的堆栈初始化函数,就能够解决这个问题了。
后来发现我的启动代码中少写了一个函数__rt_entry,这个函数的作用就是一些初始化工作,当然也就包括初始化堆栈了。这个函数在arm官方库中已经实现,由于我没有自定义__rt_entry函数,因此在启动时会调用arm官方的__rt_entry函数,也就自然会调用arm库中的堆栈初始化函数,在链接的过程中,当发现分散加载文件没有定义arm_lib_stackheap,arm_lib_stack,arm_lib_heap这些符号就报错:error: l6915e: library reports error: heap region was used, but no heap region was defined。
解决方法:自然是在我的启动文件中自定义一个__rt_entry函数,该函数会调用main()函数。
2、启动过程中出现总线异常
在解决了上面第1个问题后,工程能够成功的编译和链接,但是程序运行时会出现总线错误,而且有时候代码量减小又不会出现这个问题。最开始分析这个问题,花费了不少时间,也没有摸着门道。后来也是在我组长的指点下才解决的。
首先分析下为什么这个总线异常问题有时会出现,有时不会出现。这就得说说分散加载文件中加载域和执行域中的一个标志:nocompress,ac6.12的armlink文档中有对这个标志的描述:
rw data compression is enabled by default. the nocompress keyword enables you to specify that rw data in an execution region must not be compressed in the final image.
大致意思,默认情况下rw数据会被压缩放置在image中,只有在分散加载文件中相关的加载域与执行域中使用标志nocompress时,才不会对rw数据进行压缩。
因为我没有使用nocompress标志,因此会对rw数据进行压缩,因此在image中的rw数据会比实际的长度小一些。由于是我自己在启动代码中初始化data和bss,因此在将flash中的rw data拷贝到ram中时,rw data的长度我仍然使用的是未压缩的数据长度,该长度大于压缩数据的长度,在将flash中的rw data拷贝到ram中时,当长度超过压缩数据的长度,flash就会产生保护,从而触发一个总线异常,而且异常的地址存储在bfar中。
解决方法:这里有两种解决方法。
方法1:最简单的就是在分散加载文件中rw data相关的加载域和执行域使用nocompress标志,当然了这个方法的缺点就是产生的image文件会大一些。
方法2:可以在启动代码中配置好sp,然后就不用去对rw data和bss进行处理(屏蔽掉自己写的rw data和bss的处理代码),这些工作arm官方库会自行处理的(压缩的rw data在拷贝到ram中时,arm官方库会进行解压缩的,这些arm库代码在编译和链接的时候会自动的加入到image中)。
头戴显示器伤眼睛吗 头戴式显示器优缺点
氢能与燃料电池产业链现状及发展前景
兼容8051内核的无线射频单片机CC2540
同步整流基本原理
USB传输的嵌入式心电图量测系统设计
基于ARM编译器版本5的工程迁移与适配-堆栈初始化以及总线异常问题
TA8772AN引脚功能的电压资料参数
空调螺杆机组是什么 它的工作原理是什么
新品开箱 | RL78/G15开发板 Step by Step点灯
STM32F10x_硬件I2C主从通信 (轮询发送,中断接收)
Galaxy S21包装盒将仅包括手册和典型文件以及数据线
移动互联网可以伴随我们多长的时间
未来数字广告传播的神器,液晶广告机的作用有多大
UPS电源如何使用,在过载时保护它
2021年FTF青少年无人机大赛浙江省选拔赛通知
MCU硬件在环(HiL)仿真测试系统组成
TDK首款紧凑SMD技术的CeraCharge固态充电电池
正激式开关电源使用什么MOS管
Vivo与Elliptic Labs合作的首款智能手机Vivo Y78+发布
如何看待3D DRAM技术?