1.問(wèn)題描述
最近進(jìn)行ARM嵌入式系統(tǒng)開(kāi)發(fā)過(guò)程中遇到一個(gè)問(wèn)題,就是打印浮點(diǎn)數(shù)據(jù)不正確。這里的打印函數(shù)在其他文件定義的,在main.c中調(diào)用了打印函數(shù),但是并沒(méi)有include打印函數(shù)的頭文件,編譯能夠正確的編譯過(guò)去,但是打印浮點(diǎn)數(shù)據(jù)時(shí)浮點(diǎn)數(shù)據(jù)的內(nèi)容始終不正確,比如kprintf("float_num:%f ", 12.06);實(shí)際顯示的內(nèi)容可能是0.0000。
最開(kāi)始以為浮點(diǎn)的堆棧處理問(wèn)題,后來(lái)檢查浮點(diǎn)的入棧和出棧并沒(méi)有什么問(wèn)題,后來(lái)調(diào)試發(fā)現(xiàn)kprintf("float_num:%f ", 12.06);這句代碼的匯編格式使用d0在保存浮點(diǎn)數(shù)據(jù),正常來(lái)說(shuō)ARM傳遞參數(shù)使用的是r0,r1,r2,r3寄存器或者堆棧,這明顯就不對(duì),采用的貌似是編譯器的通用參數(shù)處理方式。當(dāng)然了導(dǎo)致這個(gè)問(wèn)題的原因就是kprintf這個(gè)函數(shù)并未聲明,因?yàn)閗printf函數(shù)未聲明,編譯器在編譯當(dāng)前文件時(shí),并不知道kprintf函數(shù)的參數(shù)及順序,因此采用的貌似是編譯器的通用參數(shù)處理方式。
kprintf函數(shù)未聲明時(shí),kprintf("float_num:%f ", 12.06);對(duì)應(yīng)的匯編代碼為:
vldrd0,[pc,#188] ldrr0,[pc,#200] blkprintf
kprintf函數(shù)在main.c文件中聲明了時(shí),kprintf("float_num:%f ", 12.06);對(duì)應(yīng)的匯編代碼為:
addr3,pc,#252 ldrdr2,r3,[r3] ldrr0,[pc,#188] blkprintf
函數(shù)未聲明除了造成上述問(wèn)題之外(參數(shù)傳入的不正確導(dǎo)致結(jié)果出錯(cuò)),也可能導(dǎo)致結(jié)果正確,但是返回的結(jié)果不正確(比如一個(gè)函數(shù)返回double型的結(jié)果,如果函數(shù)未聲明就使用,可能會(huì)返回4字節(jié)的結(jié)果,導(dǎo)致結(jié)果返回錯(cuò)誤)。
函數(shù)未聲明時(shí),kprintf("int_num:%d ", 15);能夠正確的顯示,因?yàn)榇藭r(shí)15這個(gè)值能夠通過(guò)普通寄存器(r0/r1/r2/r3)傳遞,因此不會(huì)出現(xiàn)打印浮點(diǎn)數(shù)的問(wèn)題。如果傳遞的參數(shù)或者返回的值,不能通過(guò)普通寄存器(r0/r1/r2/r3)傳遞時(shí),就可能出現(xiàn)奇怪的問(wèn)題了。
2.問(wèn)題解決方法
解決這個(gè)問(wèn)題的方法自然是,在使用到kprintf的文件中include打印函數(shù)kprintf的頭文件。
3.小結(jié)
對(duì)于開(kāi)發(fā)過(guò)程中,如果編譯時(shí)提示"warning: implicit declaration of function 'xxx'"這類的信息,一定還是加上這些函數(shù)的聲明。如果不添加函數(shù)聲明,編譯雖然能夠通過(guò),但是遇到我上面提及的怪異問(wèn)題,調(diào)試可能都不知如何下手,謹(jǐn)記吧。
審核編輯:湯梓紅
-
ARM
+關(guān)注
關(guān)注
134文章
9353瀏覽量
377565 -
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317588 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141759 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64884 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33995
原文標(biāo)題:C語(yǔ)言-函數(shù)未聲明引發(fā)的怪異現(xiàn)象
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
編譯后提示這個(gè)函數(shù)未聲明
為什么編譯時(shí)有Warning說(shuō)這個(gè)函數(shù)有定義未聲明?
在nuclei studio中編譯遇到的兩個(gè)問(wèn)題,計(jì)數(shù)模塊顯示未聲明和如何在c工程中添加硬件描述語(yǔ)言?
C語(yǔ)言回調(diào)函數(shù)學(xué)習(xí)
C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)
51單片機(jī)實(shí)戰(zhàn)教程之C語(yǔ)言基礎(chǔ)(五 C語(yǔ)言函數(shù)及其定義)

評(píng)論