專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

模塊化管理和設(shè)計(jì)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月13日   【字體:
現(xiàn)在的程序設(shè)計(jì)都希望模塊化,這樣不僅僅能夠?qū)崿F(xiàn)不同代碼的復(fù)用,提高開發(fā)速度,同時(shí)也減小了在維護(hù)過程中的難度。不同的模塊具有不同的功能。這樣也就方便了單獨(dú)操作。比如在C語言中函數(shù)的設(shè)計(jì)使得不同的開發(fā)人員可以協(xié)同合作,而不是從頭到尾一個(gè)過程。因此模塊化的設(shè)計(jì)是非常的必要的。只需要在前期規(guī)劃的過程中劃分好最基本的模塊就可以方便后期的設(shè)計(jì),當(dāng)然前期的劃分方式也直接決定后期開發(fā)的難度和速度。因此前期的分配過程是體現(xiàn)設(shè)計(jì)師能力的重點(diǎn)。
 
在Linux中驅(qū)動(dòng)程序的添加和移除就是典型的模塊化操作,這樣也就方便了基本的操作。這樣通過模塊的注冊(cè)和注銷操作就能夠?qū)崿F(xiàn)模塊的添加。而且在Linux中模塊的注冊(cè)和釋放都是采用同樣的函數(shù)實(shí)現(xiàn)。因此我們可以想象在我們的模塊化設(shè)計(jì)中也可以采用類似的方式實(shí)現(xiàn)。也就是通過統(tǒng)一的注冊(cè)方式。但是具體的模塊操作采用回調(diào)函數(shù)的形式,這與linux驅(qū)動(dòng)中的file_operations結(jié)構(gòu)體具有異曲同工之妙,也就是通過一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)不同的函數(shù)接口,而基本的實(shí)現(xiàn)過程需要我們?cè)谠O(shè)計(jì)驅(qū)動(dòng)的過程中進(jìn)行實(shí)現(xiàn),也就是采用函數(shù)指針的方式進(jìn)行調(diào)用,即實(shí)現(xiàn)回調(diào)。這樣我們就能實(shí)現(xiàn)不同模塊的具體操作。
 
模塊的管理應(yīng)該包含兩個(gè)過程:注冊(cè)和注銷,同時(shí)注冊(cè)又包括初始化和啟動(dòng),注銷包括停止和撤銷操作。因此可以采用一個(gè)4種狀態(tài)的狀態(tài)圖表示。
 
但是很多情況下的模塊化存在一定的依賴關(guān)系,這與我們?cè)趯慚akefile中的依賴一樣,需要?jiǎng)?chuàng)建一些其他的模塊才能創(chuàng)建當(dāng)前模塊。為了解決這種問題,我們通常對(duì)模塊進(jìn)行分層設(shè)計(jì)。也就是將存在一定依賴關(guān)系的模塊放在不同的層次上,通過逐層逐層的初始化方式進(jìn)行模塊初始化。這樣就能較好的解決依賴問題。但是有時(shí)候同層也會(huì)存在一定的依賴關(guān)系,這時(shí)我們可以采用分級(jí)的方式解決一定的依賴關(guān)系。因此我們可以將依賴關(guān)系最高的模塊放在最低的層次上,先進(jìn)行初始化,這樣方便其他的模塊對(duì)其進(jìn)行依賴。然后在對(duì)其他的層次初始化。
 
在實(shí)際的開發(fā)中通常采用不同三層模式,即:平臺(tái)層(這層的模塊對(duì)象先初始化),框架層(第二初始化),應(yīng)用層(最后初始化)。同層的依賴關(guān)系也可以采用分級(jí)(本質(zhì)與分層是相同的)解決。
 
但是在撤銷的過程中我們需要注意的是,撤銷的順序必須與初始化的順序相反,這也是依賴關(guān)系所導(dǎo)致的,只有先撤銷后初始化的模塊才不會(huì)破壞對(duì)其他模塊的影響。
 
