国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于ARM編譯器版本5的工程遷移與適配-堆棧初始化以及總線異常問題

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-11-16 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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中)。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    135

    文章

    9553

    瀏覽量

    391887
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1399

    瀏覽量

    120568

原文標題:基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12 后續2 - 堆棧初始化以及總線異常問題

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    字符型、指針型等變量該如何初始化

    在敲代碼的時候,我們會給變量一個初始值,以防止因為編譯器的原因造成變量初始值的不確定性。對于數值類型的變量往往初始化為0,但對于其他類型的變量,如字符型、指針型等變量等該如何
    發表于 09-23 11:50 ?2635次閱讀

    Keil修改ARM編譯器及配置方法

    Keil MDK自 V5.36 版本之后,默認就不帶 Arm Compiler V5版本編譯器。如果需要使用 V
    發表于 09-19 10:41 ?7967次閱讀
    Keil修改<b class='flag-5'>ARM</b><b class='flag-5'>編譯器</b>及配置方法

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移編譯器6?

    在Keil中將NuMicro BSP從Arm編譯器5遷移編譯器6!
    發表于 08-20 06:29

    學習ARM過程中的堆棧初始化詳解

    指令強制性的要 求使用R13作為堆棧指針。由于處理的每種運行模式均有自己獨立的物理寄存R13,在用戶應用程序的初始化部分,一般都要初始化
    發表于 04-20 14:11

    Arm編譯器遷移和兼容性指南

    Arm?編譯器遷移和兼容性指南為從舊版本Arm編譯器遷移
    發表于 08-10 06:57

    ICC AVR編譯器的安裝與使用

    ICCAVR編譯器的安裝、運行、破解、使用 用ICCAVR編譯器產生初始化程序和程序框架
    發表于 07-09 18:06 ?258次下載

    avr初始化代碼生成器中文版免費下載

    avr初始化代碼生成器,中文界面,適用于ICCAVR和WINAVR(GCC)編譯器,是工程師的實用軟件。
    發表于 12-12 16:35 ?0次下載
    avr<b class='flag-5'>初始化</b>代碼生成器中文版免費下載

    關于KEIL ARM編譯器的使用介紹

    KEIL ARM編譯器的使用
    的頭像 發表于 07-10 10:50 ?6795次閱讀

    EE-88:使用21xx編譯器初始化C語言中的變量

    EE-88:使用21xx編譯器初始化C語言中的變量
    發表于 05-19 21:08 ?1次下載
    EE-88:使用21xx<b class='flag-5'>編譯器</b><b class='flag-5'>初始化</b>C語言中的變量

    什么是指定初始化

    按照這種固定的順序,我們可以依次給 a[0] 和 a[8] 賦值。因為沒有對 a[9] 賦值,所以編譯器會將 a[9] 默認設置為0。當數組長度比較小時,使用這種方式初始化比較方便。
    的頭像 發表于 02-17 09:32 ?1901次閱讀

    使用ARMClang V6版本編譯器出現錯誤的解決方法

    很多STM32開發者使用ARM mdk IDE進行開發,我們知道ARM MDK IDE早已推出ARMClang V6版本編譯器了。不過,當我們把在V
    的頭像 發表于 06-07 12:32 ?1.5w次閱讀
    使用ARMClang V6<b class='flag-5'>版本</b><b class='flag-5'>編譯器</b>出現錯誤的解決方法

    基于ARM編譯器版本5工程遷移適配ARM編譯器版本6.12

    AC5和AC6的主要差異是AC6使用armclang代替了armcc,因此在AC6中就沒有armcc這個編譯工具了。并且armclang的編譯參數相對于之前的armcc的編譯參數也有許
    的頭像 發表于 11-12 11:17 ?1.1w次閱讀
    基于<b class='flag-5'>ARM</b><b class='flag-5'>編譯器</b><b class='flag-5'>版本</b><b class='flag-5'>5</b>的<b class='flag-5'>工程</b><b class='flag-5'>遷移</b>與<b class='flag-5'>適配</b>到<b class='flag-5'>ARM</b><b class='flag-5'>編譯器</b><b class='flag-5'>版本</b>6.12

    EE-88:使用21xx編譯器在C中初始化變量

    電子發燒友網站提供《EE-88:使用21xx編譯器在C中初始化變量.pdf》資料免費下載
    發表于 01-13 15:54 ?0次下載
    EE-88:使用21xx<b class='flag-5'>編譯器</b>在C中<b class='flag-5'>初始化</b>變量

    GraniStudio:初始化例程

    說明 通過初始化運控板卡算子連接格拉尼總線型運控卡,導入工程自動進行連接,此算子為使用運控控制板卡的第一項操作,后續運控算子需引用其輸出板卡對象才可使用。 3.異常處理 當手動執行
    的頭像 發表于 08-22 16:45 ?894次閱讀
    GraniStudio:<b class='flag-5'>初始化</b>例程

    EtherCAT總線初始化步驟

    的關鍵環節,涉及硬件配置、軟件設置以及網絡拓撲的建立。以下是EtherCAT總線初始化的詳細步驟,結合實際應用場景和常見問題解決方案,為工程師提供系統
    的頭像 發表于 12-22 10:10 ?588次閱讀
    EtherCAT<b class='flag-5'>總線</b><b class='flag-5'>初始化</b>步驟