官术网_书友最值得收藏!

1.2 無操作系統時的設備驅動

并不是任何一個計算機系統都一定要有操作系統,在許多情況下,操作系統都不必存在。對于功能比較單一、控制并不復雜的系統,譬如ASIC內部、公交車的刷卡機、電冰箱、微波爐、簡單的手機和小靈通等,并不需要多任務調度、文件系統、內存管理等復雜功能,用單任務架構完全可以良好地支持它們的工作。一個無限循環中夾雜著對設備中斷的檢測或者對設備的輪詢是這種系統中軟件的典型架構,如代碼清單1.1所示。

代碼清單1.1 單任務軟件典型架構

 1 int main(int argc, char* argv[])
 2 {
 3   while (1)
 4   {
 5     if (serialInt == 1)
 6     /* 有串口中斷 */
 7     {
 8       ProcessSerialInt();   /* 處理串口中斷 */
 9       serialInt = 0;        /* 中斷標志變量清0 */
10     }
11     if (keyInt == 1)
12     /* 有按鍵中斷 */
13     {
14       ProcessKeyInt();      /* 處理按鍵中斷 */
15       keyInt = 0;           /* 中斷標志變量清0 */
16     }
17     status = CheckXXX();
18     switch (status)
19     {
20       ...
21     }
22     ...
23   }
24 }

在這樣的系統中,雖然不存在操作系統,但是設備驅動則無論如何都必須存在。一般情況下,每一種設備驅動都會定義為一個軟件模塊,包含.h文件和.c文件,前者定義該設備驅動的數據結構并聲明外部函數,后者進行驅動的具體實現。譬如,可以像代碼清單1.2那樣定義一個串口的驅動。

代碼清單1.2 無操作系統情況下串口的驅動

 1  /**********************
 2   *serial.h文件
 3   **********************/
 4  extern void SerialInit(void);
 5  extern void SerialSend(const char buf*,int count);
 6  extern void SerialRecv(char buf*,int count);
 7  
 8  /**********************
 9   *serial.c文件
10   **********************/
11  /* 初始化串口 */
12  void SerialInit(void)
13  {
14   ...
15  }
16  /* 串口發送 */
17  void SerialSend(const char buf*,int count)
18  {
19   ...
20  }
21  /* 串口接收 */
22  void SerialRecv(char buf*,int count)
23  {
24   ...
25  }
26  /* 串口中斷處理函數 */
27  void SerialIsr(void)
28  {
29   ...
30   serialInt = 1;
31 }

其他模塊想要使用這個設備的時候,只需要包含設備驅動的頭文件serial.h,然后調用其中的外部接口函數。如要從串口上發送“Hello World”字符串,使用語句SerialSend(“Hello World”,11)即可。

由此可見,在沒有操作系統的情況下,設備驅動的接口被直接提交給應用軟件工程師,應用軟件沒有跨越任何層次就直接訪問設備驅動的接口。驅動包含的接口函數也與硬件的功能直接吻合,沒有任何附加功能。圖1.1所示為無操作系統情況下硬件、設備驅動與應用軟件的關系。

圖1.1 無操作系統時硬件、設備驅動和應用軟件的關系

有的工程師把單任務系統設計成了如圖1.2所示的結構,即設備驅動和具體的應用軟件模塊之間平等,驅動中包含了業務層面上的處理,這顯然是不合理的,不符合軟件設計中高內聚、低耦合的要求。

圖1.2 驅動與應用高耦合的不合理設計

另一種不合理的設計是直接在應用中操作硬件的寄存器,而不單獨設計驅動模塊,如圖1.3所示。這種設計意味著系統中不存在或未能充分利用可重用的驅動代碼。

圖1.3 應用直接訪問硬件的不合理設計

主站蜘蛛池模板: 凤城市| 兰坪| 谢通门县| 武川县| 广平县| 无极县| 黔江区| 张家界市| 宁阳县| 淮滨县| 郓城县| 怀柔区| 石渠县| 太和县| 南乐县| 新乐市| 勃利县| 衡阳市| 乌恰县| 太白县| 清丰县| 东兰县| 丰都县| 香港 | 永德县| 济南市| 濮阳县| 金溪县| 千阳县| 文山县| 涿鹿县| 肇庆市| 无锡市| 永平县| 夏津县| 濮阳县| 天等县| 武强县| 泸州市| 四平市| 青川县|