2013-05-27 22 views
2

如果我編譯的Cortex-M4(LPC4357)GCC項目並使用-mcpu =的Cortex-M4開關浮子不能正常工作(電話BLX __addsf3,最終轉移到STMIA命令,導致錯誤中斷,可能是由於寄存器中的值不正確)。如果我用-mcpu = cortex-m3進行編譯,它會調用bl __addsf3,它具有不同的來源並且可以工作。的Cortex-M4與GCC - 浮行爲

我想我可能不得不修復其他開關,以使浮動工作與-mcpu = cortex-m4 ...我試過several things,但這真是奇怪。

相關編譯器和鏈接器開關:

編譯器: -mthumb -mcpu =皮質-M4 -std = C99 -c -g -D DEBUG -D GCC

接頭: -nostartfiles -nostdlib -nodefaultlibs -fno-exceptions -mthumb -mcpu = cortex -m4 -mfloat-abi = hard -mfpu = fpv4 -sp-d16 -O0 -lgcc -lc

你能告訴我是否在這裏丟失了一些明顯的東西嗎?

+1

GCC需要一段時間才能趕上新的芯片,即使這些芯片的知識已經存在了很長一段時間。因此,使用最前沿的gcc,如果沒有做你想要什麼,然後要麼有助於GCC或等待或檢查LLVM /鐺,看看如何趕上他們(同樣的問題,硬件和編譯器之間的延遲)。 –

+0

您是否嘗試使用CodeRed編譯器?它也是Gcc的基礎。 –

+0

不行,我得準備與該編譯器的樣品(雖然好主意,我應該嘗試新的版本,也出現了一些自)。 –

回答

9

由ARM提供的工具鏈GNU Tools for ARM Embedded Processors,你需要編譯:

-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 

使用硬件浮點。從readme.txt文件請參閱下表:

 Architecture options usage 
-------------------------------------------------------------------- 
| ARM Core | Command Line Options      | multilib | 
|----------|--------------------------------------------|----------| 
|Cortex-M0+| -mthumb -mcpu=cortex-m0plus    | armv6-m | 
|Cortex-M0 | -mthumb -mcpu=cortex-m0     |   | 
|Cortex-M1 | -mthumb -mcpu=cortex-m1     |   | 
|   |--------------------------------------------|   | 
|   | -mthumb -march=armv6-m      |   | 
|----------|--------------------------------------------|----------| 
|Cortex-M3 | -mthumb -mcpu=cortex-m3     | armv7-m | 
|   |--------------------------------------------|   | 
|   | -mthumb -march=armv7-m      |   | 
|----------|--------------------------------------------|----------| 
|Cortex-M4 | -mthumb -mcpu=cortex-m4     | armv7e-m | 
|(No FP) |--------------------------------------------|   | 
|   | -mthumb -march=armv7e-m     |   | 
|----------|--------------------------------------------|----------| 
|Cortex-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=softfp | armv7e-m | 
|(Soft FP) | -mfpu=fpv4-sp-d16       | /softfp | 
|   |--------------------------------------------|   | 
|   | -mthumb -march=armv7e-m -mfloat-abi=softfp |   | 
|   | -mfpu=fpv4-sp-d16       |   | 
|----------|--------------------------------------------|----------| 
|Cortex-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=hard | armv7e-m | 
|(Hard FP) | -mfpu=fpv4-sp-d16       | /fpu  | 
|   |--------------------------------------------|   | 
|   | -mthumb -march=armv7e-m -mfloat-abi=hard |   | 
|   | -mfpu=fpv4-sp-d16       |   | 
|----------|--------------------------------------------|----------| 
|Cortex-R4 | [-mthumb] -march=armv7-r     | armv7-ar | 
|Cortex-R5 |           | /thumb | 
|Cortex-R7 |           |  | 
|(No FP) |           |   | 
|----------|--------------------------------------------|----------| 
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=softfp| armv7-ar | 
|Cortex-R5 | -mfpu=vfpv3-d16       | /thumb | 
|Cortex-R7 |           | /softfp | 
|(Soft FP) |           |   | 
|----------|--------------------------------------------|----------| 
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=hard | armv7-ar | 
|Cortex-R5 | -mfpu=vfpv3-d16       | /thumb | 
|Cortex-R7 |           | /fpu  | 
|(Hard FP) |           |   | 
|----------|--------------------------------------------|----------| 
|Cortex-A* | [-mthumb] -march=armv7-a     | armv7-ar | 
|(No FP) |           | /thumb | 
|----------|--------------------------------------------|----------| 
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar | 
|(Soft FP) | -mfpu=vfpv3-d16       | /thumb | 
|   |           | /softfp | 
|----------|--------------------------------------------|----------| 
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard | armv7-ar | 
|(Hard FP) | -mfpu=vfpv3-d16       | /thumb | 
|   |           | /fpu  | 
-------------------------------------------------------------------- 

你應該真的閱讀自述文件附帶GCC工具鏈,不管你來自哪裏得到他們。

+0

非常明確的答案。也許值得注意的是,並非所有Cortex-M4部件都具有硬件FP(儘管LPC4357)。 – Clifford

+0

您實際上不需要'-mfloat-abi = hard'來使用FPU。 'mfloat-abi'參數只是控制用於浮點值的調用約定。 – Venemo