Sunday, November 05, 2006

Console I/O Without OS

在〈Debugging Embedded Systems〉中曾建議:把 uC 的 UART 跟 PC 的 serial port 第一時間 link 起來,然後就可以在適當的地方 print out 一些訊息,幫助我們確認程式的執行狀況。

這個廣為採用的作法,在沒有 preemptive multitasking OS 支援下,很容易因 print out 的訊息太多,使系統 delay 過久。這在許多場合是無法接受的。一個常見的例子是同時處理另一個網路連線下,許多 protocol 都嚴格限制裝置回應時間。

解法也很簡單,只需把要 print out 的東西丟到 queue 中,然後再拆成一個個 char ,找時間分批餵給 PC 就好了。這叫「化整為零」:P

Renesas H8 系列 HEW 開發環境底層就有兩個分別被 stdin/stdout function 群共用, 處理單一 char 的 function : charput() 被 printf() 及 puts() 等調用;charget() 被 scanf() 及 gets() 等調用。

註:用於 MSC51 最著名的 Keil C 環境底層則分別調用 putchar() 和 _getkey() 。

我們只要自行定義 charput() 就可以解決前述發生在 print out 的 delay 問題。方法如下圖右半:

修改後的 console output (圖右半)讓我們可以無縫使用 printf() 及 puts() 等 functions ,不用改變對 ANSI C standard library 的使用習慣。

console input 部份(圖左半),雖然我也想盡量維持在 PC 下 C 程式的使用習慣,但還是難逃 Joel 提出的〈抽象滲漏法則〉,不但無法適用於 scanf() ,用於 gets() 時還要自行處理換行符號。

註:抽象滲漏法則--All non-trivial abstractions, to some degree, are leaky.

Tags: [] [] [] [] []

0 comments: