<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    嵌入式軟件開發之:編譯器的缺省行為

    發布時間:2015-11-12 11:14    發布者:designapp
    關鍵詞: 嵌入式 , 編譯器 , 缺省行為
      13.2 編譯器的缺省行為
      多數嵌入式應用程序最初都是在原型環境下開發的。無論什么樣的原型仿真環境與最終產品環境都是有差異的。因此,考慮如何將嵌入式應用程序從其所依賴的開發工具或調試環境中移植到在目標硬件上獨立運行是非常重要的。
      開始編寫嵌入式應用程序時,開發者可能并不清楚目標硬件的具體規格。如,目標系統使用了什么樣的外圍設備、存儲器映射情況甚至不能確定處理器的型號。
      為在了解這些詳細信息前能夠繼續軟件的開發,RVCT工具提供了很多默認的操作,使用戶能編譯和調試與目標系統無關的應用程序代碼。下面詳細介紹這些編譯選項,只有深入了解這些編譯選項設置,才能使開發更順利的進行。
      13.2.1 Semihosting
      1.Semihosting簡介
      在RVCT C庫中,對某些ISO C功能的支持由主機調試環境提供。提供該功能的機制被稱為Semihostin[1]。大多數的ARM調試系統都支持Semihosting機制,如ReslView Debugger AXD等。
      調試系統提供這種機制是非常有用的,因為用于開發使用的硬件系統經常沒有最終系統的所有輸入和輸出設備。在這種情況下,Semihosting可讓主機代替目標系統提供這些設備的功能。舉例來說,此機制可以用于啟用C庫中的函數(例如,printf()和scanf())使用主機的屏幕和鍵盤,而不使用目標系統的屏幕和鍵盤。
      半主機由一組已定義的SWI操作來實現。應用程序調用相應的SWI,然后由調試代理程序(Debug Agent)處理SWI異常。調試代理程序完成系統與主機之間的通信。
      圖13.1顯示了Semihosting機制的處理過程。
      


      圖13.1 Semihosting機制的處理過程
      在很多情況下,Semihosting SWI由庫函數內的代碼調用。應用程序也可以直接調用。支持ARM C庫中Semihosting的詳細信息,請參閱ARM相關文檔。
      2.Semihosting軟件接口
      ARM和Thumb SWI指令包含一個軟中斷號,該中斷號可以被應用程序使用。此編號可以由系統中的SWI處理程序進行解碼。有關SWI處理程序的詳細信息,請參閱本書中ARM異常處理一節。
      Semihosting使用固定的中斷號調用相應的處理程序。用于Semihosting的SWI是:
      · 0x123456(在ARM狀態下);
      · 0xAB(在Thumb狀態下)。
      注意用戶在編寫自己的中斷處理程序時,避免使用Semihosting已經使用的中斷向量號。
      調試代理通過SWI的中斷向量號識別該軟中斷是目標系統提出的Semihosting請求。具體是何種Semihosting請求(鍵盤輸入請求或屏幕顯示請求),通過向寄存器r0傳遞不同的參數進行區分。所有其他參數通過一個數據塊進行傳遞。該數據塊的地址通過寄存器r1傳遞給中斷處理程序。軟中斷的處理結果放在r0中返回,也可以通過顯式的返回值或傳遞數據塊的指針帶回程序的處理結果。即使未返回結果,也假定r0是被使用的。
      用r0傳遞的可用Semihosting操作編號分配如下:
      · 0x00-0x31 這些編號由ARM公司使用;
      · 0x32-0xFF 這些編號由ARM公司保留,以備將來使用;
      · 0x100-0x1FF 這些編號保留給用戶應用程序。
      注意:雖然這些編號ARM公司不使用,用戶可以使用這些編號編寫自己的SWI操作,但建議使用其他 SWI 編號,而不要使用Semihosting SWI 編號和這些Semihosting的預留操作類型編號。
      · 0x200-0xFFFFFFFF這些編號未定義。當前未使用并且不推薦使用這些編號。
      在以下部分中,操作名稱之后的括號中的編號是調用Semihosting操作時放入r0的值。例如,SYS_OPEN(0x01)。
      如果從匯編語言代碼中調用SWI,最好使用semihost.h中定義的操作名稱?梢杂 EQU 偽操作定義操作名稱。例如:
      SYS_OPEN EQU 0x01
      SYS_CLOSE EQU 0x02
      3.Semihosting需求函數
      Semihosting需要的函數列表如表13.1所示。如果使用默認的Semihosting功能,用戶不需要編寫任何其他代碼。也可以重新實現部分的輸入/輸出函數,使這些函數和標準Semihosting混合使用。
      表13.1 Semihosting函數列表

      續表

      13.2.2 C 庫結構
      從概念上來講,C庫函數可被化分成兩類,一類為ISO C語言的規范部分,該部分的主要功能是向用戶提供一個調用接口;另一類為ISO C語言規范提供支持。圖13.2顯示了這兩類函數在C庫中的結構。
      


      圖13.2 C庫的函數結構
      對部分ISO C功能的支持是由主機調試環境在支持函數的設備驅動程序級別提供的。
      例如,RVCT C庫通過寫入調試器控制臺窗口來實現ISO C printf()系列函數。通過調用__sys_write()來提供該功能。這是一個執行半主機SWI的支持函數,使字符串被寫入到控制臺。
      13.2.3 默認存儲器映射
      對于沒有描述存儲器映射的映像(Image),RVCT根據默認存儲器映射放置代碼和數據。默認的存儲器映射如圖13.3所示。
      


      圖13.3 默認存儲器映射
      結合圖13.3,可以看出默認的存儲器映射使用以下規則:
      · 鏈接映像,在地址0x8000加載并運行。首先放置所有的RO(只讀)段,其次是RW(讀寫)段,然后是ZI(零初始化)段。
      · 堆(Heap)直接從ZI段的頂端地址算起,因此,其準確位置在鏈接時決定。
      · 棧(Stack)的起始地址在應用程序啟動過程時由Semihosting操作提供。具體Semihosting操作設置的值由調試系統的不同而不同。
     、 RealView ARMulator ISS(RVISS)設置為配置文件peripherals.ami中設定的值。默認值是0x08000000。
     、 Multi-ICE將該地址設置為調試器內部變量top_of_memory的值。默認值是0x00080000。
      13.2.4 鏈接程序放置規則
      鏈接程序遵守一組規則,以決定代碼和數據位于存儲器中的什么位置,如圖13.4所示。
      鏈接程序放置遵循以下規則:
     、 映像首先按屬性組織:RO段在最低的存儲器地址,其次是RW段,然后是ZI段。每一種屬性中,代碼在數據之前。
     、 鏈接程序按名稱的字母順序放置輸入段(Section)。輸入段名稱即匯編程序AREA偽操作定義的名稱。
      


      圖13.4 鏈接程序放置規則
     、 在輸入段中,獨立對象的代碼和數據,按照對象文件在鏈接程序命令行中被指定的順序放置。
      要精確放置代碼和數據,ARM公司建議不要過分依靠這些規則。相反,必須使用分散加載機制來完全控制代碼和數據的放置。請參閱下一章的調整映像存儲器映射以適應目標系統硬件存儲器的實際要求。
      13.2.5 應用程序啟動
      多數嵌入式系統中,執行主任務前,執行初始化序列來設置系統。默認的RVCT初始化序列如圖13.5所示。
      


      圖13.5 默認RVCT初始化序列
      在進入用戶代碼(main())前,初始化序列可分成三個功能塊:__main直接跳轉到__scatterload;__scatterload負責建立運行時的映像存儲器映射,而__rt_entry(運行時的入口)則負責初始化C庫。
      __scatterload執行代碼和數據復制以及ZI數據的清零。對于ZI數據的清零和未改變的RW數據來說,這一步總是要做的。
      __scatterload跳轉到__rt_entry。它設置應用程序的棧和堆,初始化庫函數及其靜態數據,并調用任何全局聲明的對象的構造函數(僅C++)。
      然后__rt_entry跳轉到應用程序入口main()。主應用程序結束執行時,__rt_entry將庫關閉,然后把控制權交還給調試器。
      RVCT中,函數main()有一個特殊含意。main()函數的存在強制鏈接程序鏈接到__main和__rt_entry中的初始化代碼。沒有main()函數,就不會鏈接到初始化進程,那么一些標準C庫功能就不會得到支持。
      [1] 在一些ARM的中文參考文獻中,將Semihosting譯為半主機。
                                   
                   
    本文地址:http://www.portaltwn.com/thread-156233-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