系统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