понедельник, 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, это соотвествует документации на ядро на оффициальном сайте.

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

Комментариев нет:

Отправить комментарий