[smart210] 裸板移植printf()与scanf()的步骤
平台:smart210
CPU:S5PV210
目标:在smart210裸板上移植stdio(标准输入输出)的两个核心函数,printf()与scanf()。
知识储备:
1.这里我们直接从主目录下的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 CFLAGS := -Wall -O2 -fno-builtin CPPFLAGS := -nostdinc -I$(INCLUDEDIR) export CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS objs := start.o main.o uart.o clock.o lib/libc.a stdio.bin: $(objs) ${LD} -Tstdio.lds -o stdio.elf $^ ${OBJCOPY} -O binary -S stdio.elf $@ ${OBJDUMP} -D stdio.elf > stdio.dis .PHONY : lib/libc.a lib/libc.a: cd lib; make; cd .. %.o:%.c ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< %.o:%.S ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< clean: make clean -C lib rm -f *.bin *.elf *.dis *.o
extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); extern int snprintf(char * buf, size_t size, const char *fmt, ...); extern int vsprintf(char *buf, const char *fmt, va_list args); extern int sprintf(char * buf, const char *fmt, ...); extern int vsscanf(const char * buf, const char * fmt, va_list args); extern int sscanf(const char * buf, const char * fmt, ...); extern void putc(unsigned char c); extern unsigned char getc(void); int printf(const char *fmt, ...); int scanf(const char * fmt, ...);
2.从/lib/Makefile分析lib/libc.a库文件的生成
objs := div64.o lib1funcs.o ctype.o muldi3.o printf.o string.o vsprintf.o libc.a: $(objs) ${AR} -r -o $@ $^ %.o:%.c ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< %.o:%.S ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< clean: rm -f libc.a *.o
int printf(const char *fmt, ...) { int i; int len; va_list args; va_start(args, fmt); len = vsprintf(g_pcOutBuf,fmt,args); va_end(args); for (i = 0; i < strlen(g_pcOutBuf); i++) { putc(g_pcOutBuf[i]); } return len; } int scanf(const char * fmt, ...) { int i = 0; unsigned char c; va_list args; while(1) { c = getc(); putc(c); if((c == 0x0d) || (c == 0x0a)) { g_pcInBuf[i] = '\0'; break; } else { g_pcInBuf[i++] = c; } } va_start(args,fmt); i = vsscanf(g_pcInBuf,fmt,args); va_end(args); return i; }