当前位置:首页 > 芯闻号 > 充电吧
[导读] 目的:在串口0上实现printf、scanf等函数,它使用scanf、sscanf、printf等函数从串口接收一个十进制数字序列,然后将它转化为十六进制输出。 大致内容和uart实验类

目的:在串口0上实现printf、scanf等函数,它使用scanf、sscanf、printf等函数从串口接收一个十进制数字序列,然后将它转化为十六进制输出。

大致内容和uart实验类似,这里只分析两个文件。

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

[剩余文件点我下载]

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