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
.
Я надеюсь, что это действительно отвечает на ваш вопрос .