娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月09日(星期日)

正在發生

2021年02月09日 | 基于S3C6410的ARM11學習(十八) 移植printf和scanf

發布者:恬淡如云 來源: eefocus關鍵字:S3C6410  ARM11  bootloader 手機看文章 掃描二維碼
隨時隨地手機看文章

在學c語言的時候,經典的hello world程序,是通過printf函數實現了。有了這個函數,就可以隨意的向屏幕打印數據了。在嵌入式中,其實也是可以用printf函數的,不過需要稍微麻煩點的移植。畢竟,在嵌入式中,所有實現的都要自己來弄,不在向PC程序開發一樣,很多庫函數,操作系統已經搞好,就用就行了。


首先,是要去下載能實現printf的源代碼。這里用的是國嵌提供的。有兩個文件夾,一個include,里面一些頭文件,另外一個lib,實現printf的需要的額外的程序。

        clip_image006

        image

         image

中間的是inlcude中的頭文件,下邊是lib中的文件。


在lib中有一個Makefile。這個Makefile就是用來編譯這些代碼的,將所有的代碼生成.o文件。供主函數鏈接使用。


可以發現,怎么沒有printf.c文件了。那是因為這個printf.c文件是要我們自己來編寫的。也就是printf函數和scanf函數要我們自己來寫的,不過寫的時候,可以使用lib中的一些函數來簡化編寫。

clip_image008

以上是printf的代碼,使用一個數組來保存最終轉化出來的字符串,大小是1024個字節。根據需要,這個大小可以更改。


函數的主要部分就是變參的處理。Printf是一個變參的函數,即函數的參數是不固定的。但是第一個參數是知道的,是一個字符串,通過這個字符串,可以知道有幾個參數,從而在對這些參數進行處理。


va_start。提取字符串中的參數,即看%d,%c這些。知道有哪些參數。然后將這些參數保存在args中。


vsprintf。通過原始字符串和參數,轉換后寫入到新的字符串outbuf中。


va_end。這個是固定的。目前不知道有什么用。


通過上面三個函數,就實現了pritf的輸入字符串的處理了。下面就調用putc函數,將轉換后的字符串依次發送到串口即可了。

clip_image009

以上是scanf的函數。和printf函數類似,不過是先接收串口接收的數據,然后再對數據進行處理。


最后就是關鍵的地方了,代碼寫好了,怎么編譯了。這個時候就要用到lib中提供的Makefile了。

clip_image011

這個Makefile實現了對lib文件下的各個c代碼編譯。最終生成lib.o供外部調用。${CFLAGS}這個是外部定義的變量。


剩下就要修改外部的總的Makefile了。

clip_image013

第一行:定義一些目標,就是一些.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行:偽目標,清除文件使用的。

clip_image015

以上是主目錄的結構。只有main,makefile,鏈接腳本,start四個代碼。其他代碼都給弄到對應的文件下去了。

clip_image017

在device下,是各個外設驅動的代碼。里面也有一個makefile。

clip_image019

以上是內容,就是將各個外設的代碼給編譯鏈接成dev.o文件,供外部使用。


這樣,只需在主目錄下,執行make命令。需要的.bit就生成了。是不是很方便了。

clip_image021

這樣,就可以在程序中直接使用printf和scanf函數了。下面就來做一個簡單的控制臺。

clip_image023

上面的東西比較熟悉吧,下載程序,或者執行一些操作的時候,就有這個界面了。然后我們輸入不同的選擇,開發板就執行對應的操作。下面就來實現這個簡單的串口控制臺。


假設有5個選項。

1、  LED亮

2、  LED滅

3、  發送,hello world

4、  發送,weiqi7777

5、  發送,chinaaet

輸入其他選項的話,就發送,WRONG。

clip_image025

執行的效果。

clip_image027

這是不是有點uboot的雛形了。當然這個控制臺還做得比較簡單。只有簡單的幾個命令。學到后面可以加更多的命令。


當輸入不同的命令,會執行對應的操作。

         clip_image029

 這樣,一個簡單的控制臺就做好了,同時也移植好了printf和scanf了。


對比STM32


在STM32中也是可以使用printf和scanf函數的。不過移植起來就簡單多了,因為MDK將這個實現printf和scanf的庫給提供了,我們只要使用即可,不過還是需要簡單的修改,因為printf默認是輸出到屏幕的,但是嵌入式中哪有屏幕,所以需要重定向到串口。


在STM32中,要加入stdio.h頭文件,這個頭文件是不是很熟悉啊,那是當然了,在c語言學習中,這個庫可是基本每個程序都有了,因為里面包括了printf和scanf啊。

clip_image031

當然這個stdio頭文件和我們學c語言的那個頭文件不一樣,這個是為嵌入式用的。在MDK中修改,選擇使用MicroLIB。

clip_image033

最后,重寫fputc函數。

clip_image035

因為printf函數,最終是調用fputc函數,將字符串發出去的,所以我們重寫fputc函數,就將數據通過串口發送出去了。


至于scanf,目前沒有用到過,所以還不知道。有知道的,麻煩請告知下。


以上,就實現了最重要的一個函數printf和scanf函數的移植了。對于移植,我們只需要把別人做好的代碼拿來,稍微修改即可了。

