Скомпилируйте программу STM32 на X86 Linux, используя TinyCC - PullRequest
0 голосов
/ 07 марта 2020

Как я могу установить и настроить Tiny CC, затем вызвать компилятор и компоновщик для создания файла .bin, который я могу записать sh на мою демонстрационную плату STM32? Пожалуйста, укажите конкретные c шагов. Я на Ubuntu 19.10 x86_64.

1 Ответ

1 голос
/ 11 марта 2020

TinyCC изначально был предназначен для создания исполняемых файлов в формате ELF , содержащем программы пользовательского режима для Linux. Он поддерживает профиль Cortex-A , но есть вероятность, что вы можете используйте его как есть для кросс-компиляции для Cortex-M STM32F103 не существует IMHO.

Вот что я хотел бы предложить:

  • Keep Tiny CC на стороне, пока вы узнаете о STM32F103, используя свою доску Blue Pill.
  • Используйте набор инструментов G CC, на который мы ссылаемся ниже, для объяснения того, как можно создать .bin. Как только вы почувствуете себя комфортно с G CC и STM32F103, вы можете go вернуться к экспериментам с Tiny CC.

Как создать файл .bin из C программа для STM32F103 и ее связь с соответствующим файлом ELF:

Вы должны увидеть:

arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599]
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Теперь вы можете построить пример, содержащийся в каталоге pill_blink/bare-metal: make -C pill_blink/bare-metal all
Вы должны были создать исполняемый файл в формате ELF, и теперь должен быть доступен .bin, содержащий только код и данные, которые были собраны из файла ELF с использованием arm-none-eabi-objcopy - обратитесь к pill_blink/bare-metal/Makefile для точная команда:

ls -gG pill_blink/bare-metal
total 72
-rw-rw-r-- 1   255 Mar 11 14:35 bluepill.ld
-rw-rw-r-- 1   483 Mar 11 14:35 Makefile
-rwxrwxr-x 1   440 Mar 11 14:36 pill_blink.bin
-rw-rw-r-- 1  1059 Mar 11 14:35 pill_blink.c
-rw-rw-r-- 1    27 Mar 11 14:36 pill_blink.d
-rwxrwxr-x 1 82452 Mar 11 14:36 pill_blink.elf
-rw-rw-r-- 1 21528 Mar 11 14:36 pill_blink.o
-rw-rw-r-- 1   326 Mar 11 14:35 README.md

Файл ELF содержит скомпилированную программу C вместе с большим количеством метаданных, как объяснено в статье ELF , упомянутой выше. Вы можете использовать arm-none-objdump для изучения .ELF-файла:

arm-none-eabi-objdump -x pill_blink/bare-metal/pill_blink.elf 

pill_blink/bare-metal/pill_blink.elf:     file format elf32-littlearm
pill_blink/bare-metal/pill_blink.elf
architecture: armv7, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08000151

Program Header:
    LOAD off    0x00010000 vaddr 0x08000000 paddr 0x08000000 align 2**16
         filesz 0x000001b8 memsz 0x000001b8 flags r-x
private flags = 5000200: [Version5 EABI] [soft-float ABI]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000001b8  08000000  08000000  00010000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .debug_info   0000017f  00000000  00000000  000101b8  2**0
                  CONTENTS, READONLY, DEBUGGING
  2 .debug_abbrev 000000d4  00000000  00000000  00010337  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_aranges 00000020  00000000  00000000  0001040b  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_macro  00000a9b  00000000  00000000  0001042b  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_line   00000086  00000000  00000000  00010ec6  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_str    00002dfb  00000000  00000000  00010f4c  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .comment      00000079  00000000  00000000  00013d47  2**0
                  CONTENTS, READONLY
  8 .ARM.attributes 0000002d  00000000  00000000  00013dc0  2**0
                  CONTENTS, READONLY
  9 .debug_frame  00000020  00000000  00000000  00013df0  2**2
                  CONTENTS, READONLY, DEBUGGING
SYMBOL TABLE:
08000000 l    d  .text  00000000 .text
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .debug_macro   00000000 .debug_macro
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_str     00000000 .debug_str
00000000 l    d  .comment       00000000 .comment
00000000 l    d  .ARM.attributes        00000000 .ARM.attributes
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    df *ABS*  00000000 pill_blink.c
08000150  w    F .text  00000068 reset_handler
08000000 g     O .text  00000150 vector_table

arm-none-eabi-objdump -d pill_blink/bare-metal/pill_blink.elf

