Ubuntu 使用TinyCC在X86 Linux上编译STM32程序
如何安装和配置TinyCC,然后调用编译器和链接器生成.bin文件,然后将其闪存到STM32演示板中?请包括具体步骤。我在Ubuntu 19.10 x86_64上。TinyCC最初设计用于以包含Linux用户模式程序的格式构建可执行文件。它确实支持配置文件,但您可以使用它来交叉编译STM32F103的可能性是不存在的 以下是我的建议: 在您使用蓝色药丸板学习STM32F103的同时,暂时将TinyCC放在一旁。 使用下文引用的GCC工具链解释如何生成.bin。一旦您对GCC和STM32F103感到满意,您就可以继续尝试TinyCC了。 如何从STM32F103的C程序创建.bin文件,以及该文件与相应ELF文件的关系:Ubuntu 使用TinyCC在X86 Linux上编译STM32程序,ubuntu,arm,stm32,tcc,Ubuntu,Arm,Stm32,Tcc,如何安装和配置TinyCC,然后调用编译器和链接器生成.bin文件,然后将其闪存到STM32演示板中?请包括具体步骤。我在Ubuntu 19.10 x86_64上。TinyCC最初设计用于以包含Linux用户模式程序的格式构建可执行文件。它确实支持配置文件,但您可以使用它来交叉编译STM32F103的可能性是不存在的 以下是我的建议: 在您使用蓝色药丸板学习STM32F103的同时,暂时将TinyCC放在一旁。 使用下文引用的GCC工具链解释如何生成.bin。一旦您对GCC和STM32F103感
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
在Ubuntu19.10上安装git:apt get install git
创建/选择工作目录:mkdir bluepill
将当前工作目录更改为bluepill:cd bluepill
克隆github上提供的一个很好的小示例程序:git clonehttps://github.com/satoshinm/pill_blink.git
下载/提取arm提供的Cortex-M GCC 9.2.1工具链:
wgethttps://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2?revision=108bd959-44bd-4619-9c19-26187abf5225&la=en&hash=E788CE92E5DFD64B2A8C246BBA91A249CB8E2D2D-O gcc-arm-none-eabi-9-2019-q4-MARY-x86_64-linux.tar.bz2
tar Jxf gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2
将工具链bin目录添加到当前路径:
导出路径=$pwd/gcc-arm-none-eabi-9-2019-q4-major/bin:$PATH
验证是否可以执行gcc:
arm ONE eabi gcc-版本
你应该看到:
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\u blink/bare metal目录中的示例:
make-C pill_闪烁/裸金属所有
您应该已经以ELF格式构建了一个可执行文件,并且现在应该可以使用arm none eabi objcopy在ELF文件中构建一个仅包含代码和数据的.bin。有关确切的命令,请参阅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程序,以及大量元数据,如上文所述。您可以使用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 -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处逐字闪烁,这意味着您可以关联hexdump输出的地址0x00000000和0x00000150的内容
使用arm none eabi objdump-d命令的输出,但地址为0x08000000+0x00000000和0x08000000+0x00000150,即0x08000000和0x08000150
我希望这能回答您的问题。您为什么不使用更标准/受支持的工具集,例如?可能是出于教育目的。我使用TCC进行引导时内核编译:。完全没用但很好fun@P__J__如果目标是解决一项具有挑战性的任务,我可以理解。但是,请求“特定步骤”并不能很好地满足这张图片的要求。@exebook:您的目标演示板是什么?@Frant Bluepill