關鍵字:S3C6410  ARM11  bootloader 引用地址:基于S3C6410的ARM11學習(十八) 移植printf和scanf

上一篇:擴大ARM SoC的驗證覆蓋與縮短仿真時間
下一篇:基于S3C6410的ARM11學習(十七) 串口走起來

推薦閱讀

特斯拉公布了2017財年第四季度及全年財報。根據特斯拉提供的財報,特斯拉第四季度總營收為32.88億美元,較上年同期的22.85億美元增長44%。而歸屬于股東的凈虧損為6.75億美元,和1.21億美元相比提升了擴大458%。??IT之家查閱了特斯拉的財報。特斯拉在財報中稱,第四季度交付1542輛Model 3,Model S和Model X交付量為28425輛創紀錄,環比增長10%...
汽車設計,一個聽起來極其枯燥乏味的工作,但是將它和游戲設備結合,那就變得有趣了。比如用VR(虛擬現實)設計工具來設計汽車,就讓人感覺時刻在玩一場汽車游戲。以往在設計汽車時,需要首先繪制出2D圖,然后再繪制3D圖,現在使用VR設備,就可以直接繪制出非常直觀的3D圖。這其中省去了許多步驟,可以加速汽車的開發。福特最近就在5個不同的設計工作室中...
(圖片來源:德克薩斯大學奧斯汀分校)據外媒報道,目前大多數電動汽車都使用鋰離子電池提供動力,但是鋰電池的續航時間仍然很有限。未來,高鎳層氧化物陰極材料將能夠增長電動汽車的續航里程,實現更便宜、性能更高的鋰離子電池。目前,大多數商用鋰離子電池的電極之一都含有大量的鈷。不過,鈷很昂貴,儲量也不是特別豐富,大大增加了鋰電池的制造成本。...
近日,山東監管局披露了新恒匯電子股份有限公司(以下簡稱“新恒匯電子”)首次公開發行股票并上市接受輔導的備案信息。據了解,新恒匯電子現已接受平安證券股份有限公司的輔導,并于2021年2月3日在山東證監局進行了輔導備案。官網顯示,新恒匯電子是集引線框架、模塊封裝、晶圓減薄劃片與測試為一體的集成電路企業,是國家金融卡芯片國產化聯盟26家成員單...

史海拾趣

問答坊 | AI 解惑

CMOS 和 TTL

CMOS 和 TTL的 \\基本知識…

查看全部問答∨

求助:水族智能控制器電路圖

本帖最后由 paulhyde 于 2014-9-15 09:41 編輯 求助: 請問誰有水族智能控制器的電路圖,幫忙一下,請發上來,謝謝!!!  …

查看全部問答∨

KEIL UVSION 3完整版

各位朋友,我在用單片機KEIL UVSION 編程軟件,可是該軟件有2K代碼限制,各位能否幫我想辦法弄到完整版的…

查看全部問答∨

創意絕對不在基礎

創意絕對不在基礎:有些支持基礎觀點的人認為,"電路基礎原理很重要"原因是: 1,所有事都要有基礎才能做, 2,沒有基礎什么都不理解,如何做創新. 我不同意這個觀點: 1,認為基礎知識,是多數人都有的知識,在知識交換中,不能賣到好價,也不應賣到好 ...…

查看全部問答∨

掛載不了NFS文件系統,為什么?

虛擬機中: [root@4 etc]# ifconfig eth0 192.168.0.22 up [root@4 etc]# service nfs restart 關閉 NFS mountd:                           &nbs ...…

查看全部問答∨

串聯電池組單節電壓采集方案???

哪位大蝦做國串聯電池組單節電壓采集的,能給個思路嗎?…

查看全部問答∨

大家看看這樣的經歷跳槽值多少錢

學歷:研究生 工作經歷:研二開始上班           做過單片機,FPGA,畫過PCB都不是很精           作過基于CE的小項目,但是基本是0代碼           ...…

查看全部問答∨

紅外學習模塊又有新產品了

SANIR-02A使用按鍵控制,可以學習六個鍵 SANIR-03A使用串口控制,可以學習六個鍵 可以學習電視、投影機、機頂盒等設備,可以學習絕大多數空調,可按用戶要求定制任意數量按鍵學習 采用雙列直插封裝,可以很方便的嵌入到用戶系統中 詳情請見http ...…

查看全部問答∨

evc 程序能夠編譯 不能運行

在運行時出現下面錯誤 --------------------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數據庫時,會丟失數據,還是損壞數據庫?這種情況適合用嗎? 還有其他的數據庫軟件可以選擇嗎?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 建宁县| 龙井市| 东光县| 原平市| 布尔津县| 昔阳县| 永德县| 中牟县| 满洲里市| 韩城市| 梁山县| 杭锦后旗| 英山县| 深水埗区| 绥中县| 彭山县| 铜川市| 盘山县| 辽阳县| 通城县| 城市| 太仓市| 柳江县| 西峡县| 巴南区| 镇巴县| 会宁县| 宁波市| 鹤壁市| 南雄市| 巴南区| 卢氏县| 临邑县| 宝丰县| 商南县| 河源市| 福建省| 鸡西市| 旌德县| 宁蒗| 宜昌市|