「命令終端」的實現1 準備篇

2021-10-09 21:54:30 字數 2358 閱讀 2554

本系列文章將完成乙個類似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 ...