uart_stdio实验
扫描二维码
随时随地手机看文章
大致内容和uart实验类似,这里只分析两个文件。目的:在串口0上实现printf、scanf等函数,它使用scanf、sscanf、printf等函数从串口接收一个十进制数字序列,然后将它转化为十六进制输出。
stdio.lds
SECTIONS {
. = 0x00000000;
.init : AT(0){ head.o init.o nand.o}
/*将上面文件对应的运行地址设为0,加载地址(存在NAND Flash上的地址)设为0.
从NAND Flash启动时,这些代码被复制到Steppingstone后就可以直接运行*/
. = 0x30000000;
.text : AT(4096) { *(.text) }/*加载地址设为4096*/
.rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {*(.rodata*)}
.data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)&~(0x03)) { *(.data) }
/*因为前面使用 ALIGN(4)使得运行地址为4字节对齐,所以后面各段之间的加载地址相对偏移值应该等于
运行地址的相对偏移值,需要将AT(...)中的值也设为4字节对齐:先加上3,然后&~(0x03),(将低2位设为0)*/
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}
Makefile
CC = arm-linux-gcc
LD = arm-linux-ld
AR = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
INCLUDEDIR := $(shell pwd)/include #打印本文件夹路径赋值给 INCDIR
CFLAGS := -Wall -O2 #-Wall:打开警告信息 -O2:2级优化(常用)
CPPFLAGS := -nostdinc -I$(INCLUDEDIR) #-nostdinc:不在标准系统目录中搜索头文件,只在-I指定的目录中搜索
export CC LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS #导出这些变量到全局,其实就是给子文件夹下面的Makefile使用
objs := head.o init.o nand.o serial.o main.o lib/libc.a #lib/libc.a 在子makefile中生成的目标
stdio.bin: $(objs)
${LD} -Tstdio.lds -o stdio_elf $^
${OBJCOPY} -O binary -S stdio_elf $@
${OBJDUMP} -D -m arm stdio_elf > stdio.dis
.PHONY : lib/libc.a
#.PHONY是一个伪目标,可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,另一种是提高执行makefile时的效率。
lib/libc.a:
cd lib; make; cd ..
#切换到lib文件夹,执行make指令,然后返回到上一级目录。
%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean:
make clean -C lib
rm -f stdio.bin stdio_elf stdio.dis *.o
[剩余文件点我下载]