當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]多數(shù)嵌入式應(yīng)用程序最初都是在原型環(huán)境下開發(fā)的。無論什么樣的原型仿真環(huán)境與最終產(chǎn)品環(huán)境都是有差異的。因此,考慮如何將嵌入式應(yīng)用程序從其所依賴的開發(fā)工具或調(diào)試環(huán)境中移植到在目標(biāo)硬件上獨立運行是非常重要的。

13.2 編譯器的缺省行為

多數(shù)嵌入式應(yīng)用程序最初都是在原型環(huán)境下開發(fā)的。無論什么樣的原型仿真環(huán)境與最終產(chǎn)品環(huán)境都是有差異的。因此,考慮如何將嵌入式應(yīng)用程序從其所依賴的開發(fā)工具或調(diào)試環(huán)境中移植到在目標(biāo)硬件上獨立運行是非常重要的。

開始編寫嵌入式應(yīng)用程序時,開發(fā)者可能并不清楚目標(biāo)硬件的具體規(guī)格。如,目標(biāo)系統(tǒng)使用了什么樣的外圍設(shè)備、存儲器映射情況甚至不能確定處理器的型號。

為在了解這些詳細(xì)信息前能夠繼續(xù)軟件的開發(fā),RVCT工具提供了很多默認(rèn)的操作,使用戶能編譯和調(diào)試與目標(biāo)系統(tǒng)無關(guān)的應(yīng)用程序代碼。下面詳細(xì)介紹這些編譯選項,只有深入了解這些編譯選項設(shè)置,才能使開發(fā)更順利的進(jìn)行。

13.2.1 Semihosting1.Semihosting簡介

在RVCT C庫中,對某些ISO C功能的支持由主機(jī)調(diào)試環(huán)境提供。提供該功能的機(jī)制被稱為Semihostin[1]。大多數(shù)的ARM調(diào)試系統(tǒng)都支持Semihosting機(jī)制,如ReslView Debugger AXD等。

調(diào)試系統(tǒng)提供這種機(jī)制是非常有用的,因為用于開發(fā)使用的硬件系統(tǒng)經(jīng)常沒有最終系統(tǒng)的所有輸入和輸出設(shè)備。在這種情況下,Semihosting可讓主機(jī)代替目標(biāo)系統(tǒng)提供這些設(shè)備的功能。舉例來說,此機(jī)制可以用于啟用C庫中的函數(shù)(例如,printf()和scanf())使用主機(jī)的屏幕和鍵盤,而不使用目標(biāo)系統(tǒng)的屏幕和鍵盤。

半主機(jī)由一組已定義的SWI操作來實現(xiàn)。應(yīng)用程序調(diào)用相應(yīng)的SWI,然后由調(diào)試代理程序(Debug Agent)處理SWI異常。調(diào)試代理程序完成系統(tǒng)與主機(jī)之間的通信。

圖13.1顯示了Semihosting機(jī)制的處理過程。

圖13.1 Semihosting機(jī)制的處理過程

在很多情況下,Semihosting SWI由庫函數(shù)內(nèi)的代碼調(diào)用。應(yīng)用程序也可以直接調(diào)用。支持ARM C庫中Semihosting的詳細(xì)信息,請參閱ARM相關(guān)文檔。

2.Semihosting軟件接口

ARM和Thumb SWI指令包含一個軟中斷號,該中斷號可以被應(yīng)用程序使用。此編號可以由系統(tǒng)中的SWI處理程序進(jìn)行解碼。有關(guān)SWI處理程序的詳細(xì)信息,請參閱本書中ARM異常處理一節(jié)。

Semihosting使用固定的中斷號調(diào)用相應(yīng)的處理程序。用于Semihosting的SWI是:

· 0x123456(在ARM狀態(tài)下);

· 0xAB(在Thumb狀態(tài)下)。

注意

用戶在編寫自己的中斷處理程序時,避免使用Semihosting已經(jīng)使用的中斷向量號。

調(diào)試代理通過SWI的中斷向量號識別該軟中斷是目標(biāo)系統(tǒng)提出的Semihosting請求。具體是何種Semihosting請求(鍵盤輸入請求或屏幕顯示請求),通過向寄存器r0傳遞不同的參數(shù)進(jìn)行區(qū)分。所有其他參數(shù)通過一個數(shù)據(jù)塊進(jìn)行傳遞。該數(shù)據(jù)塊的地址通過寄存器r1傳遞給中斷處理程序。軟中斷的處理結(jié)果放在r0中返回,也可以通過顯式的返回值或傳遞數(shù)據(jù)塊的指針帶回程序的處理結(jié)果。即使未返回結(jié)果,也假定r0是被使用的。

