增加printf格式化打印字符串功能
添加console.c文件
#include <stdarg.h>
#include <common.h>
typedef unsigned int u32;
void sunxi_serial_putc (char c);
void puts(const char *s) {
char *src = (char *)s;
while(*src != '\0') {
sunxi_serial_putc(*src++);
}
}
static u32 mem_puts(const char *src, char *dst) {
u32 len = 0;
while(*src != '\0') {
if(*src == '\n') {
*dst++ = '\r';
len++;
}
*dst++ = *src++;
len++;
}
return len;
}
void int_to_string_dec(int val, char *dst) {
char stack[15];
char sign_flag = 0; // 0: active 1: positive
int i = 0,j = 0;
if(val == 0) {
dst[0] = '0';
dst[1] = '\0';
return;
}
if(val < 0) {
sign_flag = 1;
val = -val;
}
for( i = 0; val > 0; i++) {
stack[i] = val%10 + '0';
val /=10;
}
if(sign_flag == 1) {
dst[j++] = '-';
}
for( --i; i >= 0; i--, j++) {
dst[j] = stack[i];
}
dst[j] = '\0';
}
void int_to_string_hex(char lowcase, int val, char *dst) {
int i;
static char table_lowcase[] = "0123456789abcdef";
static char table_upcase[] = "0123456789ABCDEF";
char string[8];
if(val == 0) {
dst[0] = '0';
dst[1] = '\0';
return;
}
for(i = 0; i < 8; i++) {
if(lowcase)
string[i] = table_lowcase[val & 0x0000000F];
else
string[i] = table_upcase[val & 0x0000000F];
val >>= 4;
}
char continueZero = 1;
for(i = 7; i >= 0; i--) {
if(continueZero) {
if(string[i] == '0')
continue;
else
continueZero = 0;
}
*dst++ = string[i];
}
}
int vsprintf(char *buf, const char *fmt, va_list args) {
char string[16];
char *q = buf;
while(*fmt) {
if(*fmt == '%') {
++fmt;
switch(*fmt) {
case 'd':
int_to_string_dec(va_arg(args, int), string);
q += mem_puts(string, q);
fmt++;
break;
case 'x':
int_to_string_hex(1, va_arg(args, int), string);
q += mem_puts(string, q);
fmt++;
break;
case 'X':
int_to_string_hex(0, va_arg(args, int), string);
q += mem_puts(string, q);
fmt++;
break;
case 'c':
*q++ = va_arg(args, int);
fmt++;
break;
case 's':
q += mem_puts(va_arg(args, char *), q);
fmt++;
break;
default:
*q++ = '%';
*q++ = *fmt++;
}
} else {
if(*fmt == '\n')
*q++ = '\r';
*q++ = *fmt++;
}
}
*q = '\0';
return q-buf;
}
int sprintf(char *buf, const char *fmt, ...) {
va_list args;
int i;
va_start(args, fmt);
i = vsprintf(buf, fmt, args);
va_end(args);
return i;
}
int printf(const char *fmt, ...) {
va_list args;
char printbuffer[512];
int count;
va_start(args, fmt);
count = vsprintf(printbuffer, fmt, args);
va_end(args);
puts(printbuffer);
return count;
}
解决掉简单的函数依赖关系之后编译依然失败:
提示找不到 raise
,不知道这是个什么东西;看错误提示,大概意思是在libgcc.a
的__aeabi_ldiv0
函数里面使用了raise
,看字眼应该是libgcc.a
里面提供的和除法相关的功能,我刚才新加入的 console.c
文件里面使用了除法;为了验证这个猜测,我将console.c
里面的除法运算注释掉:
重新编译,没问题了;这个raise
看是是预留给外部的一个接口,那要怎么补充呢?查看了一下官方源码
什么都没做,直接返回0,OK,拷贝&粘贴