《嵌入式通信軟件設計》學習筆記——軟件劃分

幾種概念的區別:
任務與模塊
模塊是實現一特定功能的單元;任務是一個執行線程。
進程與任務
“進程”通常意味着執行線程有自己的內存保護和優先級。
任務沒有內存保護,所以一個任務可以訪問屬於另一個任務例程,兩個任務可以訪問相同的全局內存。

在一些小型設備中,通常在一個任務中具有多個模塊的功能實現,這是爲了使內存和上下文切換開銷都達到最小。

模塊與任務分解
一旦軟件被劃分成功能模塊後,在選擇按任務實現還是按模塊實現時應考慮一下問題:
(1)這些軟件模塊互相獨立,很少有交互嗎?如果是,採用任務實現。
(2)任務環境切換開銷對系統的正常運行可接受嗎?如果不能,儘量用模塊實現。
(3)任務爲完成其正常需要自己的定時器嗎?如果是,那麼在滿足(1)、(2)條件下考慮將它們按任務來實現。

以下是組織通信系統模塊和任務時應遵循的指導性原則:
(1)系統中有一個或多個驅動程序處理各種物理端口。每個驅動程序可以以任務或模塊的方式實現。每個驅動程序有一個或多箇中斷服務例程ISR。
(2)驅動程序與上層的分解/複用任務接口完成數據的接收和傳輸。這是接收到的幀進入系統的唯一入口。類似的,該任務是傳輸時與驅動程序接口的唯一實體。
(3)每一個協議設計爲一個模塊。如果它需要對事件(如定時器)進行獨立調度和處理,則將其按任務實現。如果環境切換開銷和任務間消息傳遞開銷不可接受,則可將多個協議模塊按一個任務運行。
(4)按控制平面和數據平面功能以及快行道/慢性道考慮對任務和模塊分組。硬件加速器件也有一定作用。
(5)簿記(housekeeping)管理平面功能,如SNMP代理和命令行接口CLI應有自己的任務。
(6)如果有存儲保護,則任務間接口通過消息實現;否則任務間接口爲功能性調用接口。

將這些原則與NMSS對照起來看,會發現NMSS確實是按照這些原則進行的。


函數接口和消息事件接口:
函數接口
兩個模塊處於同一任務或同一內存環境時可採用過程或函數。
函數按處理的不同可分爲兩種:
例:比如在第二層交換器中,交換任務調用驅動器函數sendframe()發送包數據。函數返回一個值,指出操作執行的狀態。
同步調用,這種函數在其完整行爲未執行完之前不會返回,即被阻塞。前面的例子,以太網的CSMA/CD協議要求:如果在試圖重發幀數據之前檢測到衝突,發送器要等待一隨機時間週期,如果交換任務因該條件而阻塞,它會延遲所有其它處理。
異步調用,一旦排隊工作完成,sendframe()函數立即返回,傳輸狀態不會立即返回。交換任務可以在以後的某個時間詢問驅動器以瞭解執行狀態。除了輪詢方式外,還有驅動器中斷方式。不過過快的中斷會使系統應接不暇,克服的方法就是採用回調函數。回調函數會由中斷服務例程(ISR)調用,因此最好使回調例程短小些,回調例程一般只將發生的事件或通知送給交換任務後就立即退出。

在NMSS的DS模塊中,回調函數一般做的事情就是改變一些處理函數的指針,或者數據區域的指針等。

消息/事件接口
如果處於不同內存區域的兩個任務需要通信,可採用消息/事件接口。消息庫將數據從源任務環境複製到一公共區域,然後通知目標任務,目標任務再將消息複製到自己的存儲區中。
當然,兩個任務處於同一內存區域,該方法也是有用的。(NMSS應該就是這樣的吧?)

發佈了20 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章