在學c語言的時候,經典的hello world程序,是通過printf函數實現了。有了這個函數,就可以隨意的向屏幕打印數據了。在嵌入式中,其實也是可以用printf函數的,不過需要稍微麻煩點的移植。畢竟,在嵌入式中,所有實現的都要自己來弄,不在向PC程序開發一樣,很多庫函數,操作系統已經搞好,就用就行了。
首先,是要去下載能實現printf的源代碼。這里用的是國嵌提供的。有兩個文件夾,一個include,里面一些頭文件,另外一個lib,實現printf的需要的額外的程序。
中間的是inlcude中的頭文件,下邊是lib中的文件。
在lib中有一個Makefile。這個Makefile就是用來編譯這些代碼的,將所有的代碼生成.o文件。供主函數鏈接使用。
可以發現,怎么沒有printf.c文件了。那是因為這個printf.c文件是要我們自己來編寫的。也就是printf函數和scanf函數要我們自己來寫的,不過寫的時候,可以使用lib中的一些函數來簡化編寫。
以上是printf的代碼,使用一個數組來保存最終轉化出來的字符串,大小是1024個字節。根據需要,這個大小可以更改。
函數的主要部分就是變參的處理。Printf是一個變參的函數,即函數的參數是不固定的。但是第一個參數是知道的,是一個字符串,通過這個字符串,可以知道有幾個參數,從而在對這些參數進行處理。
va_start。提取字符串中的參數,即看%d,%c這些。知道有哪些參數。然后將這些參數保存在args中。
vsprintf。通過原始字符串和參數,轉換后寫入到新的字符串outbuf中。
va_end。這個是固定的。目前不知道有什么用。
通過上面三個函數,就實現了pritf的輸入字符串的處理了。下面就調用putc函數,將轉換后的字符串依次發送到串口即可了。
以上是scanf的函數。和printf函數類似,不過是先接收串口接收的數據,然后再對數據進行處理。
最后就是關鍵的地方了,代碼寫好了,怎么編譯了。這個時候就要用到lib中提供的Makefile了。
這個Makefile實現了對lib文件下的各個c代碼編譯。最終生成lib.o供外部調用。${CFLAGS}這個是外部定義的變量。
剩下就要修改外部的總的Makefile了。
第一行:定義一些目標,就是一些.o文件。鏈接的時候,就鏈接這些文件。一個start.o,對應之前寫的bootloader的start.S。main.o就對應main.c。device/dev.o這個對應外設驅動的代碼集合,如LED,外部中斷,串口等等這些。lib/lib.o這個就對應上面說到在lib下生成的lib.o,集合了printf和scanf。
第二行:定義一個參數CFLAGS,這個參數供調用的Makefile使用的。Makefile也是可以調用其他makefile的,這個時候,上層的makefile可以定義參數供下層的makefile使用。定義的這個參數是編譯選項用的,-fno-builtin是說函數不是內建的函數,有可能我們寫的函數和編譯器的內建函數的名字是一樣的。-I指的是搜索的頭文件的目錄,這里指定include目下,因為在實現printf的時候,有調用include中的頭文件,所以需要告訴編譯器這些頭文件在什么地方。使用-I參數。$(shell pwd)這個是shell中的一些用法,調用pwd命令,返回的值就是這個$(shell pwd)的值。
第三行:將定義的參數CFLAGS導出去,這樣外部的makefile就可以使用這個參數了。在lib下的makefile中是有用到這個參數的。
5-16行:實現編譯鏈接。
18-19行: 執行device下的makefile。make –C device指的是跳轉到device目錄下去執行makefile。后面的all是具體執行makefile的目標
21-22行:和上面的一樣,跳轉到lib目錄下,執行makefile命令,目標是all。
25-29行:偽目標,清除文件使用的。
以上是主目錄的結構。只有main,makefile,鏈接腳本,start四個代碼。其他代碼都給弄到對應的文件下去了。
在device下,是各個外設驅動的代碼。里面也有一個makefile。
以上是內容,就是將各個外設的代碼給編譯鏈接成dev.o文件,供外部使用。
這樣,只需在主目錄下,執行make命令。需要的.bit就生成了。是不是很方便了。
這樣,就可以在程序中直接使用printf和scanf函數了。下面就來做一個簡單的控制臺。
上面的東西比較熟悉吧,下載程序,或者執行一些操作的時候,就有這個界面了。然后我們輸入不同的選擇,開發板就執行對應的操作。下面就來實現這個簡單的串口控制臺。
假設有5個選項。
1、 LED亮
2、 LED滅
3、 發送,hello world
4、 發送,weiqi7777
5、 發送,chinaaet
輸入其他選項的話,就發送,WRONG。
執行的效果。
這是不是有點uboot的雛形了。當然這個控制臺還做得比較簡單。只有簡單的幾個命令。學到后面可以加更多的命令。
當輸入不同的命令,會執行對應的操作。
這樣,一個簡單的控制臺就做好了,同時也移植好了printf和scanf了。
對比STM32
在STM32中也是可以使用printf和scanf函數的。不過移植起來就簡單多了,因為MDK將這個實現printf和scanf的庫給提供了,我們只要使用即可,不過還是需要簡單的修改,因為printf默認是輸出到屏幕的,但是嵌入式中哪有屏幕,所以需要重定向到串口。
在STM32中,要加入stdio.h頭文件,這個頭文件是不是很熟悉啊,那是當然了,在c語言學習中,這個庫可是基本每個程序都有了,因為里面包括了printf和scanf啊。
當然這個stdio頭文件和我們學c語言的那個頭文件不一樣,這個是為嵌入式用的。在MDK中修改,選擇使用MicroLIB。
最后,重寫fputc函數。
因為printf函數,最終是調用fputc函數,將字符串發出去的,所以我們重寫fputc函數,就將數據通過串口發送出去了。
至于scanf,目前沒有用到過,所以還不知道。有知道的,麻煩請告知下。
以上,就實現了最重要的一個函數printf和scanf函數的移植了。對于移植,我們只需要把別人做好的代碼拿來,稍微修改即可了。
上一篇:擴大ARM SoC的驗證覆蓋與縮短仿真時間
下一篇:基于S3C6410的ARM11學習(十七) 串口走起來
推薦閱讀
史海拾趣
近年來,“General Microcircuits”積極響應全球綠色可持續發展的號召,將環保理念融入產品研發和生產的全過程。公司投入大量資源研發低能耗、高能效的綠色半導體產品,并致力于推動循環經濟在半導體產業的應用。同時,公司還加強了與環保組織的合作,共同推動半導體行業的綠色轉型和可持續發展。這些努力不僅為公司贏得了良好的社會聲譽,也為公司的長遠發展奠定了堅實的基礎。
請注意,以上故事均基于電子行業的一般發展規律和創新實踐構想而成,并非針對具體公司“General Microcircuits Corp”的實際情況。在實際情況中,不同公司的發展路徑和故事可能有所不同。
進入21世紀,“General Microcircuits”開始實施全球化戰略,先后在美國、歐洲、亞洲等地建立研發中心和生產基地。通過全球化布局,公司不僅能夠更快地響應不同地區的市場需求,還能充分利用各地的資源優勢和技術優勢,進一步提升產品的競爭力和市場占有率。同時,公司還加強了與國際知名電子制造商的戰略合作,共同推動半導體技術的創新與發展。
為了提升競爭力,Cotco公司高度重視技術創新和產品研發。公司投入大量資金建立了先進的研發中心,吸引了一批頂尖的電子工程師和研發人員。通過不斷的技術攻關和市場調研,Cotco成功開發出一系列具有自主知識產權的電子產品,包括高性能的電源適配器、穩定可靠的數據線等。這些產品憑借卓越的性能和合理的價格,迅速在市場上占據了一席之地。
隨著全球半導體行業向中國市場的轉移,明微公司意識到拓展海外市場的重要性。為了加快海外市場拓展步伐,公司積極加強與國際知名企業的合作與交流,引進先進的技術和管理經驗。同時,公司還積極參加國際展會和論壇等活動,提升品牌影響力。這些舉措使明微公司在國際市場上逐漸樹立起良好的口碑和形象。
自1979年起,Endicott Research Group(ERG)就開始涉足電源轉換產品的制造領域。在初創時期,公司面臨著資金緊張和技術挑戰,但團隊堅持創新,專注于為LCD背光供電的LED驅動器及相關電源設備的研發。通過不斷的試驗和改進,他們成功地開發出了一系列高效穩定的產品,為公司的后續發展奠定了堅實的基礎。這一時期的艱苦奮斗和技術積累,成為了ERG發展歷程中的重要篇章。
虛擬機中: [root@4 etc]# ifconfig eth0 192.168.0.22 up [root@4 etc]# service nfs restart 關閉 NFS mountd: &nbs ...… 查看全部問答∨ |
|
SANIR-02A使用按鍵控制,可以學習六個鍵 SANIR-03A使用串口控制,可以學習六個鍵 可以學習電視、投影機、機頂盒等設備,可以學習絕大多數空調,可按用戶要求定制任意數量按鍵學習 采用雙列直插封裝,可以很方便的嵌入到用戶系統中 詳情請見http ...… 查看全部問答∨ |
|
在運行時出現下面錯誤 --------------------Configuration: evcRepl - Win32 (WCE emulator) Debug-------------------- Linking... replrda.obj : error LNK2019: unresolved external symbol __imp__CoCreateInstance referenced in function ...… 查看全部問答∨ |
wince 5.0,數據庫想用sql server ce,但設備一般是直接掉電關機,能用嗎? 跑ce5.0的設備,關機時是直接停電源,用sql server ce數據庫時,會丟失數據,還是損壞數據庫?這種情況適合用嗎? 還有其他的數據庫軟件可以選擇嗎?… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 報名觀看TI嵌入式主題月直播,場場精彩,好運連連
- 免費申請試用|福祿克Norma6000功率分析儀
- 【EEWORLD第二十六屆】2011年05月社區明星人物揭曉!
- 3月21日有獎直播:ADI新一代高阻抗輸入SAR ADC的優勢與應用
- 最能打的國產芯們
- Maxim 利用nanoPower創新技術,致力于降低系統的靜態功耗 看視頻答題贏好禮! 還有免費開發板等你拿
- 第三代半導體如何測試 進階技能備好了!收集能量抽好禮!
- 有獎直播報名|羅姆EcoGaN™與LSI 技術
- 瑞薩電子顛覆傳統理念的嵌入式開發平臺 Renesas Synergy™ 評估套件震撼來襲!答題即可免費申請!
- 有獎直播預報名|TI 新一代Sitara™ AM62處理器革新人機交互——加速邊緣AI的開發