-
工具准备:
(1)交叉编译器:
不同的开发板可能需要不同的交叉编译器,笔者之前使用的开发板型号好像是STM32F407VG-Discovery,记不太清了,目前开发板不在身边,不能真机调试,先说一些理论方面的内容。笔者选用的交叉编译器是arm-none-eabi-gcc、arm-none-eabi-gdb, 大家可以到这个地址下载最新版:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads。
关于编译器的选择这里要简单讲一下,arm-none-eabi-gcc这个名字是依据一种特定格式的。
命名规则:
交叉编译工具链的命名规则为:
-
arch [-vendor] [-os] [-(gnu)eabi]
-
arch - 体系架构,如ARM,MIPS
-
verdor - 工具链提供商
-
os - 目标操作系统
-
eabi - 嵌入式应用二进制接口
由于我们要尝试开发一款RTOS内核,是开发针对裸机的程序,所以选择了arm-none-eabi-gcc。
有时候为了定制交叉编译器,可能还需要我们自己编译一个交叉编译器以及相对应的c库(由于库体积原因,一般是用newlib这个嵌入式c库,而不用gnu的完整版c库)
(2)OpenOCD:这个是支持在线单步调试的,具体用法后面再详解,需要STLinkV2硬件
(3)Makefile:
Makefile是用来管理如何编译我们的代码的,具体Makefile知识读者可以自行百度学习。
下面这个Makefile是笔者从网上整理并修改的,大家可以简单看一下。
TOOLCHAIN_DIR=/home/jeremy/bin/gcc-arm-none-eabi-8-2018-q4-major
AS=$(TOOLCHAIN_DIR)/bin/arm-none-eabi-as
CC=$(TOOLCHAIN_DIR)/bin/arm-none-eabi-gcc
OBJCOPY=$(TOOLCHAIN_DIR)/bin/arm-none-eabi-objcopy
LD=$(TOOLCHAIN_DIR)/bin/arm-none-eabi-ld
CFLAGS=-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mthumb -mfloat-abi=soft --specs=nosys.specs -nostartfiles -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F407xx -DUSE_HAL_DRIVER -std=gnu11 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" #-c -o "$@" "$<"
# CFLAGS += -fpic -pie
CFLAGS+=-I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/cmsis -I$(INCLUDE_DIR)/stm32f4-hal
SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "bin" && $$9 != "include") print $$9}')
ROOT_DIR=$(shell pwd)
INCLUDE_DIR=$(ROOT_DIR)/include
ELF=bootloader.elf
BIN=bootloader.bin
BIN_D