您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Keil MDK浮點數支持不正常的解決方案是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在調用printf調試浮點數的時候,在內存中表示正確,但是打印數據就都為0.00,其他整形數據表示正常。
經查資料得知,浮點數要求堆棧八字節對齊導致,如果系統的默認堆棧不是八字節對齊的一定會出現此問題。
將變量八字節對齊即可。
1、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];
2、Keil MDK下的解決方案:
在任務堆棧聲明前面加入強制八字節對齊命令,如下:
__align(8) static OS_STK TaskEquipmentStk[TASK_EQUIPMENT_STK_SIZE]; __align(8) static OS_STK TaskUartRcvStk[TASK_UARTRCV_STK_SIZE]; __align(8) static OS_STK TaskFileRcvStk[TASK_FILERCV_STK_SIZE]; __align(8) static OS_STK TaskFtpStk[ TASK_FTP_STK_SIZE ]; __align(8) static OS_STK TaskErrorRateRS485Stk[ TASK_ERROR_RATE_RS485_STK_SIZE ];
這事兒的歷史在于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字節對齊。
上述就是小編為大家分享的Keil MDK浮點數支持不正常的解決方案是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。