資料介紹
13.3 調(diào)整C庫使其適應(yīng)目標(biāo)硬件
默認(rèn)情況下,C庫利用semihosting機制來提供設(shè)備驅(qū)動級的功能,使得主機能夠用作輸入和輸出設(shè)備。這種機制對于嵌入式開發(fā)十分有用,因為用于開發(fā)的硬件系統(tǒng)通常沒有最終系統(tǒng)的輸入和輸出設(shè)備。
本節(jié)介紹如何重定向代碼中的Semihosting庫函數(shù),使其真正適用目標(biāo)系統(tǒng)。
13.3.1 C庫函數(shù)重定向
所謂C庫函數(shù)重定向,就是用戶使用自己編寫的函數(shù)代碼代替C庫中的函數(shù),使最終程序更適用于實際的目標(biāo)硬件。圖13.6顯示了C庫函數(shù)重定向的過程。

圖13.6 C庫函數(shù)重定向
最簡單的函數(shù)重定向的例子就是用戶希望fputc()函數(shù)能夠?qū)⒆址麖哪繕?biāo)系統(tǒng)的串口輸出而不是在調(diào)試時將字符從調(diào)試器的控制臺輸出。這時就需要重新實現(xiàn)該函數(shù)。下面的例子將fputc()的輸入字符參數(shù)重新指向一連續(xù)輸出函數(shù)sendchar(),將該例在一個獨立的源文件中實現(xiàn)的。這樣,fputc()在依目標(biāo)而定的輸出和C庫標(biāo)準(zhǔn)輸出函數(shù)之間充當(dāng)一個抽象層。
例子程序的代碼如下所示。
extern void sendchar(char *ch);
int fputc(int ch, FILE *f)
{ /* 向UART寫一個字符 */
char tempch = ch;
sendchar(&tempch);
return ch;
}
13.3.2 從最終代碼映像中去掉Semihosting
在一個實際的應(yīng)用程序中,不可能支持Semihosting的SWI操作機制。因此,必須在最終的代碼映像中去掉C庫中的Semihosting函數(shù)。
為確保最終映像文件中沒有鏈接Semihosting的SWI的函數(shù),必須引入符號__use_no_semihosting_swi。使用方法如下所示。
· 在C模塊中,使用#pragma命令:
#pragma import(__use_no_semihosting_swi)
· 在匯編語言模塊中,使用IMPORT命令:
IMPORT __use_no_semihosting_swi
如果在程序中引入了__use_no_semihosting_swi,但最終映像仍鏈接了Semihosting庫,鏈接器會報告如下錯誤:
Error: L6200E: Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o)。
為幫助找出這些使用了Semihosting的函數(shù),可以使用-verbose鏈接選項。這樣,在輸出結(jié)果中,C庫函數(shù)將被標(biāo)以__I_use_semihosting_swi的標(biāo)記。下面這段鏈接器的輸出顯示了使用-verbose鏈接選項后的結(jié)果。
Loading member sys_exit.o from c_a__un.l.
definition: _sys_exit
reference : __I_use_semihosting_swi
這時,要使程序正確執(zhí)行,用戶必須為標(biāo)記了的函數(shù)提供自己的實現(xiàn)方法。
注意鏈接器不會報告應(yīng)用程序代碼中的任何使用Semihosting SWI 的函數(shù)。只有當(dāng)從 C 庫鏈接了使用Semihosting SWI 的函數(shù)時才發(fā)生錯誤。
?
默認(rèn)情況下,C庫利用semihosting機制來提供設(shè)備驅(qū)動級的功能,使得主機能夠用作輸入和輸出設(shè)備。這種機制對于嵌入式開發(fā)十分有用,因為用于開發(fā)的硬件系統(tǒng)通常沒有最終系統(tǒng)的輸入和輸出設(shè)備。
本節(jié)介紹如何重定向代碼中的Semihosting庫函數(shù),使其真正適用目標(biāo)系統(tǒng)。
13.3.1 C庫函數(shù)重定向
所謂C庫函數(shù)重定向,就是用戶使用自己編寫的函數(shù)代碼代替C庫中的函數(shù),使最終程序更適用于實際的目標(biāo)硬件。圖13.6顯示了C庫函數(shù)重定向的過程。

