技術文章
基于源碼組裝技術的嵌入式軟件系統的研究
閱讀:100 發布時間:2020-8-12在通用程序設計方法中 從面向過程程序設計方法 到面向對象程序設計方法 再到現在的 COM 程序設計方法 軟件工程的發展經歷了一個長期的過程 在這個過程中 人們追求的一個重要目標 就是希望軟件開發能象汽車制造那樣 先按照標準制造零件和部件 后再用這些零件和部件組裝成成品[1]
嵌入式系統是面向應用的系統 其硬件環境具有個性和多樣性的特點 這要求相應的軟件也具有個性和多樣性的特點[2-3]然而 在不同的硬件環境中 有許多功能又是共性的 這些共性功能模塊的代碼 只需要經過簡單修改 便可重用在新系統中 如何利用已開發的共性功能代碼 加速軟件的開發 這正是源碼組裝技術解決的問題
1 源碼組裝思想
在嵌入式應用中 使用 c 語言庫 或者微軟的 MFC 類庫 有時會感覺它產生的目標代碼太大 這是因為無論你用到某個庫中的一個函數 該庫的整個代碼就被全部連接進入目標程序 造成應用程序的冗余代碼較多
顯然 利用包含函數庫的方式并不*能適合嵌入式開發的要求 基于這種情況 作者提出一種既能減輕程序員的負擔 又能滿足代碼盡可能少的一種開發方式 即源代碼級裝配方式
在源代碼級進行裝配 其基本思想是
1 建立一個由開發工具管理的源代碼庫函數使用情況登記表 S_CODE_USED_TAB
2 除 c 語言的基本函數庫外 與應用程序 或者操作系統相關的一些功能函數以匯編語言 或者 c 語言的源代碼的形式存放在源代碼資源庫中 通過數據庫方式進行管理
3 通過裝配方式移植并產生該嵌入式操作系統的源代碼 在開發應用程序開發過程中 當用到某個函數時 源代碼資源函數開發工具軟件檢索 S_CODE_USED_TAB 表 看是否已包含該函數代碼 如果有 則設置好調用參數直接調用該函數 否則除了產生調用代碼外 還需將該源代碼添加到要求生成的應用程序源代碼中 并在 S_CODE_USED_TAB 表中添加記錄項
4 本文只是解決生成可重組的源代碼問題 重組工具另做研究
2 源碼組件
源碼組裝技術的第一步就是獲得可用于組裝的源代碼組件 想要獲得功能完整 獨立 冗余度小的高質量源代碼組件[4-5]首先要將整個軟件系統合理的劃分層次 解耦軟件部件
2.1 嵌入式軟件系統層次劃分
根據嵌入式軟件的特點 如圖 1 所示 將嵌入式軟件系統自下而上共分為四層 硬件層 基本實時內核層 操作系統服務層和用戶應用層 各層之間通過各層的頭文件進行聲明和調用
硬件層在系統的下層 用于描述嵌入式系統的硬件資源情況 該層包括兩部分內容 處理器資源及板級資源描述部分和操作系統基本內核與硬件相關部分
處理器資源 如 c8051f020.H 描述了處理器全部特殊寄存器 SFR 的定義 及部分 SFR 的各控制位 如 ES,TRO 等 的定義 板級資源 hard_layer.H 描述了電路板上的各種信息 如 晶振頻率 各存儲器容量和起止地址 各 I/O 口的類型 地址等 這部分信息是在建立項目之初 由開發工具軟件做向導 由用戶填寫 再將它們定義為符號常量 供上層使用
操作系統基本內核與硬件相關部分是操作系統與硬件的接口 也就是移植操作系統需要改動的部分 以 uc/osII 為例 它包含了 OS_CPU.HOS_CPU_A.ASM 和 OS_CPU_C.C 三個文件[6]
基本實時內核層存放操作系統的基本的四個功能模塊 內核初始化模塊 中斷管理模塊 調度模塊和任務管理模塊
操作系統服務層向用戶提供各種系統服務 包括 進程通信 內存管理 文件系統 網絡系統 設備驅動等功能 該層的源碼組件是根據應用需要由用戶添加的 并且可以在開發中不斷增加 構成具有用戶特色的組件庫
用戶應用層是由用戶編寫的應用軟件 它可以調用服務層的 API 完成自身的功能 然后以任務的形式 掛接到操作系統上 由操作系統調度運行
源碼組件的結構
系統按功能劃分后 為了實現組裝 源碼組件需要具有一定的結構和接口 從代碼實現的角度看 源碼組件的基本結構包括 代碼體 數據體和聲明體
代碼體是源碼組件的實現部分 程序中體現為 FUNx.C 文件 其中包含了功能模塊的初始化函數和各種使用函數 數據體特指組件與組件調用者共同使用的變量 程序中體現為 FUNx_DEF.C 文件 聲明體是源碼組件對外部的使用聲明 具體為組件中的數據體 各函數的聲明以及自定義的數據結構 程序中體現為 FUNx.H 文件 通過這些變量 系統和用戶可對組件進行信息查詢和通信聲明體和代碼體是源碼組件的*組成 數據體根據情況不同可能沒有
源碼組件的組裝
在源代碼塊組裝時 按照系統軟件層次 從硬件層到應用層 分層次組織所有源代碼功能組件 將同一層內所有組件的聲明體組合成本層的頭文件 Layern.H 代碼體組合成本層的代碼文件 Layern.C 數據體組合成本層的數據文件 Layern_Def.C 這樣的組合使得軟件代碼結構清晰 便于閱讀 調試 修改
基于源碼組裝技術的嵌入式數控系統的實現
嵌入式數控系統的介紹
本文所用的數控系統是電火花加工的三軸兩聯動數控系統 該系統不僅要求具有普通數控系統的輪廓控制功能 還需要實時檢測工件與刀具間的間隙電壓 并以此控制插補過程 同時 還要通過串行口與上位機進行實時通信
系統代碼組織
按照圖 1 嵌入式軟件系統的層次劃分 將整個系統的代碼分四個層次 用五個文件夾組裝 下面圖 2 具體給出系統代碼的組裝后的結構
1 Header Files 文件夾 它包含了系統中的所有的頭文件 其中 c8051F020.h是處理器 SFR 的定義 OS_CPU.H 是與操作系統相關的文件 hard_layer.H 是板級資源的符號常量定義 os_core_layer.h os_service_layer.h 和 user_layer.h 是各層所有組件的聲明體的集合 INCLUDES.H 是將其它五個頭文件匯總的一個總頭文件 這樣使得在其它 C 語言文件中只需要簡單的引用一個 INCLUDES.H 文件就可以了
2 OS_ASM Files 文件夾 它包含了 OS_CPU_A.ASM 和 OS_CPU_C.C 與操作系統相關的兩個文件 以及 STARTUP.A51 和 INIT.A51 兩個文件 這兩個文件在 main 函數之前調用的 完成初始化工作
3 OS_CORE Files 文件夾 它包含了五個文件 OS_CORE_DEF.C 是本層所有組件數據體的集合 OS_SCHEDULE.C 用于任務調度 OS_TASK.C 用于任務管理 OS_INIT.C 用于系統初始化 包括操作系統內核初始化和 2.2 中提到的功能模塊的初始化 OS_INTERRUPUT.C 用于中斷管理 主要是中斷處理函數
4 OS_SERVICE Files 文件夾 它包含了使用到的系統服務的模塊 共五個文件 OS_SERVICE_DEF.C 是本層所有組件數據體的
集合 Device.C 內含 A/D 定時器等設備的使用函數 Interpolation.C 內含插補控制的實現函數 Serial.C 內含串口控制和 SEM.C 內含
信號量處理
5 USER_C FILES 文件夾 它包含了由用戶編寫的用戶應用層的文件 mymain.c 內含 main 函數 BandInit.c 內含系統上電后的對硬件自檢程序 該程序在操作系統工作之前運行 剩下的是各任務的任務函數
測試
本軟件按上述結構 在 uVision2 IDE 中組裝 編譯 連接 并下載到自行設計的硬件系統中運行 經測試 系統運行正確 說明系統構件使用的成功 此體系結構和源碼組件結構具有可行性
結論
本文將源碼組裝的思想引入到嵌入式軟件的開發 以此為目標對嵌入式軟件進行分解 提出了嵌入式軟件四層體系結構硬件層 基本實時內核層 操作系統服務層和用戶應用層 并以功能完整 獨立 冗余度小為原則 將軟件系統分解成多個源碼組件不同應用可以根據自身需求 對軟件系統的功能模塊進行選擇 減少重復性的工作 使開發工作簡單 快速
本文由 伯特利數控文章 整理發表,文章來自網絡僅參考學習,本站不承擔任何法律責任。
/bethel/news/