簡體   English   中英

FPU 擴展“+fpv5”和“+fp.dp”對輸出二進制沒有影響(STM32F767ZIT ARM Cortex-M7)

[英]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

在這種情況下,二進制文件的大小比前兩個示例小得多,而且我查看了反匯編文件,並找到了如下命令: vldrvmul等。但是這段代碼不起作用,當我'm 嘗試執行任何 FPU 匯編命令將程序跳轉到HardFault_Handler

所以我的問題是:

  1. 為什么擴展名“+fp.dp”和“+nofp”對輸出二進制沒有影響?
  2. 為什么我的代碼在嘗試執行任何 FPU 命令時崩潰?

我會很高興您的任何想法、問題甚至解決方案:)

為什么我的代碼在嘗試執行任何 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM