熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專欄

EEPW首頁(yè) > 博客 > ARM的Semihosting技術(shù)

ARM的Semihosting技術(shù)

發(fā)布人:電子禪石 時(shí)間:2019-12-25 來(lái)源:工程師 發(fā)布文章

ARM的Semihosting技術(shù)(轉(zhuǎn))        

Semihosting技術(shù)將應(yīng)用程序中的IO請(qǐng)求通過(guò)一定的通道傳送到主機(jī)(host),由主機(jī)上的資源響應(yīng)應(yīng)用程序的IO請(qǐng)求, 而不是像在主機(jī)上執(zhí)行本地應(yīng)用程序一樣,由應(yīng)用程序所在的計(jì)算機(jī)響應(yīng)應(yīng)用程序IO請(qǐng)求, 也就是將目標(biāo)板的輸入/輸出請(qǐng)求從應(yīng)用程序代碼傳遞到遠(yuǎn)程運(yùn)行調(diào)試器的主機(jī)的一種機(jī)制。 簡(jiǎn)單來(lái)說(shuō),目標(biāo)開(kāi)發(fā)板上通常不會(huì)有輸入/輸出這些外設(shè),開(kāi)發(fā)板運(yùn)行的代碼想要將結(jié)果打印出來(lái), 或者獲得用戶的輸入,可以通過(guò)請(qǐng)求遠(yuǎn)程主機(jī)IO設(shè)備來(lái)實(shí)現(xiàn),如:顯示器,鍵盤(pán)等。 目標(biāo)開(kāi)發(fā)板執(zhí)行代碼中加入對(duì)輸入/輸出設(shè)備進(jìn)行訪問(wèn)函數(shù),如:printf,scanf等, 這些函數(shù)并不是目標(biāo)開(kāi)發(fā)板的庫(kù)函數(shù),而是遠(yuǎn)程主機(jī)交叉編譯器中帶有的庫(kù)函數(shù),這些庫(kù)函數(shù)被編譯時(shí),編譯成一條軟件中斷指令。 當(dāng)目標(biāo)開(kāi)發(fā)板上電運(yùn)行之后,執(zhí)行到請(qǐng)求訪問(wèn)輸入/輸出設(shè)備指令時(shí),產(chǎn)生特定中斷號(hào)的軟件中斷SWI, 與開(kāi)發(fā)板相連的調(diào)試器會(huì)先截獲目標(biāo)板SWI請(qǐng)求,由于開(kāi)發(fā)板程序中也可能存在用戶自定義軟件中斷, 為了區(qū)分二者,調(diào)試器會(huì)根據(jù)SWI的軟中斷號(hào)來(lái)判斷是不是semihosting模式IO請(qǐng)求, 如果是,則取出R0寄存器里代表的具體請(qǐng)求號(hào),然后使用遠(yuǎn)程主機(jī)來(lái)響應(yīng)目標(biāo)板具體IO請(qǐng)求, 而不是開(kāi)發(fā)板本身去處理setmihosting請(qǐng)求。 semihosting僅僅是一種調(diào)試手段,它的工作原理就是利用調(diào)試器捕捉目標(biāo)環(huán)境運(yùn)行過(guò)程中產(chǎn)生SWI中斷, 然后向遠(yuǎn)程主機(jī)調(diào)試環(huán)境發(fā)送對(duì)應(yīng)的調(diào)試信息。 也就是說(shuō)目標(biāo)開(kāi)發(fā)板通過(guò)特定的軟件中斷指令,借用了遠(yuǎn)程主機(jī)的輸入輸出設(shè)備實(shí)現(xiàn)IO請(qǐng)求的訪問(wèn)。

