2013-05-27 5 views
2

Если я скомпилирую проект GCC для Cortex-M4 (LPC4357) и использую -mcpu = cortex-m4, то поплавки коммутатора не работают (вызовы blx __addsf3, которые в конце концов переходят к команде stmia, которая приводит к прерыванию ошибки, возможно, из-за плохих значений в регистрах). Если я компилирую с -mcpu = cortex-m3, он вызывает bl __addsf3, который имеет другой источник и работает.Cortex-M4 & GCC - поведение поплавка

Я думаю, мне, возможно, придется исправить другие переключатели, чтобы заставить поплавки работать с -mcpu = cortex-m4 ... Я пробовал several things, но это действительно странно.

Соответствующие компилятор и компоновщик переключатели:

Компилятор: -mthumb -mcpu = кортекс-М4 -std = c99 -c -g -D ОТЛАДКА -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/clang, чтобы увидеть, насколько они догнаны (такая же проблема, задержка между аппаратным обеспечением и компилятором). –

+0

Вы пытались использовать компилятор CodeRed? Это также база Gcc. –

+0

Нет, мне нужно подготовить образец с помощью этого компилятора (хотя хорошая идея, я должен попробовать более новые версии, с тех пор есть некоторые). –

ответ

9

С GNU Tools for ARM Embedded Processors набора инструментов, предоставленной ARM, вы должны компилировать с:

-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  | 
-------------------------------------------------------------------- 

Вы должны действительно прочитать файл README, которые приходят с GCC компилированных инструментами независимо от того, где вы получите их.

+0

Очень четкий ответ. Возможно, стоит отметить, что не все части Cortex-M4 имеют аппаратное FP (хотя LPC4357 делает). – Clifford

+0

Вам не нужен '-mfloat-abi = hard', чтобы использовать FPU. Аргумент 'mfloat-abi' просто управляет соглашениями о вызовах, используемыми для значений с плавающей запятой. – Venemo

Смежные вопросы