圖13.6 C庫函數(shù)重定向
最簡單的函數(shù)重定向的例子就是用戶希望fputc()函數(shù)能夠?qū)⒆址麖哪繕?biāo)系統(tǒng)的串口輸出而不是在調(diào)試時將字符從調(diào)試器的控制臺輸出。這時就需要重新實現(xiàn)該函數(shù)。下面的例子將fputc()的輸入字符參數(shù)重新指向一連續(xù)輸出函數(shù)sendchar(),將該例在一個獨立的源文件中實現(xiàn)的。這樣,fputc()在依目標(biāo)而定的輸出和C庫標(biāo)準(zhǔn)輸出函數(shù)之間充當(dāng)一個抽象層。
例子程序的代碼如下所示。
extern void sendchar(char *ch);
int fputc(int ch, FILE *f)
{ /* 向UART寫一個字符 */
char tempch = ch;
sendchar(&tempch);
return ch;
}
13.3.2 從最終代碼映像中去掉Semihosting
在一個實際的應(yīng)用程序中,不可能支持Semihosting的SWI操作機制。因此,必須在最終的代碼映像中去掉C庫中的Semihosting函數(shù)。
為確保最終映像文件中沒有鏈接Semihosting的SWI的函數(shù),必須引入符號__use_no_semihosting_swi。使用方法如下所示。
· 在C模塊中,使用#pragma命令:
#pragma import(__use_no_semihosting_swi)
· 在匯編語言模塊中,使用IMPORT命令:
IMPORT __use_no_semihosting_swi
如果在程序中引入了__use_no_semihosting_swi,但最終映像仍鏈接了Semihosting庫,鏈接器會報告如下錯誤:
Error: L6200E: Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o)。
為幫助找出這些使用了Semihosting的函數(shù),可以使用-verbose鏈接選項。這樣,在輸出結(jié)果中,C庫函數(shù)將被標(biāo)以__I_use_semihosting_swi的標(biāo)記。下面這段鏈接器的輸出顯示了使用-verbose鏈接選項后的結(jié)果。
Loading member sys_exit.o from c_a__un.l.
definition: _sys_exit
reference : __I_use_semihosting_swi
這時,要使程序正確執(zhí)行,用戶必須為標(biāo)記了的函數(shù)提供自己的實現(xiàn)方法。
注意鏈接器不會報告應(yīng)用程序代碼中的任何使用Semihosting SWI 的函數(shù)。只有當(dāng)從 C 庫鏈接了使用Semihosting SWI 的函數(shù)時才發(fā)生錯誤。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式軟件開發(fā)入門
- 嵌入式軟件開發(fā)的特點、設(shè)計流程、嵌入式軟件的結(jié)構(gòu)
- 嵌入式軟件開發(fā)需要懂的硬件基礎(chǔ)
- 嵌入式軟件開發(fā)好,還是硬件開發(fā)好?
- 嵌入式軟件開發(fā)做什么?嵌入式開發(fā)培訓(xùn)學(xué)哪些
- 嵌入式軟件開發(fā)是什么??
- 嵌入式軟件之c語言編碼規(guī)范 29次下載
- 嵌入式軟件開發(fā)環(huán)境
- 關(guān)于做嵌入式軟件開發(fā)和普通桌面軟件開發(fā)的區(qū)別問題
- 解析嵌入式軟件開發(fā)語言:嵌入式C編程
- 嵌入式Linux與物聯(lián)網(wǎng)軟件開發(fā)C語言內(nèi)核深度解析書籍的介紹
- 基于嵌入式軟件開發(fā)中構(gòu)件技術(shù)的研究 6次下載
- 嵌入式軟件開發(fā)概述 3次下載
- ARM嵌入式軟件開發(fā) 65次下載
- 嵌入式軟件開發(fā)與Embedded-GIS 36次下載
- 嵌入式軟件開發(fā)和軟件開發(fā)的區(qū)別 3.8k次閱讀
- 聊一聊嵌入式C語言 1.2k次閱讀
- 如何為嵌入式軟件開發(fā)選擇編譯器 1.6k次閱讀
- 嵌入式軟件架構(gòu)設(shè)計之程序分層 2.7k次閱讀
- 基于UML嵌入式軟件開發(fā)環(huán)境的自動取款機系統(tǒng)的應(yīng)用方案 4.3k次閱讀
- 基于嵌入式軟件的JNI技術(shù)應(yīng)用解析 1.4k次閱讀
- 詳解嵌入式軟件開發(fā)到FPGA開發(fā) 7k次閱讀
- 把軟件項目管理方法引入嵌入式系統(tǒng)的開發(fā)之中的設(shè)計淺析 2.6k次閱讀
- 嵌入式軟件開發(fā)編程規(guī)范介紹 5k次閱讀
- 嵌入式軟件開發(fā)的這些編程規(guī)范你了解嗎 4.6k次閱讀
- 嵌入式軟件工程師職業(yè)規(guī)劃必知 7.1k次閱讀
- 嵌入式開發(fā)和底層開發(fā)有什么區(qū)別 1.7w次閱讀
- 嵌入式C實現(xiàn)延時程序的不同變量的區(qū)別 幾種Linux嵌入式開發(fā)環(huán)境的簡單介紹 2.2k次閱讀
- 嵌入式軟件工程師和嵌入式硬件工程師有什么區(qū)別 8.3w次閱讀
- 學(xué)嵌入式開發(fā)入門_學(xué)嵌入式開發(fā)需要看哪些書籍 3.9w次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊
- 0.74 MB | 1次下載 | 免費
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產(chǎn)品手冊
- 0.43 MB | 1次下載 | 免費
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創(chuàng)新應(yīng)用
- 3.11 MB | 43次下載 | 免費
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場景
- 3.05 MB | 12次下載 | 免費
- 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學(xué)習(xí)資源包
- 10.55 MB | 8次下載 | 免費
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論