嵌入式系统 Makefile 来编译一个简单的程序在 QEMU 模拟的 VersatilePB 开发板上的 UART0 上打印字符串并详细说明 Makefile 中的每一行用到了哪一个知识点
时间: 2024-09-19 07:17:21 浏览: 112
嵌入式系统的Makefile主要用于自动化构建过程,通常会在Linux开发环境中用于配置、编译和链接目标文件,以便生成可烧录到硬件的二进制文件。对于一个基于QEMU模拟VersatilePB开发板,并通过UART0打印字符串的基本示例,Makefile可能会包含以下几个部分:
```makefile
# 首先定义变量,如源文件、目标可执行文件、编译器等
CC = gcc
AS = nasm
OBJECTS = main.o uart.o
# 定义目标可执行文件
EXECUTABLE = my_program
# 编译规则,一般会依赖于源文件
%.o: %.c
$(CC) -c $< -o $@
# 将汇编源文件编译为.o文件
%.o: %.asm
$(AS) -f elf32-bfin $< -o $@
# 主目标,链接所有.o文件生成可执行文件
all: $(EXECUTABLE)
$(CC) $(OBJECTS) -o $@ -T link.ld -L/usr/lib/qemu-$(shell qemu-config --machine)/bfd -lqemu-bfin
# 清理规则,删除中间产物
clean:
rm -rf *.o $(EXECUTABLE)
# 使用qemu运行程序,指定串口设备
run:
qemu-system-bfin -M versatilepb -nographic -kernel $(EXECUTABLE) -serial stdio
# 当执行make run时,首先执行clean,然后编译,最后运行程序
.PHONY: clean run all
```
解释一下关键的几行:
1. `CC = gcc` 和 `AS = nasm`:设置默认的C编译器(gcc)和汇编器(nasm)。
2. `main.o: main.c`:当需要编译`main.c`为`main.o`时,使用`gcc -c`命令。
3. `uart.o: uart.asm`:类似地,将`uart.asm`汇编为`uart.o`。
4. `all: $(EXECUTABLE)`:当执行`make all`时,首先会编译所有的`.o`文件,然后链接成`my_program`。
5. `run` 目标:使用QEMU启动模拟环境,运行生成的可执行文件,并通过标准输入输出(stdio)连接到UART0。
6. `.PHONY: clean run all`:声明`clean`, `run`, 和 `all` 是伪目标,意味着它们的实际工作是在Makefile内部完成的。
相关问题:
1. Makefile的主要作用是什么?
2. 如何理解Makefile中的依赖规则?
3. 为什么要在Makefile中设置`-nographic`选项?
阅读全文