用r0傳遞的可用Semihosting操作編號分配如下:

· 0x00-0x31 這些編號由ARM公司使用;

· 0x32-0xFF 這些編號由ARM公司保留,以備將來使用;

· 0x100-0x1FF 這些編號保留給用戶應(yīng)用程序。

注意

雖然這些編號ARM公司不使用,用戶可以使用這些編號編寫自己的SWI操作,但建議使用其他 SWI 編號,而不要使用Semihosting SWI 編號和這些Semihosting的預(yù)留操作類型編號。

· 0x200-0xFFFFFFFF這些編號未定義。當(dāng)前未使用并且不推薦使用這些編號。

在以下部分中,操作名稱之后的括號中的編號是調(diào)用Semihosting操作時放入r0的值。例如,SYS_OPEN(0x01)。

如果從匯編語言代碼中調(diào)用SWI,最好使用semihost.h中定義的操作名稱。可以用 EQU 偽操作定義操作名稱。例如:

SYS_OPEN EQU 0x01

SYS_CLOSE EQU 0x02

3.Semihosting需求函數(shù)

Semihosting需要的函數(shù)列表如表13.1所示。如果使用默認(rèn)的Semihosting功能,用戶不需要編寫任何其他代碼。也可以重新實現(xiàn)部分的輸入/輸出函數(shù),使這些函數(shù)和標(biāo)準(zhǔn)Semihosting混合使用。

表13.1 Semihosting函數(shù)列表

函 數(shù) 名 稱

描 述

SYS_OPEN (0x01)

打開文件

SYS_CLOSE(0x02)

關(guān)閉使用SYS_OPEN打開的文件

SYS_WRITEC (0x03)

向控制臺輸出字符

SYS_WRITE0 (0x04)

將空終止的字符串寫入控制臺

SYS_WRITE (0x05)

寫入主機(jī)上的文件

續(xù)表

函 數(shù) 名 稱

描 述

SYS_READ (0x06)

將文件內(nèi)容讀取到緩存器

SYS_READC (0x07)

從控制臺讀取字節(jié)

SYS_ISERROR (0x08)

確定返回代碼是否錯誤

SYS_ISTTY (0x09)

檢查文件是否連接到交互設(shè)備

SYS_SEEK (0x0A)

搜索到文件中的某個位置

SYS_FLEN (0x0C)

返回文件的長度

SYS_TMPNAM (0x0D)

返回文件的臨時名稱

SYS_REMOVE (0x0E)

刪除主機(jī)上的文件

SYS_RENAME (0x0F)

重命名主機(jī)上的文件

SYS_CLOCK (0x10)

執(zhí)行開始后的厘秒數(shù)

SYS_TIME (0x11)

1970 年 1 月 1 日到現(xiàn)在的秒數(shù)

SYS_SYSTEM (0x12)

將命令傳遞給主機(jī)命令行解釋程序

SYS_ERRNO (0x13)

獲得 C 庫 errno 變量的值

SYS_GET_CMDLINE (0x15)

獲得用于調(diào)用可執(zhí)行程序的命令行

SYS_HEAPINFO (0x16)

獲得系統(tǒng)堆參數(shù)

SYS_ELAPSED (0x30)

獲得自執(zhí)行開始的目標(biāo)滴答聲數(shù)目

SYS_TICKFREQ (0x31)

確定滴答聲的頻率

13.2.2 C 庫結(jié)構(gòu)

從概念上來講,C庫函數(shù)可被化分成兩類,一類為ISO C語言的規(guī)范部分,該部分的主要功能是向用戶提供一個調(diào)用接口;另一類為ISO C語言規(guī)范提供支持。圖13.2顯示了這兩類函數(shù)在C庫中的結(jié)構(gòu)。

圖13.2 C庫的函數(shù)結(jié)構(gòu)

對部分ISO C功能的支持是由主機(jī)調(diào)試環(huán)境在支持函數(shù)的設(shè)備驅(qū)動程序級別提供的。

