嵌入式軟件開(kāi)發(fā)之調(diào)整C庫(kù)使其適應(yīng)目標(biāo)硬件解析
2017-10-19 |
rar |
0.6 MB |
次下載 |
1積分
資料介紹
13.3 調(diào)整C庫(kù)使其適應(yīng)目標(biāo)硬件
默認(rèn)情況下,C庫(kù)利用semihosting機(jī)制來(lái)提供設(shè)備驅(qū)動(dòng)級(jí)的功能,使得主機(jī)能夠用作輸入和輸出設(shè)備。這種機(jī)制對(duì)于嵌入式開(kāi)發(fā)十分有用,因?yàn)橛糜陂_(kāi)發(fā)的硬件系統(tǒng)通常沒(méi)有最終系統(tǒng)的輸入和輸出設(shè)備。
本節(jié)介紹如何重定向代碼中的Semihosting庫(kù)函數(shù),使其真正適用目標(biāo)系統(tǒng)。
13.3.1 C庫(kù)函數(shù)重定向
所謂C庫(kù)函數(shù)重定向,就是用戶使用自己編寫(xiě)的函數(shù)代碼代替C庫(kù)中的函數(shù),使最終程序更適用于實(shí)際的目標(biāo)硬件。圖13.6顯示了C庫(kù)函數(shù)重定向的過(guò)程。

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

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





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