系统Ubuntu
使用arm32 gcc汇编(伪指令使用GNU风格)
类比C++内存四区:
程序运行前:全局/静态区(data + bss + rodata)+代码区
程序运行后:代码区,全局/静态区,栈区,堆区
声明:data rodata text Stack Heap bss data(留意后面会反复提及)
Flash:
rodata代表程序中的只读数据,.s文件中的向量表,.c文件中的常量,宏定义
text代码区
SRAM:
Stack栈,程序自动管理(类比C++内存四区)
Heap堆,动态分配,程序员管理
bss未定义的全局和静态变量
data定义的全局和静态变量
flash ram存储详解
+------------------+ 0x08010000 (Flash 结束)
| .rodata(isr_vector) | 只读(常量)数据(Flash)
+------------------+
| .text | 代码段(Flash)
+------------------+ 0x08000000 (Flash 起始)
+------------------+ 0x20005000 (RAM 结束)
| Stack | 栈(局部变量、返回地址),↓ 向低地址增长
+------------------+
| Heap | 动态分配(malloc),↑ 向高地址增长
+------------------+
| .bss | 未初始化数据(RAM)
+------------------+
| .data | 已初始化全局变量(RAM)
+------------------+ 0x20000000 (RAM 起始)如果不做 .data/.bss 初始化,C 里不要依赖全局变量的初值(用宏映射寄存器即可)。
#define GPIOA (*(volatile uint32_t *)0x400100C)BSP工程管理
汇编启动文件:startup_stm32f10x_md.s(GNU gcc)
系统文件:system_stm32f10x.h system_stm32f10x.c
链接脚本:linker.ld(GNU)
外设寄存器描述文件:stm32f10x.h
内核寄存器描述文件: core_cm3.h core_cm3.c
各个文件的解释
startup_stm32f10x_md.s:启动文件,.rodata(isr_vector),完成stack,heap初始化、data段/ bss 段拷贝/清零,然后调用 SystemInit() 和 main()。
system_stm32f10x.{c,h}:系统时钟和内核相关配置(PLL、时钟树),提供 SystemInit() 和 SystemCoreClock 等。
linker.ld:链接脚本,描述 Flash / RAM 大小和位置(如上表),并把 .text/.data/.bss 等段放到正确的区域。
stm32f10x.h:芯片外设寄存器描述(RCC、GPIO、USART 等寄存器结构体和位定义)。
core_cm3.{h,c}:封装 NVIC、SysTick、SCB 等 Cortex‑M3 内核寄存器和内联函数。
上述文件都可以在mcu厂商手上获取!
分类好文件
project/
├── Core/
│ ├── startup_stm32f10x_md.s // 启动文件(.isr_vector + Reset_Handler)
│ ├── system_stm32f10x.c // SystemInit, 时钟配置
│ ├── system_stm32f10x.h
│ ├── core_cm3.h // 内核寄存器 + 内联函数
│ └── core_cm3.c
├── Device/
│ └── stm32f10x.h // 外设寄存器映射
├── BSP/
│ ├── bsp_led.c // 板级外设封装,比如 LED
│ └── bsp_led.h
├── User/
│ └── main.c // 用户应用
├── linker.ld // 链接脚本
└── Makefile // 构建脚本准备交叉编译工具链gcc-arm-none-eabi,编写makefile构建即可
构建工具Makefile
# 工具链前缀
CROSS_COMPILE := arm-none-eabi-
CC := $(CROSS_COMPILE)gcc
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
CPU_FLAGS := -mcpu=cortex-m3 -mthumb
CFLAGS := $(CPU_FLAGS) -Os -ffunction-sections -fdata-sections -g \
-Wall -Wextra -std=c11
LDFLAGS := $(CPU_FLAGS) -nostartfiles -Wl,--gc-sections -Tlinker.ld
SRCS := \
Core/startup_stm32f10x_md.s \
Core/system_stm32f10x.c \
User/main.c \
BSP/bsp_led.c
OBJS := $(SRCS:.c=.o)
OBJS := $(OBJS:.s=.o)
all: main.bin
main.elf: $(OBJS) linker.ld
$(CC) $(LDFLAGS) $(OBJS) -o $@
$(OBJDUMP) -d $@ > main.dis
main.bin: main.elf
$(OBJCOPY) -O binary $< $@
clean:
rm -f $(OBJS) main.elf main.bin main.dis