例如,RVCT C庫通過寫入調(diào)試器控制臺窗口來實現(xiàn)ISO C printf()系列函數(shù)。通過調(diào)用__sys_write()來提供該功能。這是一個執(zhí)行半主機(jī)SWI的支持函數(shù),使字符串被寫入到控制臺。

13.2.3 默認(rèn)存儲器映射

對于沒有描述存儲器映射的映像(Image),RVCT根據(jù)默認(rèn)存儲器映射放置代碼和數(shù)據(jù)。默認(rèn)的存儲器映射如圖13.3所示。

圖13.3 默認(rèn)存儲器映射

結(jié)合圖13.3,可以看出默認(rèn)的存儲器映射使用以下規(guī)則:

· 鏈接映像,在地址0x8000加載并運行。首先放置所有的RO(只讀)段,其次是RW(讀寫)段,然后是ZI(零初始化)段。

· 堆(Heap)直接從ZI段的頂端地址算起,因此,其準(zhǔn)確位置在鏈接時決定。

· 棧(Stack)的起始地址在應(yīng)用程序啟動過程時由Semihosting操作提供。具體Semihosting操作設(shè)置的值由調(diào)試系統(tǒng)的不同而不同。

① RealView ARMulator ISS(RVISS)設(shè)置為配置文件peripherals.ami中設(shè)定的值。默認(rèn)值是0x08000000。

② Multi-ICE將該地址設(shè)置為調(diào)試器內(nèi)部變量top_of_memory的值。默認(rèn)值是0x00080000。

13.2.4 鏈接程序放置規(guī)則

鏈接程序遵守一組規(guī)則,以決定代碼和數(shù)據(jù)位于存儲器中的什么位置,如圖13.4所示。

鏈接程序放置遵循以下規(guī)則:

① 映像首先按屬性組織:RO段在最低的存儲器地址,其次是RW段,然后是ZI段。每一種屬性中,代碼在數(shù)據(jù)之前。

② 鏈接程序按名稱的字母順序放置輸入段(Section)。輸入段名稱即匯編程序AREA偽操作定義的名稱。

圖13.4 鏈接程序放置規(guī)則

③ 在輸入段中,獨立對象的代碼和數(shù)據(jù),按照對象文件在鏈接程序命令行中被指定的順序放置。

要精確放置代碼和數(shù)據(jù),ARM公司建議不要過分依靠這些規(guī)則。相反,必須使用分散加載機(jī)制來完全控制代碼和數(shù)據(jù)的放置。請參閱下一章的調(diào)整映像存儲器映射以適應(yīng)目標(biāo)系統(tǒng)硬件存儲器的實際要求。

13.2.5 應(yīng)用程序啟動

多數(shù)嵌入式系統(tǒng)中,執(zhí)行主任務(wù)前,執(zhí)行初始化序列來設(shè)置系統(tǒng)。默認(rèn)的RVCT初始化序列如圖13.5所示。

圖13.5 默認(rèn)RVCT初始化序列

在進(jìn)入用戶代碼(main())前,初始化序列可分成三個功能塊:__main直接跳轉(zhuǎn)到__scatterload;__scatterload負(fù)責(zé)建立運行時的映像存儲器映射,而__rt_entry(運行時的入口)則負(fù)責(zé)初始化C庫。

__scatterload執(zhí)行代碼和數(shù)據(jù)復(fù)制以及ZI數(shù)據(jù)的清零。對于ZI數(shù)據(jù)的清零和未改變的RW數(shù)據(jù)來說,這一步總是要做的。

__scatterload跳轉(zhuǎn)到__rt_entry。它設(shè)置應(yīng)用程序的棧和堆,初始化庫函數(shù)及其靜態(tài)數(shù)據(jù),并調(diào)用任何全局聲明的對象的構(gòu)造函數(shù)(僅C++)。

然后__rt_entry跳轉(zhuǎn)到應(yīng)用程序入口main()。主應(yīng)用程序結(jié)束執(zhí)行時,__rt_entry將庫關(guān)閉,然后把控制權(quán)交還給調(diào)試器。

RVCT中,函數(shù)main()有一個特殊含意。main()函數(shù)的存在強(qiáng)制鏈接程序鏈接到__main和__rt_entry中的初始化代碼。沒有main()函數(shù),就不會鏈接到初始化進(jìn)程,那么一些標(biāo)準(zhǔn)C庫功能就不會得到支持。



[1] 在一些ARM的中文參考文獻(xiàn)中,將Semihosting譯為半主機(jī)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