Semihosting半主機(jī)調(diào)試模式,只能使用在開(kāi)發(fā)板和調(diào)試主機(jī)通過(guò)仿真器連接的情況下, 也就是說(shuō)脫離了主機(jī)調(diào)試環(huán)境上述代碼不能正常運(yùn)行。 目標(biāo)開(kāi)發(fā)板上執(zhí)行的IO實(shí)際上是交給了遠(yuǎn)程主機(jī)來(lái)處理實(shí)現(xiàn),正是因?yàn)槿绱耍@種方式只適合在調(diào)試模式下, 真正的嵌入式系統(tǒng)不可能依賴于主機(jī)實(shí)現(xiàn)IO處理的,嵌入式系統(tǒng)要想獨(dú)立出來(lái)實(shí)現(xiàn)IO請(qǐng)求的處理, 這就需要將輸入輸出庫(kù)函數(shù)的底層相關(guān)硬件實(shí)現(xiàn)重定向。

使用ITM機(jī)制實(shí)現(xiàn)調(diào)試,實(shí)現(xiàn)printf與scanf, ITM是ARM在推出semihosting之后推出的新一代調(diào)試機(jī)制。

ITM機(jī)制要求使用SWD方式接口,并需要連接SWO線。

 

半主機(jī)是用于 ARM 目標(biāo)的一種機(jī)制,可將來(lái)自應(yīng)用程序代碼的輸入/輸出請(qǐng)求傳送至運(yùn)行調(diào)試器的主機(jī)。 例如,使用此機(jī)制可以啟用 C 庫(kù)中的函數(shù),如 printf() 和 scanf(),來(lái)使用主機(jī)的屏幕和鍵盤(pán),而不是在目標(biāo)系統(tǒng)上配備屏幕和鍵盤(pán)。

這種機(jī)制很有用,因?yàn)殚_(kāi)發(fā)時(shí)使用的硬件通常沒(méi)有最終系統(tǒng)的所有輸入和輸出設(shè)備。 半主機(jī)可讓主機(jī)來(lái)提供這些設(shè)備。

 

半主機(jī)是通過(guò)一組定義好的軟件指令(如 SVC)來(lái)實(shí)現(xiàn)的,這些指令通過(guò)程序控制生成異常。 應(yīng)用程序調(diào)用相應(yīng)的半主機(jī)調(diào)用,然后調(diào)試代理處理該異常。 調(diào)試代理提供與主機(jī)之間的必需通信。

 

半主機(jī)接口對(duì) ARM 公司提供的所有調(diào)試代理都是通用的。 在無(wú)需移植的情況下使用 RealView ARMulator? ISS、指令集系統(tǒng)模型 (ISSM)、實(shí)時(shí)系統(tǒng)模型 (RTSM)、RealView ICE 或 RealMonitor 時(shí),會(huì)執(zhí)行半主機(jī)操作。

 

標(biāo)準(zhǔn)庫(kù)使用半主機(jī)模式,半主機(jī)是通過(guò)一組定義好的軟件指令 (如 SVC)SVC 指令 (以前稱為 SWI 指令)來(lái)實(shí)現(xiàn)的,這些指令通過(guò)程序控制生成異常。 應(yīng)用程序調(diào)用相應(yīng)的半主機(jī)調(diào)用,然后調(diào)試代理處理該異常。調(diào)試代理(這里的調(diào)試代理是仿真器)提供與主機(jī)之間的必需通信。也就是說(shuō)使用半主機(jī)模式必須使用仿真器調(diào)試。

 

ARMv7 之前的 ARM 處理器使用 SVC 指令 (以前稱為 SWI 指令)進(jìn)行半主機(jī)調(diào)

 