pill_blink/bare-metal/pill_blink.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <vector_table>:
 8000000:       00 00 00 00 51 01 00 08 00 00 00 00 00 00 00 00     ....Q...........
        ...

08000150 <reset_handler>:
 8000150:       4b13            ldr     r3, [pc, #76]   ; (80001a0 <reset_handler+0x50>)
 8000152:       681b            ldr     r3, [r3, #0]
 8000154:       4a12            ldr     r2, [pc, #72]   ; (80001a0 <reset_handler+0x50>)
 8000156:       f043 0310       orr.w   r3, r3, #16
 800015a:       6013            str     r3, [r2, #0]
 800015c:       4b11            ldr     r3, [pc, #68]   ; (80001a4 <reset_handler+0x54>)
 800015e:       4a11            ldr     r2, [pc, #68]   ; (80001a4 <reset_handler+0x54>)
 8000160:       681b            ldr     r3, [r3, #0]
 8000162:       6013            str     r3, [r2, #0]
 8000164:       4b0f            ldr     r3, [pc, #60]   ; (80001a4 <reset_handler+0x54>)
 8000166:       681b            ldr     r3, [r3, #0]
 8000168:       4a0e            ldr     r2, [pc, #56]   ; (80001a4 <reset_handler+0x54>)
 800016a:       f443 1300       orr.w   r3, r3, #2097152        ; 0x200000
 800016e:       6013            str     r3, [r2, #0]
 8000170:       4b0d            ldr     r3, [pc, #52]   ; (80001a8 <reset_handler+0x58>)
 8000172:       f44f 5200       mov.w   r2, #8192       ; 0x2000
 8000176:       601a            str     r2, [r3, #0]
 8000178:       2400            movs    r4, #0
 800017a:       e001            b.n     8000180 <reset_handler+0x30>
 800017c:       bf00            nop
 800017e:       3401            adds    r4, #1
 8000180:       4b0a            ldr     r3, [pc, #40]   ; (80001ac <reset_handler+0x5c>)
 8000182:       429c            cmp     r4, r3
 8000184:       ddfa            ble.n   800017c <reset_handler+0x2c>
 8000186:       4b0a            ldr     r3, [pc, #40]   ; (80001b0 <reset_handler+0x60>)
 8000188:       f44f 5200       mov.w   r2, #8192       ; 0x2000
 800018c:       801a            strh    r2, [r3, #0]
 800018e:       2400            movs    r4, #0
 8000190:       e001            b.n     8000196 <reset_handler+0x46>
 8000192:       bf00            nop
 8000194:       3401            adds    r4, #1
 8000196:       4b07            ldr     r3, [pc, #28]   ; (80001b4 <reset_handler+0x64>)
 8000198:       429c            cmp     r4, r3
 800019a:       ddfa            ble.n   8000192 <reset_handler+0x42>
 800019c:       e7e8            b.n     8000170 <reset_handler+0x20>
../..

Теперь, используя, скажем, hexdump, для отображения содержимого .bin-файла, вы сможете соотнести это содержимое с содержимым файла ELF:

hexdump -C  pill_blink/bare-metal/pill_blink.bin
00000000  00 00 00 00 51 01 00 08  00 00 00 00 00 00 00 00  |....Q...........|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000150  13 4b 1b 68 12 4a 43 f0  10 03 13 60 11 4b 11 4a  |.K.h.JC....`.K.J|
00000160  1b 68 13 60 0f 4b 1b 68  0e 4a 43 f4 00 13 13 60  |.h.`.K.h.JC....`|
00000170  0d 4b 4f f4 00 52 1a 60  00 24 01 e0 00 bf 01 34  |.KO..R.`.$.....4|
00000180  0a 4b 9c 42 fa dd 0a 4b  4f f4 00 52 1a 80 00 24  |.K.B...KO..R...$|
00000190  01 e0 00 bf 01 34 07 4b  9c 42 fa dd e8 e7 00 bf  |.....4.K.B......|
000001a0  18 10 02 40 04 10 01 40  10 10 01 40 3f 42 0f 00  |...@...@...@?B..|
000001b0  14 10 01 40 1f a1 07 00                           |...@....|
000001b8

Поскольку файл .bin должен быть дословно прошит по адресу 0x08000000, это означает, что вы можете сопоставить содержимое адресов 0x00000000 и 0x00000150 вывода hexdump с выводом команды arm-none-eabi-objdump -d, но по адресам 0x08000000+0x00000000 и 0x08000000+0x00000150, т. е. 0x08000000 и 0x08000150.

Я надеюсь, что это действительно отвечает на ваш вопрос .

...