понедельник, 19 марта 2012 г.

I & STM32F4-discovery part5 - make full support vpf toolchain

Немного оторвемся от программирования и посвятим эту статью сборки дополнительного тулчейна с поддержкой vpf - для операций с плавающей точкой. Это позволит нам использовать ядро cortex-m4 еще более полно.



Для начала установим тулчейн с аппаратной поддержкой операций для плавающей точки:

jane ~ # crossdev arm-hardfloat-linux-gnueabi

Затем модифицируем /etc/portage/package.keywords для сброки свежей ветки компилятора 4.6 именно в ней и появилась поддержка ядра cortex-m4:

найдем - 

cross-arm-hardfloat-linux-gnueabi/gcc arm ~arm -x86 -~x86

и заменим на -

cross-arm-hardfloat-linux-gnueabi/gcc * ~* **

После этого пересоберем gcc указав самый последний из доступных в ветке 4.6 - 4.6.2:

jane ~ # emerge -av "=cross-arm-hardfloat-linux-gnueabi/gcc-4.6.2"








После сборки проверим на наличие поддержки cortex-m4 в новом gcc:

nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-gcc-4.6.2 --target-help | grep cortex-m4
    cortex-m0, cortex-m1, cortex-m3, cortex-m4, cortex-r4f, cortex-r4,

Для проверки новых опций необходимо создать тестовую директорию:

nis@jane ~ $  mkdir test-dir

Перейдем в нее и создадим файл main.с с кодом:

nis@jane ~ $ sd test-dir
nis@jane ~/test-dir $ cat > main.c
int _start(void) {
        float i, j;
        j = 10.5;
        i = j * 2.4;
        return 0;
}
^D

После чего соберем бинарник:

nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-gcc-4.6.2 -mcpu=cortex-m4 -mhard-float -mthumb main.c -c -o main.o
nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-ld -o main.elf main.o
nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-objcopy -O binary main.elf main.bin

Посмотрим каталог и увидим что в результате получился бинарник размером(!) 72 байта:

nis@jane ~/test-dir $ ll
итого 16
-rwxr-xr-x 1 nis nis   72 марта 19 16:49 main.bin
-rw-r--r-- 1 nis nis   70 марта 19 16:46 main.c
-rwxr-xr-x 1 nis nis 1006 марта 19 16:48 main.elf
-rw-r--r-- 1 nis nis  925 марта 19 16:48 main.o

Давайте просмотрим что же находится в нем:

nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-objdump -d main.elf
main.elf:     file format elf32-littlearm

Disassembly of section .text:

00008098 <_start>:
    8098:       b480            push    {r7}
    809a:       b083            sub     sp, #12
    809c:       af00            add     r7, sp, #0
    809e:       4b0e            ldr     r3, [pc, #56]   ; (80d8 <_start+0x40>)
    80a0:       607b            str     r3, [r7, #4]
    80a2:       edd7 7a01       vldr    s15, [r7, #4](null)
    80a6:       eeb7 6ae7       vcvt.f64.f32    d6, s15
    80aa:       ed9f 7b09       vldr    d7, [pc, #36](null)     ; 80d0 <_start+0x38>
    80ae:       ee26 7b07       vmul.f64        d7, d6, d7
    80b2:       eef7 7bc7       vcvt.f32.f64    s15, d7
    80b6:       edc7 7a00       vstr    s15, [r7]
    80ba:       f04f 0300       mov.w   r3, #0
    80be:       4618            mov     r0, r3
    80c0:       f107 070c       add.w   r7, r7, #12
    80c4:       46bd            mov     sp, r7
    80c6:       bc80            pop     {r7}
    80c8:       4770            bx      lr
    80ca:       bf00            nop
    80cc:       f3af 8000       nop.w
    80d0:       33333333        .word   0x33333333
    80d4:       40033333        .word   0x40033333
    80d8:       41280000        .word   0x41280000
    80dc:       f3af 8000       nop.w

Как видите присутсвуют инструкции для работы с плавающей точкой: vcvt, vmul, vldr, vstr которые осуществляют работу с fpu.
Проверим тип файла а заодно узнаем об используемой vpf:

nis@jane ~/test-dir $ arm-hardfloat-linux-gnueabi-readelf -A main.elf
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "Cortex-M4"
  Tag_CPU_arch: v7E-M
  Tag_CPU_arch_profile: Microcontroller
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv2
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: SP and DP
  Tag_ABI_VFP_args: VFP registers
  Tag_ABI_optimization_goals: Aggressive Debug

Из вывод программы видно что используется VPF второй версии. который соотвествует стандарту IEEE 754, это соотвествует документации на ядро на оффициальном сайте.

Вот собственно подготовка дополнительного тулчейна закончена.