天天看點

skymixos之printk

  接收上一節的“hello skymixos”, 這次給skymixos加上類似printf這樣的格式化輸出功能,這對于我們後期的開發調試非常重要,這不,馬上就給安排上!還是老慣例,先上現象再來分析代碼: 

skymixos之printk

至于代碼實作也不是太複雜,畢竟我們是站在巨人的肩膀上開發的,有大量的優秀的開源代碼可以參考:比如 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, 下一步就是使用定時器了,畢竟有了定時器,有了切換才有程序排程的基礎!!!