当前位置:首页 > 芯闻号 > 充电吧
[导读] 目的:在串口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

[剩余文件点我下载]

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

在实际项目中,我们经常需要提取一个数值的某些位的数码,比如用数码管来显示数值或将一个数值转成字符串,都会涉及到这一操作。

关键字: 数值 数码 printf

Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。

关键字: python 函数 对象编程

测试数据综合分析的绝佳工具,深受工程师和研究员欢迎

关键字: 后处理分析软件 向导 函数

由上图中可以知道进程地址空间中最顶部的段是栈,代码中调用函数、定义局部变量(但不包含static修饰的变量)或声明的类的实例等等都要使用栈空间,当函数执行完(也就是程序执行超过了这个函数的作用范围的时候),操作系统会把该...

关键字: 进程地址 局部变量 函数

星标/置顶 公众号,硬核文章第一时间送达!链接| https://zhuanlan.zhihu.com/p/274473971题很多,先上题后上答案,便于大家思考问题点:1、C和C的特点与区别?2、C的多态3、虚函数实现...

关键字: 腾讯 函数 进程 AI

程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务。面向过程语言最基本的单元是过程和函数。

关键字: 程序接口 过程 函数

星标「嵌入式大杂烩」,一起进步!链接:https://www.cnblogs.com/jozochen/p/8541714.html一、问题复现稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问...

关键字: 嵌入式开发 函数 代码 寄存器

基本上,没有人会将大段的C语言代码全部塞入main()函数。更好的做法是按照复用率高、耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常...

关键字: 函数 PEN C语言代码 C语言程序

Part1一、让自己习惯C条款01:视C为一个语言联邦C并不是一个带有一组守则的一体语言:他是从四个次语言(C、Object-OrientedC、Template、STL) 组成的联邦政府,每个次语言都有自己的规约。记住...

关键字: 函数 ASPECT 编译器

为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash,oops等棘手问题,一般大家都会用gdb,objdump或者addr2line等工具分析pc位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得...

关键字: 函数 ARM C语言 AI
关闭
关闭