本系列文章將完成乙個類似dos或linux或busybox或u-boot的命令終端。題目的「命令終端」之所以加引號,一來表示它不是真正意義上的終端,二來也可以說明並非自己一字一字寫出來的**。——本程式所用的原型來自u-boot2010.09,這個版本陪了我很久,使我一直不能忘懷。如今重拾**,也了卻心頭所念。
所謂工欲善其事,必先利其器,本文便是該工程的前期準備。包括如下內容:檢測按鍵,接收終端字元,將字元傳送到終端,printf函式的實現,等等。
以下分別給出與「終端」互動的各個函式。由於u-boot面向的是串列埠終端,而自己的實現的程式是作業系統中的終端。所以下面先介紹了u-boot中的實現(以smdk2440為例),再介紹自己的實現。
u-boot 的實現如下(注:已作了修改,下同):
int tstc(void)
int serial_tstc()
可以看到,這個實現最終是讀取串列埠的狀態寄存的某個位。具體可以檢視晶元手冊。
自己的實現如下:
/* implement of getch() */
#ifdef win32
#include /**
* return non-zero if a key pressed, zero if not.
* */
int mytstc(void)
#else
#include /* for tc***attr, echo, etc */
#include /* for stdin_fileno */
#include #include #include int mytstc(void)
u-boot實現如下:
int getc(void)
int serial_getc()
原理很簡單,就是判斷接收緩衝區是否有資料,沒有的話就一直等,否則就返回資料接收寄存中的值。
在windows中有getch可用,但linux無此函式,在curses庫中倒是有乙個,但這裡沒必要使用這個庫,網上有相應的實現函式,這裡按「拿來主義」,為保其完整性,連注釋也不修改。如下:
/* implement of getch() */
#ifdef win32
#include int mygetc(void)
#else
#include /* for tc***attr, echo, etc */
#include /* for stdin_fileno */
/*simulate windows' getch(), it works!!*/
int mygetc(void)
#endif
u-boot的實現如下:
void putc(const char c)
void serial_putc(const char c, const int dev_index)
上面提到的是傳送單個字元,傳送字串就迴圈呼叫該函式,如下:
void serial_puts(const char * s)
}
標準c庫裡面有putchar函式,直接使用之,如下:
void myputc(const char c)
void myputs(const char *s)
printf的實現主要呼叫vsprintf,該函式實現如下:
int myprintf(const char *fmt, ...)
/** 簡單版本
僅支援:%d %x %s %c
*/int myvsprintf1(char *buf, const char *fmt, va_list args)
++fmt;
// no flags
// no field width
// no precision
// no length
// specifier
switch (*fmt)
}*s = '\0';
return (int)(s - buf);
}
其中myitoa函式是itoa的實現,可參考筆者前段時間寫的文章。vsprintf函式如其注釋所示,支援的格式化十分有限。當然,網上已經有人實現了功能十分強大的vsprintf,可參閱文後鏈結。
注:關於串列埠的操作,大部分晶元原理是相似的,具體到某款晶元,只要按照其資料手冊中暫存器說明來編寫**就ok了。筆者就是參考u-boot的**,將這一套「終端」應用於某晶元平台上的。
unix環境高階程式設計筆記 (1) 準備篇
作者使用了自己的標頭檔案,導致每次都要匯入整個標頭檔案,而不知道具體的函式存在於哪個標頭檔案中。其實,我們可以使用man 把函式或結構 變數 所在的標頭檔案找出來,然後包含進去。比如要找到opendir所在的標頭檔案,就可以用 man opendir man opendir opendir 3 li...
Linux 下的GDB常用終端命令(1)
gdb 是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在 unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。所謂 寸有所長,尺有所短 就是這個道理。一般來說,gdb主...
終端使用 終端命令的格式
command options parameter 說明 先階段只需要 知道 通過以下兩種方式查詢命令幫助資訊。先學習常用命令及常用選項的使用即可,工作中如果遇到問題可以借助網路搜尋。1 方式一 comman help 說明 顯示 command 命令的幫助資訊 2 方式二 man command ...