徐玉蓮
(新疆農業職業技術學院 信息技術分院, 昌吉 831100)
隨著計算機程序復雜化程度逐漸提高,對系統軟件更新速度的需求逐漸提升,C語言兼具高初級語言特性,支持對硬件的直接操作,在普遍應用的嵌入式軟件開發過程中使用較多的便是C語言,在提高靈活性的同時易增加復雜代碼管理和維護的難度,在特定硬件平臺上建立的嵌入式系統編程需解決復雜的硬件操作問題,并實現應用層次上的通用性,需采用良好的軟件框架完成軟件開發過程,提高程序代碼的重用性、拓展性,實現工程化管理,提高軟件系統的開發和維護效率。
分層技術可將復雜問題轉化成具體的應用功能,隨著嵌入式系統應用越來越復雜,對嵌入式系統采用分層技術進行設計,可使軟件開發效率得以有效提升。
為實現復雜的軟件系統功能,需有效分解開發需求,將軟件按照概念層次、功能等的不同劃分為相應的軟件模塊,在此基礎上確定不同模塊間的關系。對軟件邏輯架構進行分層時需遵循的原則為:兼顧功能顆粒度和可重用性,各層針對不同的問題能夠提供相應的解決方案,上層應用能夠從下層獲取相應支撐,以監測環境溫度功能為例,根據概念的不同將其劃分為采集層、處理層、顯示層等,確保整體功能遞進實現;最大程度降低層與層間的相關性,避免某一層出現問題后對軟件系統的整體性能產生影響,如顯示層沒有處理或修改溫度數據的權限,使處理層的邏輯實現更加獨立快速;確保軟件功能的高內聚、低耦合,進行各層內部模塊劃分時需按照任務分解、功能優化、重用程度完成[1]。
遵循最優模塊化的設計思路,詳細設計系統邏輯架構,針對嵌入式應用軟硬層次比較明顯等特點,對軟件功能模塊進行梳理和劃分:梳理嵌入式系統應用需求(采取自頂向下的方法),邏輯功能抽象化處理后得到明確的概念層次,在此基礎上轉化為軟件層次,屬于漸進過程,以電子羅盤開發為例,為了確定具體的方向,首先需對方位數據進行準確采集,通過傳感器數據的采集(包含x、y、z軸)實現方位數據的轉換,最后在顯示屏上顯示輸出,整個過程的邏輯層次可劃分為硬件訪問、硬件驅動、數據采集及處理、頁面顯示等;抽象處理硬件功能,細化應用開發所需硬件操作原語(采取自底向上方式),開發嵌入式系統時相應專用功能的實現大多通過軟件驅動底層硬件完成,為了簡化系統開發過程,提高程序代碼的復用性,對硬件功能進行封裝處理,降低硬件的相關性,以傳感器采集數據為例,開發時分為硬件驅動和功能拓展兩個層次,降低了系統的耦合性;對于鄰層間的調用關系和信息交互的檢驗則需逐層檢測(結合使用自頂向下和自底向上方式),通過合并整合各層的功能,盡量實現最優模塊化[2]。
在面向對象對嵌入式系統進行“去中心化”設計的基礎上,可將系統邏輯架構區分為:應用管理層(負責界面交互的實現及調度業務邏輯等)、算法協議層(負責協議解析、文件及數據庫管理等)、功能拓展層、硬件驅動層(實現與硬件的無關性),為降低業務應用的耦合性,提高軟件功能模塊的開發效率,實現功能在使用同類或相似技術時,通過聚合處理降低模型算法及硬件操作間的耦合性,多個應用邏輯可由一個成熟的模型算法實現,從而使功能在分析設計過程中更加清晰明確,所構建的應用程序的結構具備較高的靈活性、可重用性和拓展性,能夠適應不同的硬件環境。
為提高項目開發效率,基于C語言的嵌入式系統需靈活運用C語言的編程模式,提高代碼編寫質量及維護效率。
C語言的優勢在于其使用的靈活性,但易出現文件組織混亂、降低代碼可閱讀性等問題,可依據上述系統邏輯架構設計(C語言不提供軟件框架管理)完成工程文件管理原則的構建,從而使代碼文件的開發和管理能力得以有效提升,代碼管理主要涉及到兩部分:文件目錄管理,文件目錄的組織同樣需按照分層原則,遵循統一規范對各文件命名,在根目錄存放主程序、全局變量文件,在Apfunc中存放應用管理層文件,在Modelfunc中存放算法協議層,在Hardext中存放功能拓展層,在Hardopt中存放硬件驅動層文件,可通過建立Comfuc文件夾用來存放涉及到的第三方通用函數庫,利用分層模型的優勢完成開發過程,不同文件夾可并行開發工作,滿足工程化管理需求;功能模塊管理,最大程度降低全局變量的使用量,通過函數參數實現數據的傳遞,以實現模塊化設計的高內聚性,聚合相同或相似的業務應用功能、硬件操作功能,使其能夠在同一文件內實現[3]。
充分運用C語言的結構類型和函數指針,實現類似面向對象的重要特性。
對象屬性的繼承可通過結構嵌套實現,以羅盤對象參數繼承為例[4]。
typedef struct_compassbase{ //羅盤基類
Int radius; //羅盤半徑
Int centerx, centery; //羅盤中心
} compassbase;
Typedef struct_compass {
Struct _ compassbase ;
Int handle; //指針位置
Int handle //指針位置
}
利用函數指針可封裝對象屬性和對象實現,羅盤基類封裝如下:
struct_compassbase;
void (* drawcompass) (struct _compassbase * p com-base) ;
struct _ compassbase { //羅盤基類
Int radius ; //羅盤半徑
Int centerx, centery; // 羅盤中心
Draw compass pdrawcompass ;
}
通過函數模塊實現重用功能,函數定義實現方式:宏定義,宏是類型無關,降低額外開銷;函數,作為可重復使用的代碼,函數能夠獨立實現某功能。通過使用角速度傳感器制作電子羅盤,函數的調用關系描述如下[5]。
當前方位的實時顯示在LCD顯示屏上完成,可對功能模塊(算法協議層、功能拓展層、硬件驅動層)進行復用,
通過羅盤角度函數(位于算法模型層)的調用獲取angle,通過畫線函數(位于功能拓展層)的調用獲取畫指針函數,應用管理層示例代碼為:unit draw_ compass (unit angle, unit pcolor)
通過計算將傳感器獲取數據(xyz值)轉換為指針角度,以確定羅盤指針方位,算法模型層示例代碼為:uint cac_ compass (unit x, unit y, unitz );
功能拓展層的畫線、調用畫點函數示例代碼為:uint lcd_ line (unit x 1, unit y1, unit x2, unit y2, uint pcolor);
硬件驅動層驅動LID進行畫點的示例代碼為:uint lcd_pixel(unit x, unit y, unint pcolor)。
C語言涉及到較多的含有參數和函數的表達式,在程序研究中關于main函數的變化較為關鍵,在main可編輯函數中的參數的含義及個數由agent表示,分析判斷作為指導性參數值的agent能夠獲取函數相關的即時數組信息。操作系統的函數變化決定著函數的配置啟動,因此對其初始變化值要求較為嚴格,需先進行函數的歸零處理,通過不同數值的參數的提取(在各函數變換模塊中)使計算機程序進入有效運行狀態,main語言在程序進入預定設計軌道后能夠對程序的下一步運行進行自動控制(即嵌入式的系統模式),在嵌入過程中通過交叉比對實現相關參數原有數據值的保留,自動地刪除無用的數據,并修改運行錯誤和編輯錯位,在嵌入交匯過程中系統自動甄別所出現的語言混亂情況,重新擬定新main函數獲取相應的函數編輯式,若仍無法完成重新定義則自動劃分函數為初始程序處理,從而確保函數間的有效串接,使系統程序能較好的適應新的語言環境[6]。
本文主要研究了C語言編程軟件在嵌入式系統中開發過程的實現路徑,依據分層設計的原則,完成了功能模塊劃分,對系統軟件的編程思路進行了詳細闡述,介紹了軟件開發過程中的程序框架、模塊重用等設計過程的實現方法,結合C語言編程使用的函數表達功能,提高了C語言的靈活性,同時滿足了軟件開發工程化的需求,為在嵌入式系統開發中使用C語言提供參考。