模塊的管理是模塊化設(shè)計(jì)中非常重要的一環(huán)節(jié),采用回調(diào)函數(shù)的方式能夠很好的解決不同模塊的初始化操作。因此通用的函數(shù)接口也是不斷總結(jié)和分析得到的。
 
鏈表在模塊化管理中有很重要的作用,記得在Linux中鏈表中不存在內(nèi)容,只是兩個(gè)指針,但是通常將鏈表嵌入到模塊結(jié)構(gòu)體中就能實(shí)現(xiàn)不同模塊的級(jí)聯(lián)。
 
分層的方式下可以采用鏈表將該層中所有的模塊對(duì)象關(guān)聯(lián)起來,也就是將一個(gè)簡單的鏈表結(jié)構(gòu)體節(jié)點(diǎn)嵌入到模塊結(jié)構(gòu)體中,通常放在第一個(gè)元素的位置上,這樣就可以通過鏈表指向的地址表示模塊的地址(第一個(gè)元素的地址和結(jié)構(gòu)體的地址是相同的這一原理)。當(dāng)然也可以不放在第一個(gè)元素的位置上,這在 linux源碼中經(jīng)常可發(fā)現(xiàn)。
  1. typedef struct list_node
  2. {
     
  3.      struct list *prev;
     
  4.      struct list *next;
     
  5. } list_node;
     

  6.  
  7. typedef struct list
     
  8. {
     
  9.      struct list* prev;
     
  10.      struct list* next;
     
  11.      int list_count;
     
  12. } list;
     

  13.  
  14. typedef struct module_object
  15. {
     
  16.      list_node _node;
  17.      ....
     

  18.  
  19. } module_object;
 
模塊和層次的實(shí)現(xiàn)可以采用枚舉型結(jié)構(gòu)事先安排好所有的模塊和所需要的層次,但是最好在其中設(shè)置相應(yīng)的統(tǒng)計(jì)參數(shù),便于參數(shù)的檢查。
比如:
  1. typedef enum
  2. {
     
  3.    /*不同的模塊*/
     
  4.    module0,
     
  5.    module1,
     
  6.    module2,
     
  7.    ...
     
  8.    moduleN-1,
     
  9.    /*統(tǒng)計(jì)模塊的總數(shù)*/
     
  10.    module_count,
     
  11.    /*記錄最后的一個(gè)標(biāo)號(hào)*/
     
  12.    module_last = module_count -1,
     
  13. }modules;
     

  14.  
  15. typedef enum
  16. {
     
  17.    //platform layer,平臺(tái)層分級(jí)
     
  18.    PLayer0,
     
  19.    PLayer1,
     
  20.    ...
     
  21.    PLayerM-1,
     
  22.    //framework layer,框架層分級(jí)
     
  23.    FLayer0,
     
  24.    FLayer1,
     
  25.    ...
     
  26.    FLayerN-1,
     
  27.   
     
  28.    //application layer,應(yīng)用層分級(jí)
     
  29.    ALayer0,
     
  30.    ALayer1,
     
  31.    ...
     
  32.    ALayerT-1,
     

  33.  
  34.    //統(tǒng)計(jì)層數(shù)
     
  35.     layer_count,
     
  36.     layer_last = layer_count - 1,
     
  37. }Layer;

上面就能實(shí)現(xiàn)分層和模塊的管理,通過下標(biāo)就能訪問具體的層和具體的模塊。當(dāng)然這些都需要我們?cè)趯?shí)際的設(shè)計(jì)中首先規(guī)劃好所有的層次和模塊關(guān)系。

其實(shí)反過來看看linux的模塊化管理真的是做的非常好,因此多去理解linux源碼對(duì)我們的軟件設(shè)計(jì)有很大的提高,重要的是思想。

關(guān)閉窗口

相關(guān)文章