skymixos之printk

  接收上一节的“hello skymixos”, 这次给skymixos加上类似printf这样的格式化输出功能,这对于我们后期的开发调试非常重要,这不,马上就给安排上!还是老惯例,先上现象再来分析代码: 

skymixos之printk_第1张图片

至于代码实现也不是太复杂,毕竟我们是站在巨人的肩膀上开发的,有大量的优秀的开源代码可以参考:比如 u-boot, linux内核等。下面就来分析下代码,就从我们最熟悉的main函数开始吧:

int main(void)
{		
	serial_init();
	serial_puts("+++ Hello Skymixos +++\n");

	printk("hello world!\n");
	printk("mem addr: 0x%x, size: 0x%x\n", 0x80000000, 0x4000000);
	printk("char print test: %c\n", 'h');
	printk("dec print test: %d\n", 10);

	return 0;
}

 很简单,就是调用printk进行一些格式化输出。需要注意的是printk函数属于变参函数(传递的参数的个数是可变的),其实现如下:

int printk(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;
}

核心在于vsprintf函数,如果想细细研究其内部实现,就把代码拉下来自己细细看吧。当然,有任何问题可以给LZ留言!!

到这里一个简单粗暴的printk就实现了,接下来会给printk再加些辅助功能(比如:支持打印优先级,打印时间戳等)

完成基本的打印功能的skymixos, 下一步就是使用定时器了,毕竟有了定时器,有了切换才有进程调度的基础!!!

你可能感兴趣的:(Skymixos,Linux-0.11代码分析,ARM9)