1.問題描述
最近進行ARM嵌入式系統開發過程中遇到一個問題,就是打印浮點數據不正確。這里的打印函數在其他文件定義的,在main.c中調用了打印函數,但是并沒有include打印函數的頭文件,編譯能夠正確的編譯過去,但是打印浮點數據時浮點數據的內容始終不正確,比如kprintf("float_num:%f ", 12.06);實際顯示的內容可能是0.0000。
最開始以為浮點的堆棧處理問題,后來檢查浮點的入棧和出棧并沒有什么問題,后來調試發現kprintf("float_num:%f ", 12.06);這句代碼的匯編格式使用d0在保存浮點數據,正常來說ARM傳遞參數使用的是r0,r1,r2,r3寄存器或者堆棧,這明顯就不對,采用的貌似是編譯器的通用參數處理方式。當然了導致這個問題的原因就是kprintf這個函數并未聲明,因為kprintf函數未聲明,編譯器在編譯當前文件時,并不知道kprintf函數的參數及順序,因此采用的貌似是編譯器的通用參數處理方式。
kprintf函數未聲明時,kprintf("float_num:%f ", 12.06);對應的匯編代碼為:
vldrd0,[pc,#188] ldrr0,[pc,#200] blkprintf
kprintf函數在main.c文件中聲明了時,kprintf("float_num:%f ", 12.06);對應的匯編代碼為:
addr3,pc,#252 ldrdr2,r3,[r3] ldrr0,[pc,#188] blkprintf
函數未聲明除了造成上述問題之外(參數傳入的不正確導致結果出錯),也可能導致結果正確,但是返回的結果不正確(比如一個函數返回double型的結果,如果函數未聲明就使用,可能會返回4字節的結果,導致結果返回錯誤)。
函數未聲明時,kprintf("int_num:%d ", 15);能夠正確的顯示,因為此時15這個值能夠通過普通寄存器(r0/r1/r2/r3)傳遞,因此不會出現打印浮點數的問題。如果傳遞的參數或者返回的值,不能通過普通寄存器(r0/r1/r2/r3)傳遞時,就可能出現奇怪的問題了。
2.問題解決方法
解決這個問題的方法自然是,在使用到kprintf的文件中include打印函數kprintf的頭文件。
3.小結
對于開發過程中,如果編譯時提示"warning: implicit declaration of function 'xxx'"這類的信息,一定還是加上這些函數的聲明。如果不添加函數聲明,編譯雖然能夠通過,但是遇到我上面提及的怪異問題,調試可能都不知如何下手,謹記吧。
審核編輯:湯梓紅
-
ARM
+關注
關注
134文章
8967瀏覽量
365059 -
嵌入式
+關注
關注
5046文章
18821瀏覽量
298623 -
C語言
+關注
關注
180文章
7575瀏覽量
134142 -
函數
+關注
關注
3文章
4237瀏覽量
61971 -
編譯
+關注
關注
0文章
646瀏覽量
32672
原文標題:C語言-函數未聲明引發的怪異現象
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論