用。 但是,如果要為 ARMv6-M 或 ARMv7-M (如 Cortex?-M1 或 Cortex-M3 處

 

理器)進(jìn)行編譯,請(qǐng)使用 BKPT 指令來(lái)實(shí)現(xiàn)半主機(jī)。 簡(jiǎn)單的來(lái)說(shuō),半主機(jī)模式就是通過(guò)仿真器實(shí)現(xiàn)開(kāi)發(fā)板在電腦上的輸入和輸出。和半主機(jī)模式功能相同的是ITM調(diào)試機(jī)制。 有關(guān)ITM調(diào)試機(jī)制可以參考這里http://www.douban.com/note/248637026/        上面介紹的半主機(jī)和ITM功能相當(dāng),他們都是調(diào)試機(jī)制,開(kāi)發(fā)板均借助仿真器與電腦連接,實(shí)現(xiàn)單片機(jī)利用主機(jī)的屏幕鍵盤(pán)的輸入輸出。這兩種機(jī)制的運(yùn)行均需要仿真器,否則無(wú)法運(yùn)行。       開(kāi)發(fā)式一般單片機(jī)需要獨(dú)立運(yùn)行,開(kāi)發(fā)者應(yīng)去掉仿真器,把printf函數(shù)通過(guò)單片機(jī)的外設(shè)來(lái)實(shí)現(xiàn),例如通過(guò)開(kāi)發(fā)板的串口,lcd或者sd卡。 

 MDK中通常使用以下兩種方法:

方法1.使用微庫(kù),因?yàn)槭褂梦?kù)的話,不會(huì)使用半主機(jī)模式.int fputc(int ch, FILE *f){      while((USART1->SR&0X40)==0);     USART1->DR = (u8) ch;      return ch; }  方法2.仍然使用標(biāo)準(zhǔn)庫(kù),在主程序添加下面代碼:

#pragma import(__use_no_semihosting)     //不使用半主機(jī)模式           //標(biāo)準(zhǔn)庫(kù)需要的支持函數(shù)                  struct __FILE  {  int handle;  };  FILE __stdout;        //定義_sys_exit()以避免使用半主機(jī)模式     _sys_exit(int x)  {  x = x;  }  //重定義fputc函數(shù)  int fputc(int ch, FILE *f) {  USART_SendData(USART1,ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);   return ch; }

關(guān)于 microlibmicrolib 是缺省 C 庫(kù)的備選庫(kù)。 它用于必須在極少量?jī)?nèi)存環(huán)境下運(yùn)行的深層嵌入式應(yīng)用程序。 這些應(yīng)用程序不在操作系統(tǒng)中運(yùn)行。microlib 不會(huì)嘗試成為符合標(biāo)準(zhǔn)的 ISO C 庫(kù)。microlib 進(jìn)行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫(kù)少,并且根本不具備某些 ISO C 特性。某些庫(kù)函數(shù)的運(yùn)行速度也比較慢,例如,memcpy()。上面給出了正確的方法,我在測(cè)試的過(guò)程中發(fā)現(xiàn)方法二中注釋掉#pragma import(__use_no_semihosting) 程序依然運(yùn)行正確,這個(gè)很讓人費(fèi)解,是否是keil本身就沒(méi)有半主機(jī)模式???????以下是測(cè)試現(xiàn)象1、假如程序中有printf等函數(shù),如果使用微庫(kù)或者禁用半主機(jī),沒(méi)有重定義fputc函數(shù),程序可以運(yùn)行,但不知道結(jié)果打印到主機(jī)的哪個(gè)地方去了。2、假如程序中有printf等函數(shù),既沒(méi)有禁用半主機(jī)也沒(méi)有重定義fputc函數(shù),程序?qū)⒁恢蓖T谥袛嗵帲缦聢D,結(jié)論:如果用了庫(kù)函數(shù)而沒(méi)有勾選微庫(kù),則不能夠進(jìn)行在線仿真。 3、若程序中假如程序中有fopen、fread等函數(shù),重定義fputc函數(shù),既沒(méi)有禁用半主機(jī)也沒(méi)有重定義fopen、fread這些函數(shù),編譯會(huì)報(bào)錯(cuò):Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and usart.o).為什么是重復(fù)定義,還未搞清楚。打開(kāi)微庫(kù)就不會(huì)報(bào)錯(cuò),但是其實(shí)也是存在問(wèn)題,這些函數(shù)也并未實(shí)現(xiàn)其功能。 

