1、Heap region was used, but no heap region was defined
工程中,我使用的是自己的分散加載文件,并且沒有定義ARM_LIB_STACKHEAP,ARM_LIB_STACK,ARM_LIB_HEAP這些符號,因為我自己要重新定義堆棧,就沒有使用這些符號,因此在C代碼中加入下述代碼:
//不使用ARM提供的堆函數(shù) __asm(".global__use_no_heap");
但是編譯的時候還是報錯:Error: L6915E: Library reports error: Heap region was used, but no heap region was defined。最初我以為是分散加載文件的問題,后來查看分析,覺得分散加載沒問題,于是就換個方向思考。
因為我在C代碼中添加了不使用ARM提供的堆函數(shù)的聲明,然而ARM_LIB_STACKHEAP,ARM_LIB_STACK,ARM_LIB_HEAP這些符號會在ARM官方代碼的堆棧初始化函數(shù)中進行使用,那么我只要分析出是誰在調(diào)用ARM官方的堆棧初始化函數(shù),就能夠解決這個問題了。
后來發(fā)現(xiàn)我的啟動代碼中少寫了一個函數(shù)__rt_entry,這個函數(shù)的作用就是一些初始化工作,當然也就包括初始化堆棧了。這個函數(shù)在ARM官方庫中已經(jīng)實現(xiàn),由于我沒有自定義__rt_entry函數(shù),因此在啟動時會調(diào)用ARM官方的__rt_entry函數(shù),也就自然會調(diào)用ARM庫中的堆棧初始化函數(shù),在鏈接的過程中,當發(fā)現(xiàn)分散加載文件沒有定義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函數(shù),該函數(shù)會調(diào)用main()函數(shù)。
2、啟動過程中出現(xiàn)總線異常
在解決了上面第1個問題后,工程能夠成功的編譯和鏈接,但是程序運行時會出現(xiàn)總線錯誤,而且有時候代碼量減小又不會出現(xiàn)這個問題。最開始分析這個問題,花費了不少時間,也沒有摸著門道。后來也是在我組長的指點下才解決的。
首先分析下為什么這個總線異常問題有時會出現(xiàn),有時不會出現(xiàn)。這就得說說分散加載文件中加載域和執(zhí)行域中的一個標志: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數(shù)據(jù)會被壓縮放置在image中,只有在分散加載文件中相關(guān)的加載域與執(zhí)行域中使用標志NOCOMPRESS時,才不會對RW數(shù)據(jù)進行壓縮。
因為我沒有使用NOCOMPRESS標志,因此會對RW數(shù)據(jù)進行壓縮,因此在image中的RW數(shù)據(jù)會比實際的長度小一些。由于是我自己在啟動代碼中初始化data和bss,因此在將flash中的RW data拷貝到RAM中時,RW data的長度我仍然使用的是未壓縮的數(shù)據(jù)長度,該長度大于壓縮數(shù)據(jù)的長度,在將flash中的RW data拷貝到RAM中時,當長度超過壓縮數(shù)據(jù)的長度,flash就會產(chǎn)生保護,從而觸發(fā)一個總線異常,而且異常的地址存儲在BFAR中。
解決方法:這里有兩種解決方法。
方法1:最簡單的就是在分散加載文件中RW data相關(guān)的加載域和執(zhí)行域使用NOCOMPRESS標志,當然了這個方法的缺點就是產(chǎn)生的image文件會大一些。
方法2:可以在啟動代碼中配置好sp,然后就不用去對RW data和bss進行處理(屏蔽掉自己寫的RW data和bss的處理代碼),這些工作ARM官方庫會自行處理的(壓縮的RW data在拷貝到RAM中時,ARM官方庫會進行解壓縮的,這些ARM庫代碼在編譯和鏈接的時候會自動的加入到image中)。
審核編輯:劉清
-
ARM
+關(guān)注
關(guān)注
134文章
9087瀏覽量
367390 -
RAM
+關(guān)注
關(guān)注
8文章
1368瀏覽量
114647
原文標題:基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12 后續(xù)2 - 堆棧初始化以及總線異常問題
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論