旗標與開關
美國郵差,除了會將信送進住戶的信箱之外,也會從信箱中拿走住家要寄送的信件。由於送信時間不會很精準,一般住家院子又很大,在雨天,雪天時,住戶查看信箱有沒有信進入,來來回回是很煩很痛苦的事,因此大部份的信箱都會附加一個可以舉起來以及放下去的小旗子,被稱為旗標,當郵差來過送信並取走寄來信時,會把旗標舉起來,而住戶在房字內遠遠觀看旗標舉起時,便會知道可以去拿收信。收完信之後,住戶會將旗標放下,表示信箱已空。這個概念,在電腦發明時,就被用來表達單一有無,是非,等等只有兩種選擇的狀態,並稱它為單位元旗標。
電腦記錄資料的最小單元,是單一位元,它只有兩個狀態不是0就是1。 許多物理裝置例如說電燈及開關,都與電腦位元一樣有ON/OFF兩種狀態。因此,透過電腦的單一位元即可以控制一個開關或則單一受控裝置的啟閉。在電腦 硬體上用於控制開關的單一位元被稱為是一個控制旗標。而用來表達一個裝置的狀態的位元則稱做是狀態旗標。
在軟體程式上,旗標佔了一個unsinged Char變數的一個位元,在硬體輸出入(平行埠)佔了對應unsinged Char變數的八支腳中的一支腳。
#2-3
暫存器
雖然說在電腦中記錄資料的最小單位為1個位元,但是一般的電腦,在讀寫資料時,每一批次會同時讀寫多個位元。電腦每批次讀寫的資料稱為一個字元(Word),例如AVR ATmega128微控器的字元為8位元,但一些DSP專用微控器如,ADSP2100,每字元為16位元,PC早期所用的CPU為32位元,直到升級到工作站等級時,CPU便升級到每字元為64位元。
為了方便計算,電腦科學將8位元編為一組,稱它是位元組,Byte。要表示一個位元組的值,可以列出位元組內每一位元的值,例如b0001 0010,這種方式被稱為2進制表示法。 位元組內各個位元的名稱,一般以最右邊為第0位元,記為b0,然後向左依序為第1位元記為b1,第2位元記為b2,一直到最左邊的第7位元記為b7,共8個位元。如先前例子,位元組b0001 0100中除b4,b2為1以外,其它位元全的都是0。
在C語言程式碼,可以處理的最小變數單位為位元組BYTE,而每一個位元組是由8個位元共同組成,由於每一個位元可以有ON/OFF 兩種可能,所以8個位元總共有2^8=256種可能位元值組合,每一種位元值組合可以表示一個編碼,這些編碼可以用來表示不同的數字或意義。
當一個位元組內的八個位元均被用來做為旗標時,這個位元組被稱做是一個暫存器。
暫存器除了與記憶體一樣可以記存資料之外,也可以用來控制及監視物理世界。在C語言中,我們可以定義佔用一個位元組的變數做為軟體暫存器,存放即將對硬體輸出埠輸出旗標群內容,或則準備存放由硬體輸入埠讀到的旗標群內容。
#3-4
電腦的變數、記憶體與暫存器
電腦主要有三大部份,第一為CPU,第二為記憶體,第三為週邊電路。透過讀寫變數的方式,電腦CPU可以與記憶體或週邊電路交換資料或下達命令。對記憶體的讀寫最終會存取記憶體記憶內容,對週邊讀寫則會存取暫存器的內容。
暫存器從可以記憶資料的角度來看,它也是記憶體,只是這些記憶體具有特殊的功能,邊週電路會參考控制暫存器上的BIT值而行使不同的硬體電路功能,而狀態暫存器的各bit值會表現週邊電路硬體的某些現有的性質。
由於目的的不同,暫存器與記憶體雖然一樣是記憶資料,但使用的硬體電路設計方式可能不同,所以其記憶及輸出的反應速率也會不同。
為了適應對記憶體及暫存器反應速度的不一樣,電腦廠商對於記憶體與週邊暫存器之區分,有兩大不同品系分別以Intel及Motorola為代表,一個為Memory Map I/O一個為 I/O Map I/O。Memory map I/O 的設計方法不分記憶體或I/O暫存器,大家共用相同的WR,RD線,再將某些記憶體區塊分給暫存器使用。IO map IO的方式則分別以WR RD線做為Memory的讀寫控制線,而IORD, IOWR 線做為IO REGISTER的讀寫控制線。
以下為ATMega128的暫存器總整理表的一部份,整個表有0XFF個位址,佔太多頁,因此在本講義中我們只提供一小部份讓學生看到表的樣子以及內容編排,詳細的暫存器表在參考手冊中可以找到。由於AVR ATMega128是採則MEMORY MAP IO的方式設計,所以其暫存器與記憶體共同分享記憶體位址。
利用對硬體暫存器存取資料,電腦可以控制週邊硬體按照程式設計來執行工作。 程式設計者可撰寫組合語言或者是C語言程式,讀寫CPU暫存器以控制其運算。
在C語言中對暫存器的存取及運算,完全就像一般的變數,一般變數會佔用記憶體,並由編譯器做變數名稱與記憶體位址的聯結。AVR ATMega128的硬體暫存器的變數名稱即為這個暫存器的名稱,它的變數名稱與記憶體位置的對應是由GCC在函式庫的前置碼檔中即已完成宣告。因此應用程式在使用硬體暫存器時就如同使用一個一般的變數,只要命令AVR ATMega128對這個名稱的變數存取,編譯器會自動找到記憶位址完成存取工作。
電腦週邊硬體的設定,監視,及操控
實驗中,關於硬體的監控,均提供了硬體驅動程式供學生呼叫使用。學生以呼叫驅動函式的方式來控制硬體週邊。這類形的自動化應用軟體的寫作方式,被稱作是基於函式的監控方法(Functional Based)。 這種方式,程式設計師不用搞懂微控器(電腦)的週邊硬體設計,優點是簡單,程式可攜性高,缺點是,所有的硬體動作均依賴別人所撰寫完成的現成驅動函式,如果找不到適當的硬體驅動函式,就無法使用該項硬體週邊。
本單元介紹的硬體暫存器,以及讀寫硬體暫存器來監控週邊硬體的方式,人稱是基於暫存器的監控方式(Register Based)。其優點是,彈性大,性能佳,程式寫作者可以完全發揮硬體的特性。缺點是,監控程式寫作人員,必需要搞懂週邊硬體相關資料,學習的門檻比較高,開發一個系統需要的時間拉長。
Register Based與 Functional Based之間的關係,並不是競爭關係,而是產業分工的合作中上下游的關係。由於教育訓練不易,技術成熟能夠執行Register Based的工程師相對少,所以上下游逐漸分工成為上游的韌體工程式,專門為IC設計公司,或IT (資訊科技)公司撰寫驅動函式,而下游的Functional Based軟體工程師則純作應用軟體。
本課程彷效IC設計公司,或IT 公司的分工,以驅動函式的撰寫及使用來執行上下游分割,將實驗區分為基礎與進階兩級。讓學生可以更輕易的以Functional based方式來完成基礎實驗,達成軟體工程師養成,然後再在進階課程中,提供學生學習以Register Based技術撰寫驅動函式的訓練機會。 讓能夠完成進階課程之學生,可以將求職的領域擴展到包含韌體工程師。
#4-5