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