大部分資料都是禁用了半主機(jī)模式,沒(méi)有使用過(guò)半主機(jī)模式借助主機(jī)的鍵盤(pán)輸入?yún)?shù),看了很多資料,都是講半主機(jī)的,但講的內(nèi)容太淺顯,

我沒(méi)有學(xué)會(huì)使用半主機(jī),更多的是學(xué)會(huì)了禁用半主機(jī)模式,我們好像忽略了半主機(jī)模式的意義。另外,我們可以查到的大部分資料講解的大同小異,它們更多的告訴我們正確的步驟,而不是讓我們從源頭了解一個(gè)問(wèn)題,當(dāng)然,大部分人看重的是實(shí)用,問(wèn)題解決了,也就不再去思考背后的原理。最有效最直接最權(quán)威的資料是mdk官方給出的資料,但是資料內(nèi)容太多,看起來(lái)太多,不易懂,大部分人沒(méi)有看下去的欲望。我們應(yīng)該讓使用手冊(cè)看起來(lái)更直觀,更易懂,更方便查閱,更高效地查閱。

 

 

      在keil5中,不管是否使用Semihosting,使用printf,scanf,fopen,fread等都需要自己填充底層函數(shù),以printf為例,需要補(bǔ)充定義fputc(Keil是否不支持Host-semi機(jī)制,即不支持直接在IDE打印字符串?)

特別注意:在keil中串口打印窗口和邏輯分析窗口僅在軟件仿真的時(shí)候可用,而MDK5對(duì)STM32F4的軟件仿真,基本上不支持(故本教程直接沒(méi)有對(duì)軟件仿真進(jìn)行介紹了),所以,基本上這兩個(gè)窗口用不著。但是對(duì)STM32F1的軟件仿真,MDK5是支持的,在F1開(kāi)發(fā)的時(shí)候,可以用到。所以基于STM32F4的軟件仿真在keil5中很少用到。

 

 

     在IAR中,選擇Semihosting后,不用自己實(shí)現(xiàn)填充printf,scanf,fopen,fread等底層函數(shù),就可以在terminal I/O界面實(shí)現(xiàn)prrint,scanf等的測(cè)試,可以在工程目錄下實(shí)現(xiàn)文件操作。

 

疑問(wèn)研究后的結(jié)論:

      使用keil在半主機(jī)模式下,若是使用printf、 fopen等庫(kù)函數(shù)庫(kù)函數(shù)調(diào)用,會(huì)進(jìn)入半主機(jī)模式,發(fā)生軟件異常,若此時(shí)有半主機(jī)調(diào)試環(huán)境的支持(RealView ISS、ISSM、RealView ICE 和 RealMonitor)進(jìn)而通過(guò)調(diào)試器與主機(jī)進(jìn)行交互,則可以進(jìn)入半主機(jī)模式。但是本人使用的是JLINK V9調(diào)試器,此調(diào)試器應(yīng)該是不支持半主機(jī)的調(diào)試。所以程序會(huì)進(jìn)入一個(gè)錯(cuò)誤的BKPT 0xAB狀態(tài)。得出結(jié)論:并不是keil5完全不支持半主機(jī)調(diào)試,是需要完全具備半主機(jī)調(diào)試的所有軟硬件平臺(tái)條件后才可以用半主機(jī)來(lái)調(diào)試代碼。所以,大多數(shù)情況下,需要使用相關(guān)宏(#pragma import(__use_no_semihosting))和重定義底層IO函數(shù)的方法來(lái)避免使用半主機(jī)。

 

參考鏈接:

http://www.eeworld.com.cn/mcu/article_2016122632650.html

以及keil5的官方幫助文檔。

 

 另外:IAR、KEIL都可以使用ITM跟蹤調(diào)試功能,可參考下面鏈接

https://www.jianshu.com/p/0255097f594e


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