1. 問題描述:
當使用uocs printf(),sprintf()列印浮點數問題會出問題,但是裸機不會出問題
我現在使用stm32跑ucos,在使用sprintf列印float型別時候,不管是何值最後都是0.0,但是型別是int,short型別時沒有問題。網上查到是任務堆疊8位元組對齊就可以了。
當沒有作業系統時,系統堆疊是8位元組對齊的,但是當使用ucos時,使用者任務不一定是8位元組對齊.
task1-led1 中的堆疊起始指標0x200004a4,不是8位元組對齊,所以但在task-led1任務中呼叫printf等系列函式就會出現問題.
2. 解決方法
我用的是iar,通過#pragma data_alignment指定對齊位元組數
#pragma data_alignment=8
os_stk task1_led1_stk[task1_led1_stk_size];
#pragma data_alignment=8
os_stk task2_backlight_stk[task2_backlight_stk_size];
3. 8位元組對齊原因
這事兒的歷史在於arm本身不支援非對齊資料訪問;因此在有了64bit的資料操作指令後,指令要求8位元組對齊。進而,在編譯器的某個版本之後(rvct3?),aapcs就要求堆疊8位元組對齊。
是先有8位元組對齊的aapcs,然後才有的cm3。先後順序要注意。cm3 r2p0之前,自動壓棧也不要求8對齊,r2p0好像才是強制對齊的。
printf的8對齊是c執行庫要求的,和硬體無關,c rtl手冊有寫,可以去閱讀。其根源在於aapcs要求;而aapcs根源在於ldrd這類指令。
換句話,未來如果128bit資料操作有了,arm還不支援非對其,那aapcs可能公升級為16位元組對齊。
供參考,cm3和c-rtl對齊的問題。
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...
浮點數操作
float fx 49.03f int nx fx 100 printf d nx 執行上述 結果 4902。用vc6.0,2005,gcc編譯執行結果都是一樣。為什麼會這樣呢,是因為浮點數運算具有不精確性。其實編譯上面的 編譯器會有警告的。warning c4244 initializing co...
浮點數比較
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...