一、Printf簡(jiǎn)介
Printf是一個(gè)標(biāo)準(zhǔn)的C庫API,用來打印信息顯示的。Printf的底層輸出調(diào)用,在windows環(huán)境下是fputc函數(shù),在GNUC環(huán)境下是__io_putchar函數(shù)。Printf主要做兩件事:第一件是將參數(shù)字符串以及可變參數(shù)進(jìn)行解析,格式化成 一串字符串。第二件事就是將格式化的字符串一個(gè)字節(jié)一個(gè)字節(jié)的輸出出去(至于以什么樣的方式輸出那就得看底層的實(shí)現(xiàn)了,比如有OS的情況下就是輸出在命令行下的)。
二、Printf和串口
在嵌入式設(shè)備中一般有兩種調(diào)試方法,一種是硬件調(diào)試無需軟件干預(yù)(利用廠商提供的仿真器和應(yīng)用軟件),另一種是軟件調(diào)試(利用串口發(fā)送調(diào)試)。一般在系統(tǒng)初始階段串口無法使用的情況下都是用的硬件進(jìn)行調(diào)試但是這種方式不太靈活,限制很多,能用軟件調(diào)試盡量都用軟件,這種方式比較靈活。
串口設(shè)備本身只能將我們寫入數(shù)據(jù)寄存器的數(shù)據(jù)發(fā)送出來,無法支持更多的功能。比如將存放十進(jìn)制的數(shù)據(jù)的變量轉(zhuǎn)換成字符形式再發(fā)出去,這樣我們?nèi)瞬抛R(shí)別。而標(biāo)準(zhǔn)庫的printf就是實(shí)現(xiàn)了這些功能。
printf的第一件事主要是軟件實(shí)現(xiàn),這個(gè)已經(jīng)由C標(biāo)準(zhǔn)實(shí)現(xiàn)了我們不用管;而第二件事就是將printf格式化好的字符串輸出到那個(gè)設(shè)備。所以我們只需要將fputc或者_(dá)_io_putchar函數(shù)實(shí)現(xiàn)為串口的發(fā)送,然后通過USB轉(zhuǎn)串口硬件發(fā)送到上位機(jī)上,上位機(jī)再通過串口助手程序顯示出來。代碼如下:
除此之外,我們還要再做一點(diǎn)配置工作—禁用半主機(jī)模式,禁用了半主機(jī)模式才能使用標(biāo)準(zhǔn)庫函數(shù)printf()打印信息到串口,在程序中加入以下代碼即可。
那么什么是半主機(jī)模式?為什么不用它?半主機(jī)模式是ARM單片機(jī)的一種調(diào)試機(jī)制,跟串口調(diào)試不一樣的是,它需要通過仿真器來連接電腦和ARM單片機(jī),并調(diào)用相應(yīng)的指令來實(shí)現(xiàn)單片機(jī)向電腦顯示器打印信息(或者從電腦鍵盤讀取輸入)。簡(jiǎn)而言之,這種方法比串口調(diào)試更復(fù)雜(需要進(jìn)行更多的配置操作),也更不靈活(一定要用仿真器)。
上面的配置似乎有點(diǎn)麻煩,要加入這么一堆難懂的代碼,難道沒有更簡(jiǎn)便點(diǎn)的方法嗎?有,但不推薦。
方法是使用微庫(MicroLIB),只要在Keil的“Options for Target -> Target ->Use MicroLIB”上打勾,即可使用串口打印(fputc()函數(shù)還是要實(shí)現(xiàn),但上述的禁用半主機(jī)代碼不用加)。
微庫是區(qū)別于C標(biāo)準(zhǔn)庫的另一個(gè)庫,當(dāng)使用微庫時(shí),就默認(rèn)關(guān)閉了半主機(jī)模式,也就不用添加上面的代碼。這樣雖然方便,但個(gè)人建議能不用就不用,原因:
第一,微庫是為小內(nèi)存嵌入式設(shè)備而設(shè)計(jì)的,使用它可以減少代碼所占空間,但對(duì)現(xiàn)在STM32等單片機(jī)來說,內(nèi)存一般都?jí)蛴茫觳⒎潜匦琛?/p>
第二,微庫相對(duì)于C標(biāo)準(zhǔn)庫而言,支持的功能更少,主要體現(xiàn)在對(duì)操作系統(tǒng)的支持上。總的來說,標(biāo)準(zhǔn)的東西總是相對(duì)更可靠,所以為了不必要的掉坑,還是用C標(biāo)準(zhǔn)庫,不用微庫。
-
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
356045 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論