[英]FPU extension '+fpv5' and '+fp.dp' has no effect to the output binary (STM32F767ZIT ARM Cortex-M7)
如果文中有任何錯誤,我想提前道歉,因為我的英語還不是很好:)
我在 Linux (Ubuntu 20.04.1) 上使用 VSCode 為 STM32 構建和調試項目。 當我開始使用 STM32F767ZIT 時,我發現它有硬件單元來加速浮點數運算。
數據表:“Cortex®-M7 內核具有浮點單元 (FPU),支持 Arm 雙精度和單精度數據處理指令和數據類型”)。
我正在使用 Arm Embedded Toolchain ((15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599]) 來構建源代碼並創建 *.elf 文件。 當我編譯對象時,我使用下一個命令:
arm-none-eabi-gcc "foo.c" -c -march=armv7e-m+fp.dp -mtune=cortex-m7 -g3 -mthumb -std=gnu11 -o "foo.o"
當鏈接所有對象時:
arm-none-eabi-gcc -march=armv7e-m+fp.dp -mtune=cortex-m7 -g3 -mthumb -T"flash.ld" -o "target.elf" "objects.o"
如您所見,我使用了“+fp.dp”擴展名,它啟用了單精度和雙精度 FPv5 浮點指令。 我的主要功能僅用於測試,看起來像:
int main()
{
double var = 1.1;
var *= 1.2;
var += 1.3;
if (var > 1.4) {
var /= 1.5;
var -= 1.6;
}
}
因此,當我構建項目時,我得到了下一個結果: text:3412 data:1084 bss:1568 dec:6064 hex:17b0
但是,當我禁用 FPU 擴展並使用-march=armv7e-m+nofp 時,輸出二進制文件的大小相同。 我認為當我禁用 FPU 擴展時,編譯器應該使用額外的庫來處理浮點數運算,所以我的二進制文件的大小應該更大。 另外,我測試了生產力,這兩種情況都是一樣的。
另外,我嘗試使用其他參數:
-mfloat-abi=hard -mfpu=fpv5-d16
在這種情況下,二進制文件的大小比前兩個示例小得多,而且我查看了反匯編文件,並找到了如下命令: vldr 、 vmul等。但是這段代碼不起作用,當我'm 嘗試執行任何 FPU 匯編命令將程序跳轉到HardFault_Handler 。
所以我的問題是:
我會很高興您的任何想法、問題甚至解決方案:)
為什么我的代碼在嘗試執行任何 FPU 命令時崩潰?
因為你需要先啟用FPU。 否則,它將生成 HF,因為沒有任何東西可以解釋 FPU 指令。
SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));
為什么擴展名“+fp.dp”和“+nofp”對輸出二進制沒有影響?
因為你沒有告訴編譯器生成 FPU 指令。 請記住,您還必須鏈接 ABI HARD FPU 庫。
使用選項: -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
忘記“+fp.dp”等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.