在這一章里,我試圖把到目前為止所有我們討論過(guò)的單元合在一起,使之成為一個(gè)完整的嵌入式的應(yīng)用程序。在這里我沒(méi)有把很多新的素材加入到討論中,因此本章主要是描述其中給出的代碼。我的目的是描述這個(gè)應(yīng)用程序的結(jié)構(gòu)和它的源代碼,通過(guò)這種方式使你對(duì)它不再感到神奇。完成這一章以后,你應(yīng)該對(duì)于示例程序有一個(gè)完整的理解,并且有能力開(kāi)發(fā)自己的嵌入式應(yīng)用程序。應(yīng)用程序的概述
我們將要討論的這個(gè)應(yīng)用程序不比其他大部分tb編程書(shū)籍中找到的“Hello,World”例子更復(fù)雜。它是對(duì)于嵌入式軟件開(kāi)發(fā)的一個(gè)實(shí)證,因此這個(gè)例子是出現(xiàn)在書(shū)的結(jié)尾而不是開(kāi)始。我們不得不逐漸地建立我們的道路通向大部分書(shū)籍甚至是高級(jí)語(yǔ)言編譯器認(rèn)為是理所當(dāng)然的計(jì)算平臺(tái)。
一旦你能寫“Hello, World”程序,你的嵌入式平臺(tái)就開(kāi)始著上去很像任何其他編程環(huán)境。但是,嵌入式軟件開(kāi)發(fā)過(guò)程中最困難的部分——使自己熟悉硬件,為它建立一個(gè)軟件開(kāi)發(fā)的過(guò)程,連接到具體的硬件設(shè)備——還在后面呢。最后,你能夠把你的力量集中于算法和用戶界面,這是由你要開(kāi)發(fā)的產(chǎn)品來(lái)確定的。很多情況下,這些程序的高級(jí)方面可以在其他的計(jì)算機(jī)平臺(tái)上開(kāi)發(fā),和我們一直在討論的低級(jí)的嵌入式軟件開(kāi)發(fā)同時(shí)進(jìn)行,并且只要把高級(jí)部分導(dǎo)入嵌入式系統(tǒng)一次,兩者就都完成了。
圖 9-1 包含了一個(gè)“Hello, World!”應(yīng)用程序的高級(jí)的示意圖。這個(gè)應(yīng)用程序包括三個(gè)設(shè)備驅(qū)動(dòng)程序,ADEOS 操作系統(tǒng)和兩個(gè)ADEOS 任務(wù)。第一個(gè)任務(wù)以每秒10Hz 的速度切換Arcom 板上的紅色指示燈。第二個(gè)每隔10 秒鐘向主機(jī)或是連接到位子串口上的啞終端發(fā)送字符串“Hello,WOrld!”。這兩個(gè)任務(wù)之外,圖中還有三個(gè)設(shè)備的驅(qū)動(dòng)程序。這些驅(qū)動(dòng)程序分別控制著Arcom 板子的指示燈、時(shí)鐘以及串行端口。雖然通常把設(shè)備驅(qū)動(dòng)畫(huà)在操作系統(tǒng)的下面,但是我把它們?nèi)齻€(gè)和操作系統(tǒng)放在同一個(gè)級(jí)別,是為了著重說(shuō)明它們事實(shí)上依賴于ADEOS 比ADEOS 依賴于它們更多。實(shí)際上,ADEOS 嵌入式操作系統(tǒng)甚至不知道(或者說(shuō)下關(guān)心)這些設(shè)備驅(qū)動(dòng)是否存在于系統(tǒng)之中。這是嵌入式操作系統(tǒng)中設(shè)備驅(qū)動(dòng)程序和其他硬件專用軟件的共性。
程序 main()的實(shí)現(xiàn)如下所示。這段代碼簡(jiǎn)單地創(chuàng)造廠兩個(gè)任務(wù),tb啟動(dòng)了操作系統(tǒng)的日程表。在這樣一個(gè)高的級(jí)別上,代碼的含義是不言而喻的。事實(shí)上、我們已經(jīng)在上一章中討論了類似的代碼。
#include "adeos.h"
void flashRed(void);
void helloWorld(void);
/*
* Create the two tasks.
*/
Task taskA(flashRed, 150, 512);
Task taskB(helloWorld, 200, 512);
/****************************************************
*
* Function : main()
*
* Description : This function is responsible for starting the ADEOS scheduler
only.
*
* Notes :
*
* Returns : This function will never return!
*
****************************************************/
void
main(void)
{
os.start();
// This point will never be reached.
} /* main() */