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