溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Keil MDK浮點數(shù)支持不正常的解決方案是什么

發(fā)布時間:2021-12-06 16:13:53 來源:億速云 閱讀:197 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Keil MDK浮點數(shù)支持不正常的解決方案是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在調(diào)用printf調(diào)試浮點數(shù)的時候,在內(nèi)存中表示正確,但是打印數(shù)據(jù)就都為0.00,其他整形數(shù)據(jù)表示正常。

經(jīng)查資料得知,浮點數(shù)要求堆棧八字節(jié)對齊導致,如果系統(tǒng)的默認堆棧不是八字節(jié)對齊的一定會出現(xiàn)此問題。

將變量八字節(jié)對齊即可。

解決方案:

1、IAR下的解決方案:

通過#pragma data_alignment指定對齊字節(jié)數(shù)

例如:


#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下的解決方案:

在任務堆棧聲明前面加入強制八字節(jié)對齊命令,如下:


__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本身不支持非對齊數(shù)據(jù)存??;因此在有了64Bit的數(shù)據(jù)操作指令后,指令要求8字節(jié)對齊。

進而,在編譯器的某個版本之后(RVCT3?),AAPCS就要求堆棧8字節(jié)對齊。

是先有8字節(jié)對齊的AAPCS,然后才有的CM3。先后順序要注意。CM3 r2p0之前,自動壓棧也不要求8對齊,r2p0好像才是強制對齊的。

printf的8對齊是C運行庫要求的,和硬件無關(guān),C RTL手冊有寫,可以去閱讀。其根源在于AAPCS要求;而AAPCS根源在于LDRD這類指令。

換句話,未來如果128Bit數(shù)據(jù)操作有了,ARM還不支持非對其,那AAPCS可能升級為16字節(jié)對齊。

上述就是小編為大家分享的Keil MDK浮點數(shù)支持不正常的解決方案是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI