📄 printk.c
字号:
#include <stdarg.h>
#define FALSE (0)
#define TRUE (1)
static void PrintNum(unsigned long long udwNum, int wBase, unsigned int oSign)
{
unsigned long long n;
int count;
char toPrint[20];
if (oSign && ((long long)udwNum < 0) )
{
BSP_DisplayOutch('-');
udwNum = -udwNum;
}
count = 0;
while ((n = udwNum / wBase) > 0)
{
toPrint[count++] = (udwNum - (n*wBase));
udwNum = n ;
}
toPrint[count++] = udwNum;
for (n = 0; n < count; n++)
{
BSP_DisplayOutch("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
}
}
void printk(char *fmt, ...)
{
va_list ap; /* points to each unnamed argument in turn */
char c;
char *str;
int lFlag;
int base;
int sign;
unsigned int level;
/// 如果没有初始化成功prink设备,则直接返回
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
for (; *fmt != '\0'; fmt++)
{
lFlag = FALSE;
base = 0;
sign = FALSE;
if (*fmt == '%')
{
if ((c = *++fmt) == 'l')
{
lFlag = TRUE;
c = *++fmt;
}
switch (c)
{
case 'o':
case 'O': // 八进制数据
base = 8;
sign = FALSE;
break;
case 'd':
case 'D': // 十进制数据
base = 10;
sign = TRUE;
break;
case 'u':
case 'U': // 无符号数据
base = 10;
sign = FALSE;
break;
case 'x':
case 'X': // 十六进制数据
base = 16;
sign = FALSE;
break;
case 's': // 字符串
for (str = va_arg(ap, char *); *str; str++)
{
BSP_DisplayOutch(*str);
}
break;
case 'c': // 字符
#ifdef __PPC__
BSP_DisplayOutch(va_arg(ap, int));
#else
BSP_DisplayOutch((unsigned char)(va_arg(ap, int)));
#endif
break;
default:
BSP_DisplayOutch(c);
break;
} // end of switch
if (base)
{
PrintNum(lFlag ? va_arg(ap, long long) : (long long)va_arg(ap, int), base, sign);
}
} // end of if (*fmt == '%')
else
{
BSP_DisplayOutch(*fmt);
}
} // end of for (; *fmt != '\0'; fmt++)
va_end(ap); /* clean up when done */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -