Skip to content

toolchain

Jiang Yongquan(江永泉) edited this page Aug 23, 2021 · 3 revisions

The GNU Arm Embedded Toolchain (arm官网预编译版本)

下载

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

host跨平台支持,target支持全系列32位arm处理器

readme

share/doc/gcc-arm-none-eabi/readme.txt

gdb

arm-none-eabi-gdb-py (gdb with python support) 需要安装python插件可以使用这个版本

gcc架构选项

arm处理器有很多变种,toolchain有专为不同的Cortex-A/R/M核心优化的选项

arm-none-eabi-gcc [-mthumb] -mcpu=CPU[+extension...] -mfloat-abi=ABI

-mcpu

arm处理器,bcm2835使用的处理器核心是arm1176jzf-s

https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/ARM-Options.html#index-mcpu-2

-mfpu

默认auto,根据mcpu选择

-mfloat-abi

操作系统不需要使用floating-point ABI,可以忽略

soft softfp hard

https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/ARM-Options.html#index-mfloat-abi

-mthumb

用不到Thumb指令,可以忽略

multilibs

arm-none-eabi-gcc -mcpu=arm1176jzf-s -mfloat-abi=hard --print-multi-dir

arm/v5te/hard

看见arm1176实际的march参数是armv5te

C Libraries

使用newlib-nano

libc_nano.a libg_nano.a

在编译、链接时加 --specs=nano.specs

头文件 newlib.h

参考 readme.nano

makefile

K=kernel

OBJS = \
	$K/main.o\
	$K/uart.o\
	$K/string.o\
	$K/trap.o\
	$K/gpio.o\
	$K/timer.o\
	$K/spinlock.o\
	$K/mailbox.o\
	$K/kalloc.o\
	$K/vm.o\
	...

TOOLPREFIX = arm-none-eabi

CC = $(TOOLPREFIX)-gcc
LD = $(TOOLPREFIX)-ld
OBJCOPY = $(TOOLPREFIX)-objcopy
OBJDUMP = $(TOOLPREFIX)-objdump

CFLAGS  = -mcpu=arm1176jzf-s -fpic -ffreestanding -g -O0 -std=gnu99 -Wall -Wextra
ASFLAGS = -mcpu=arm1176jzf-s -fpic -ffreestanding -g -O0 -std=gnu99 -Wall -Wextra

$K/kernel: $(OBJS) $K/entry.o $K/kernel.ld
	$(LD) -Map $K/kernel.map -T $K/kernel.ld --oformat elf32-littlearm -o $K/kernel.elf $K/entry.o $(OBJS) -lgcc
	$(OBJDUMP) -S $K/kernel.elf > $K/kernel.asm
	$(OBJDUMP) -t $K/kernel.elf | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym
	$(OBJCOPY) $K/kernel.elf -O binary $K/kernel.img

clean: 
	rm -f $K/*.o $K/*.elf $K/*.asm $K/*.sym $K/*.img

install: $K/kernel.img
	md5 /Volumes/UNTITLED/kernel.img
	cp $K/kernel.img /Volumes/UNTITLED/
	md5 /Volumes/UNTITLED/kernel.img
	# hdiutil eject /Volumes/UNTITLED
	sudo umount /Volumes/UNTITLED

Clone this wiki locally