陳宏君,馮亞東,文繼鋒,周強
(南京南瑞繼保電氣有限公司,南京 211102)
陳宏君,馮亞東,文繼鋒,周強
(南京南瑞繼保電氣有限公司,南京 211102)
提出一種嵌入式程序運行狀態(tài)下動態(tài)分配內(nèi)存的變量調(diào)試方案,將應(yīng)用程序按照元件劃分,元件數(shù)據(jù)通過結(jié)構(gòu)體進行封裝,嵌入式系統(tǒng)程序庫記錄動態(tài)分配結(jié)構(gòu)體的首地址和實例名,上位機客戶端調(diào)試軟件分析結(jié)構(gòu)體變量的相對地址,并將層次變量名和相對地址信息下發(fā)給嵌入式服務(wù)器端,服務(wù)器端由首地址、相對地址計算出變量的絕對地址,并根據(jù)變量類型信息訪問該地址對應(yīng)的內(nèi)存數(shù)據(jù),上傳給調(diào)試工具顯示。本文提出的調(diào)試方案已經(jīng)應(yīng)用在電力系統(tǒng)保護測控裝置調(diào)試中,提高了程序診斷效率。
嵌入式程序;動態(tài)分配;內(nèi)存調(diào)試;結(jié)構(gòu)體分析
在軟件開發(fā)維護過程中,調(diào)試是很重要的一個步驟,通過調(diào)試來診斷解決程序問題。在上位機(PC機)環(huán)境運行的程序,由于有集成開發(fā)調(diào)試的人機界面工具,可以方便地進行單步調(diào)試或輸出中間運行信息。嵌入式軟件獨立運行在裝置中,一般是通過仿真器連接調(diào)試線進行調(diào)試,這種模式需要人為預(yù)先知道變量的地址,并且系統(tǒng)通常是在STOR(停止實時運行)的模式下才能支持仿真器調(diào)試[1]。
調(diào)試一個變量,首先需要知道該變量的地址。編譯器在編譯程序時,對于全局變量,可以預(yù)先靜態(tài)分配地址,形成全局變量的MAP文件,通過分析該文件,獲取全局變量名和地址信息,進而調(diào)試全局變量。隨著程序規(guī)模的增加,全局數(shù)據(jù)空間有限,無法把所有變量都放到全局區(qū),并且有些數(shù)據(jù)需要根據(jù)具體情況動態(tài)分配。動態(tài)分配內(nèi)存的變量是在程序構(gòu)造函數(shù)中申請的,這些變量在程序運行前地址是未知的,由于CPU運行的是二進制指令,在運行過程中沒有地址和變量名的對應(yīng)關(guān)系,無法用傳統(tǒng)的仿真器調(diào)試方法來調(diào)試嵌入式程序動態(tài)分配內(nèi)存的變量在運行模式下的實際值。
本文設(shè)計了一種嵌入式程序運行狀態(tài)下動態(tài)分配內(nèi)存的變量調(diào)試方案,通過定義應(yīng)用程序結(jié)構(gòu)體編寫規(guī)范、系統(tǒng)程序提供API接口注冊結(jié)構(gòu)體、調(diào)試軟件分析頭文件計算結(jié)構(gòu)體成員變量的相對地址等方式,能得到變量的真正地址,在運行過程中裝置上傳變量實際值。
嵌入式裝置調(diào)試系統(tǒng)結(jié)構(gòu)如圖1所示,將應(yīng)用程序和系統(tǒng)平臺庫編譯為HEX目標文件,下載到裝置。調(diào)試工具分析H文件、變量類型和相對地址等信息,下發(fā)調(diào)試請求,裝置上傳變量值。
圖1 調(diào)試系統(tǒng)結(jié)構(gòu)圖
首先將應(yīng)用程序按照文件進行封裝。文件是完成特定應(yīng)用功能的面向?qū)ο蟮囊唤M數(shù)據(jù)和對數(shù)據(jù)進行處理的過程,處理完后輸出的數(shù)據(jù)供其他文件進一步使用[2]。應(yīng)用程序由若干文件組成,包括H文件和C文件,在H文件中定義數(shù)據(jù)結(jié)構(gòu)體,在C文件中定義構(gòu)造函數(shù)、任務(wù)函數(shù),對結(jié)構(gòu)體數(shù)據(jù)進行運算等操作。
其次對于動態(tài)分配內(nèi)存的結(jié)構(gòu)體變量,裝置側(cè)系統(tǒng)軟件提供注冊接口,可記錄首地址,在C文件的構(gòu)造函數(shù)中調(diào)用注冊接口。
嵌入式裝置上電后進入運行狀態(tài),調(diào)試軟件和裝置進行連接,用戶可指定H文件存放路徑,結(jié)合裝置上傳的CPU字節(jié)對齊信息,對相關(guān)的H文件進行詞法分析和語法分析,計算出變量在結(jié)構(gòu)體中的相對地址,并下發(fā)變量地址和類型信息。裝置側(cè)根據(jù)結(jié)構(gòu)體實例名,在注冊表中查詢結(jié)構(gòu)體首地址,加上變量相對地址,得到變量的絕對地址,并訪問該地址對應(yīng)內(nèi)存,上傳數(shù)據(jù)。完整的調(diào)試流程如圖2所示。
圖2 調(diào)試流程圖
由于應(yīng)用領(lǐng)域需求復(fù)雜和分工細化,嵌入式系統(tǒng)逐漸開始了平臺化的開發(fā)模式[3],工程師基于通用的硬件平臺、系統(tǒng)軟件平臺、工具軟件平臺開發(fā)應(yīng)用程序。
其中系統(tǒng)軟件屏蔽硬件差異,提供的通用接口服務(wù)(API)包括:元件注冊、變量管理、任務(wù)調(diào)度、數(shù)據(jù)交換、定值設(shè)置、調(diào)試通信等功能。定義一套面向應(yīng)用的開發(fā)規(guī)范,在嵌入式C語言程序中,數(shù)據(jù)通過結(jié)構(gòu)體進行組織和重用。在結(jié)構(gòu)體動態(tài)分配內(nèi)存的函數(shù)中,調(diào)用系統(tǒng)軟件API接口注冊結(jié)構(gòu)體信息。定義結(jié)構(gòu)體信息表數(shù)據(jù)模型如下:
struct ComponentInfo{
void* addr; //結(jié)構(gòu)體首地址
char* type_name; //結(jié)構(gòu)體類型名
char* inst_name; //結(jié)構(gòu)體實例名
};
將結(jié)構(gòu)體信息組成一個hash表,可用結(jié)構(gòu)體實例名為關(guān)鍵字,查找獲取結(jié)構(gòu)體的類型名、首地址信息。在文件構(gòu)造函數(shù)中,通過調(diào)用registerComponent(void* addr, char* ptype, char* pinst),把動態(tài)分配的結(jié)構(gòu)體信息注冊到信息表中。
應(yīng)用程序基于系統(tǒng)庫開發(fā),將程序劃分為若干文件和main.c文件。文件的頭文件定義數(shù)據(jù)結(jié)構(gòu)體,包括輸入變量、輸出變量、內(nèi)部變量等。例如:
struct AND2{
#include"base.h"
unsigned char* in1;
unsigned char* in2;
unsigned char out;
int run_cnt;
…… };
在C文件中定義文件構(gòu)造函數(shù)、任務(wù)函數(shù)。在構(gòu)造函數(shù)中調(diào)用calloc函數(shù)分配數(shù)據(jù)結(jié)構(gòu)體,并調(diào)用系統(tǒng)接口注冊首地址信息:
AND2* newAND2(char* pinst){
AND2* dp = (AND2*)calloc(1, sizeof(AND2));
if(!dp) return NULL;
…… //其他變量初始化代碼
registerComponent(dp, "AND2", pinst);
addTask(dp,runAnd2);
return dp;
}
按照上述方法開發(fā)各個應(yīng)用元件后,在主程序中調(diào)用各個元件的構(gòu)造函數(shù),設(shè)置元件實例名:
int main(int argc, char** argv){
AND2* pand = newAND2("And2");
CURRENT* pcur = newCurrent("Cur3P1");
……//其他設(shè)置代碼
return 1;
}
上述示例代碼,創(chuàng)建了類型名AND2并且實例名為And2、類型名CURRENT并且實例名為Cur3P1的文件實例,在main函數(shù)中完成動態(tài)內(nèi)存的申請分配和注冊管理。
調(diào)試裝置變量時,系統(tǒng)軟件支持通過層次變量名XXSlot.XXComp.XXVar(插件名.元件實例名.變量名)訪問數(shù)據(jù)。如圖3所示,平臺化軟件結(jié)構(gòu)中,將可插拔的插件按照面向?qū)ο蟮墓?jié)點管理。對于帶處理器的插件,支持設(shè)置對象名,例如B01(管理插件)、B02(運算插件)以及模擬量、開關(guān)量輸入輸出插件等,可在裝置配置文件中定義各個插件的名字、總線地址。MCPU插件具備管理功能,給其他插件分配總線地址,并作為調(diào)試服務(wù)器。當下發(fā)B02.Cur3P1.IA的層次變量名給管理插件時,會通過總線轉(zhuǎn)發(fā)給其他插件。故對動態(tài)分配元件的數(shù)據(jù)調(diào)試,最關(guān)鍵的一步是獲取成員變量的地址。
圖3 層次調(diào)試名示例
結(jié)構(gòu)體實例dp的成員變量out相對地址在C語言中,可用類似(unsigned int)(&dp->out)-(unsigned int) dp的方式獲取,而上位機調(diào)試軟件需通過靜態(tài)分析,離線計算不同字長類型的CPU所對應(yīng)程序的變量相對地址。
分析結(jié)構(gòu)體內(nèi)變量地址分配信息前,需掌握結(jié)構(gòu)體布局原理,了解總線寬度、自然邊界的概念,編譯器在分配結(jié)構(gòu)體時根據(jù)這兩個因素來計算偏移量和空間占用[4]。
每個C語言變量類型都有自然邊界,如果某種類型數(shù)據(jù)所處地址是N的整數(shù)倍時,訪問效率最高,則這種類型的自然邊界是數(shù)字N[4]。
對于數(shù)據(jù)總線為32的處理器,short型為2字節(jié),自然邊界為2;int型為4字節(jié),自然邊界為4;double型為8字節(jié),自然邊界為8。本文所分析的處理器(包括PowerPC、SHARC、TI、Blackfin等),其編譯選項都設(shè)置為結(jié)構(gòu)體非壓縮模式。對于非壓縮模式結(jié)構(gòu)體,內(nèi)存布局遵循2個原則:
① 結(jié)構(gòu)體的自然邊界和成員變量中最大的自然邊界一致,在不同變量類型之間可能存在空洞,用于變量自然邊界對齊;
② 結(jié)構(gòu)體的總大小是其自然邊界的倍數(shù),在結(jié)構(gòu)體末尾可能需要填充字節(jié)。
上述的“可能”是因為:根據(jù)前一個變量相對地址值和變量類型,遞推當前變量相對地址值時,需判斷當前已經(jīng)占用分配的地址是否能整除該變量的自然邊界,具體情況需要具體分析,這也是結(jié)構(gòu)體變量分析的難點。
結(jié)構(gòu)體中可以有子結(jié)構(gòu)體、子聯(lián)合體union,其中union大小是取其子成員中最大內(nèi)存占用,而struct大小是所有成員大小的累次疊加。一個簡單的結(jié)構(gòu)體定義舉例略——編者注。
由于應(yīng)用程序功能復(fù)雜,在元件結(jié)構(gòu)體中會使用子結(jié)構(gòu)體、子聯(lián)合體、條件預(yù)編譯、數(shù)組、表達式、位段等,故對結(jié)構(gòu)體成員變量的分析是遞歸下降的過程。其計算流程如圖4所示。
圖4 結(jié)構(gòu)體成員變量相對地址計算流程圖
在進行結(jié)構(gòu)體分析時,定義了如下關(guān)鍵數(shù)據(jù)結(jié)構(gòu):
① 記號類, CToken是進行詞法分析的最基本單元:
class CToken{
public:
CToken(QString&name): m_name(name){}
MainTokenType m_maintp; //主類型
SubTokenType m_subtp; //子類型
string m_name; //名字
};
其中記號的主類型定義為:
enumMainTokenType{
ErrorType=0, //錯誤類型
IdType, //關(guān)鍵字、變量名、類型名、運算符等
IntType, //整數(shù)常量類型
DoubleType, //浮點數(shù)常量類型
StringType, //字符串常量類型
EndLineType, //行結(jié)束符號
EndFileType, //文件結(jié)束符號
};
IdType的分若干子類型:
enum SubTokenType{
KeyWordType, //關(guān)鍵字
OperaterType, //運算符號
VariableType, //變量類型,包括數(shù)組
StructType, //結(jié)構(gòu)體類型
UnionType, //聯(lián)合類型
……
PreProcType //預(yù)處理符號 #include
};
詞法掃描主要過程是讀取H文件,處理注釋后,逐個讀取字符,通過表驅(qū)動的查找方法,并進行若干步探測,進行關(guān)鍵字、變量類型等匹配,提取出變量名、類型定義、常量等標記。
② 結(jié)構(gòu)體數(shù)據(jù)建模:CStruct包括若干子結(jié)構(gòu)體、聯(lián)合體實例、定義的位置等,每分析完1個變量后,更新m_memorySize值,動態(tài)調(diào)整自然邊界。程序語句略——編者注。
③ H文件數(shù)據(jù)管理類: CHFile通過調(diào)用parseText接口,讀取文件,進行詞法分析后,形成CToken實例,用m_tokens管理,并根據(jù)CToken的子類型,形成結(jié)構(gòu)體、枚舉定義、宏定義等實例。程序語句略——編者注。
完成上述關(guān)鍵數(shù)據(jù)結(jié)構(gòu)定義后,計算第N個變量的相對地址,等價于計算N-1個變量所占用的結(jié)構(gòu)體大小和第N個變量的自然邊界調(diào)整,通過遞歸下降循環(huán)調(diào)用,便可實現(xiàn)圖4的計算流程:
① 結(jié)構(gòu)體初始大小為0,計算結(jié)構(gòu)體內(nèi)第1個變量的大小,得到數(shù)字為M1;
② 計算第2個成員變量占用大小M2,如果第2個變量類型自然對齊邊界值為N, 定義空洞數(shù)S=(M1%N),則補齊S個字節(jié),第2個變量計算完后,總的大小為M1+S+M2,第2個變量的相對地址為M1+S;
③ 順次計算并累加各成員變量相對地址和空洞,直到計算出第N個變量的相對地址。
工具軟件作為客戶端,向裝置管理插件的進程發(fā)起TCP連接請求,連接成功后,可在調(diào)試界面輸入變量名,設(shè)置需要分析的H文件目錄,工具下發(fā)打開調(diào)試變量請求,裝置上傳CPU字長信息、變量結(jié)構(gòu)體名字。工具調(diào)試第1個變量時,打開相關(guān)文件,分析結(jié)構(gòu)體定義和變量聲明信息,計算出相對地址后,將變量類型、相對地址下發(fā)給裝置,裝置從元件注冊表中查找到該變量對應(yīng)文件的首地址,加上相對地址,如果是本插件變量,則訪問變量的絕對地址,如果是其他插件變量,則轉(zhuǎn)發(fā)給其他插件,由變量所在插件的系統(tǒng)程序訪問變量地址,并將信息傳輸給管理插件,由管理插件上傳變量值。支持周期上傳和關(guān)閉變量。調(diào)試界面略——編者注。
本文闡述了嵌入式系統(tǒng)動態(tài)分配內(nèi)存的調(diào)試方案,基于結(jié)構(gòu)體首地址+變量相對地址信息,實現(xiàn)了嵌入式程序在實時運行模式下調(diào)試動態(tài)分配內(nèi)存。該方案可以對程序的每個變量進行實時跟蹤,快速定位運行工況下的程序問題,縮短了開發(fā)周期,已經(jīng)在電力系統(tǒng)相關(guān)裝置中應(yīng)用,顯著提高了調(diào)試效率。
編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。
[1] 李志丹.嵌入式軟件調(diào)試方法研究[J].計算機與數(shù)字工程,2012,7(2):192-194,236.
[2] 陳宏君,劉克金,馮亞東,等.新一代保護測控裝置配套工具軟件設(shè)計與應(yīng)用[J].電力系統(tǒng)自動化,2013,37(20):92-96.
[3] 李響,劉國偉,馮亞東,等.新一代控制保護系統(tǒng)通用硬件平臺設(shè)計與應(yīng)用[J].電力系統(tǒng)自動化,2012,36(14):52-55.
[4] Colin Walls.嵌入式軟件開發(fā)精解[M].何小慶,張浩中,何靈淵,譯.北京:機械工業(yè)出版社,2014.
[5] 趙香,耿銳,黃光紅.C語言源碼級調(diào)試器的設(shè)計與實現(xiàn)[J].計算機與現(xiàn)代化,2011(5):157-160.
[6] 徐超坤,朱婷,李威宣.基于模型的嵌入式C代碼的實現(xiàn)與驗證[J].單片機與嵌入式系統(tǒng)應(yīng)用,2011(12):15-18.
陳宏君(高級工程師),主要研究方向為嵌入式軟件平臺開發(fā)。
郭國法,宮瑤,張開生
(陜西科技大學 電氣與信息工程學院,西安 710021)
摘要: 針對傳統(tǒng)嵌入式課程教學平臺教學模式單一、輔助實驗設(shè)置有局限性等問題,采用了嵌入式課程遞階教學平臺,從嵌入式課程驗證性基礎(chǔ)實驗出發(fā),基于CDIO工程教學模式理念實現(xiàn)理論教學與實踐應(yīng)用的一體化。硬件采用核心板和拓展底板分離插拔式設(shè)計,底板功能模塊化程序可適用于多種微處理器芯片,實現(xiàn)單片機核心板與嵌入式核心板源程序代碼共享,滿足嵌入式系統(tǒng)分層次遞階教學的要求。
關(guān)鍵詞: CDIO;嵌入式教學平臺;項目化;模塊化
Abstract: Aiming at the problems of the embedded teaching platform such as teaching mode single and experimental setup has limitation,an embedded teaching platform is proposed,which is based on CDIO engineering teaching mode idea and realizes the integration of theoretical teaching and practical application.The hardware uses separate and plug design of the core board and the expansion board.The expansion board function modular program is applicable to a variety of microprocessor chip,which can realize the core board source application code sharing with the embedded core board.It can meet the requirements of hierarchical teaching in the embedded system.
Key words: CDIO;embedded teaching platform;project;modular
在信息技術(shù)和網(wǎng)絡(luò)技術(shù)飛速發(fā)展的電子科技時代,嵌入式系統(tǒng)已經(jīng)滲透到現(xiàn)代生活的方方面面,包括硬盤驅(qū)動器、遙控器、汽車防鎖剎車、農(nóng)業(yè)大棚溫濕度控制、智能家居等。整個社會對掌握嵌入式技術(shù)的創(chuàng)新性人才求賢若渴,各高校對嵌入式系統(tǒng)課程教學越來越重視,因此培養(yǎng)出合格的創(chuàng)新性嵌入式技術(shù)人才迫在眉睫。但目前嵌入式課程教學實驗平臺多采用成熟的嵌入式開發(fā)板[1],僅以驗證性實驗為主,并且開發(fā)板芯片與功能硬件已經(jīng)確定不容更改,學生在其實驗平臺上只能依照廠商提供的板載程序運行,觀察實驗現(xiàn)象,不利于學生掌握硬件原理、程序編譯和調(diào)試的方法,不能進行深度嵌入式系統(tǒng)的開發(fā),動手實踐能力不足,同時傳統(tǒng)的課程教學實驗平臺也不能較好地引導學生接受和掌握單片機與嵌入式系統(tǒng)相關(guān)知識,尤其是從單片機學習過渡到嵌入式系統(tǒng)學習的過程顯得尤為艱辛,究其根本,原因是缺乏一種快速引導學生進入嵌入式學習的實驗平臺。
針對這種情況,采用軟硬件資源完全開放的CDIO模式嵌入式課程遞階教學平臺,CDIO代表構(gòu)思(Conceive)、設(shè)計(Design)、實現(xiàn)(Implement)和運作(Operate)教學理念,倡導在工程基礎(chǔ)知識、個人能力、人際團隊能力和系統(tǒng)工程能力4個層面上進行綜合訓煉[2-5]。嵌入式課程遞階教學平臺應(yīng)用CDIO工程教育理念于理論教學與實驗教學中,從實驗項目策劃設(shè)計到實驗項目運行為教學實踐全過程,采取多核硬件板與模塊化軟件設(shè)計相結(jié)合的方式,以滿足不同層次的學生對嵌入式課程學習階段的需求為目的,設(shè)置了相應(yīng)的驗證設(shè)計、綜合設(shè)計及創(chuàng)新設(shè)計的進階教學實驗,讓學生以主動的、實踐的方式漸進式學習嵌入式課程,幫助學生快速從單片機的學習過渡到嵌入式系統(tǒng)學習當中,逐步具有設(shè)計開發(fā)嵌入式系統(tǒng)的能力,很好地解決傳統(tǒng)嵌入式教學平臺不能分層次遞階教學和實踐的問題。
嵌入式課程遞階教學平臺主要由計算機和目標實驗板兩部分組成。目標實驗板硬件采用多核心板適配通用功能拓展底板的雙層結(jié)構(gòu)設(shè)計思想,上層為核心板,下層為功能模塊拓展底板,底層板與核心板的連接采用插拔的組合方式,插座的引腳與底層板的連接是固定的。底層板為通用功能模塊拓展底板,使用過程中保持底層板不變,通過更換核心板使其分別當作嵌入式課程入門級單片機學習平臺或者高層次的嵌入式系統(tǒng)學習平臺使用,整體形成遞階式開放結(jié)構(gòu)。
教學平臺初期用于基于51系列單片機無操作系統(tǒng)教學模塊,后期用于結(jié)合嵌入式操作系統(tǒng)的ARM7學習進程。在軟件上,系統(tǒng)選用ARM公司推出的Keil μVision4作為開發(fā)工具,提供各個實驗?zāi)K程序的主要框架及模塊化程序函數(shù)調(diào)用入口。嵌入式操作系統(tǒng)選擇性能穩(wěn)定、可移植性好且功能強大的μC/OS-II操作系統(tǒng)。遞階教學平臺模型框圖如圖1所示。
圖1 嵌入式課程遞階教學平臺模型圖
上位機通過USB線與目標實驗板串口相連,軟件采用由VB編寫的嵌入式遞階教學平臺實驗窗口,將嵌入式
課程教學所需的理論基礎(chǔ)資源整合在上位機實驗窗口下,構(gòu)建一個完整的素材庫,包括嵌入式課程教學PPT及實驗演示視頻、芯片和元器件數(shù)據(jù)手冊、功能模塊源代碼庫、嵌入式系統(tǒng)開發(fā)工具軟件。軟件系統(tǒng)平臺還提供兩個接口:教師接口和學生接口。教師接口用于添加素材庫資源,學生接口便于學生進行理論化知識的學習和圖形化編程的開發(fā)。學生根據(jù)自身掌握嵌入式知識的情況,有選擇地訪問上位機平臺實驗窗口中共享的素材庫資源,在線學習理論化的嵌入式系統(tǒng)基礎(chǔ)知識,也可將功能模塊源代碼下載到目標實驗板上,完成相應(yīng)實驗項目。
1.1 核心板硬件設(shè)計
核心板由嵌入式微處理器、芯片最小系統(tǒng)、拓展板接口3部分組成,最小系統(tǒng)包括支持微處理器工作的時鐘模塊、Flash模塊、復(fù)位模塊[6-8]。核心板由易到難主要設(shè)置3種微處理器,分別為單片機AT89C51、STM32F103C8微處理器以及32位的ARM7微處理器LPC2103,并且將芯片全部I/O引腳引出來與通用功能拓展底板上留有的引腳接口相連。表1為單片機與嵌入式芯片對比表,通過3種學習難度遞增的微處理器搭配底板形成層次教學平臺。圖2為硬件平臺原理框圖,其中虛線部分為需要安插的上層核心板位置。這3種芯片價格低廉、通用性強、功能完整,包括存儲器、定時/計數(shù)器、可編程的I/O端口、可編程全雙工串行端口、中斷源,不同的芯片內(nèi)集成了16位或32位中央處理器和ISP Flash存儲單元,具有在系統(tǒng)可編程(ISP)特性,易于二次開發(fā),能夠滿足教學平臺基礎(chǔ)實驗和項目綜合設(shè)計性實驗的使用需求。
圖2 硬件平臺原理框圖
表1 單片機與嵌入式芯片對比表
1.2 底層板設(shè)計
底層功能模塊拓展板的設(shè)計主要以加強外圍功能接口應(yīng)用的學習為目的,設(shè)計了課程教學基礎(chǔ)實驗所需的多種不同功能模塊和定向?qū)I(yè)拓展模塊。圖2中實線部分為通用功能模塊,主要包括:電源模塊、I/O模塊、串口模塊、鍵盤模塊、A/D轉(zhuǎn)換模塊、LED模塊、LCD模塊等。同時,底層板預(yù)留有可擴展I/O接口,學生可通過將自行設(shè)計的功能模塊納入下層拓展底板,構(gòu)建個性化嵌入式系統(tǒng)。
定向?qū)I(yè)拓展模塊底板包括:ZigBee模塊、藍牙模塊、傳感器模塊、GSM模塊。各個功能模塊為獨立單元,由微處理器直接控制,同時各模塊之間也可根據(jù)實驗項目要求進行組合與拓展,來適配電子、控制、電氣等不同專業(yè)學生的特定嵌入式系統(tǒng)綜合實驗與開發(fā)。
在軟件教學過程中經(jīng)常會忽略模塊化程序的深度應(yīng)用,而模塊化編程是組織良好程序結(jié)構(gòu)的有效方法之一。復(fù)雜的工程都是由若干相對獨立的功能模塊嵌套組合而成,模塊化編程設(shè)計可以化繁為簡,并且為程序模塊間的相互調(diào)用以及數(shù)據(jù)傳遞提供了便捷的途徑,有助于程序的調(diào)試,增強了程序的可讀性。
基于CDIO模式的嵌入式遞階教學平臺采用ARM公司推出的Keil μVision4進行程序編譯。針對底層板上不同的功能硬件,例如串口模塊、鍵盤模塊、A/D轉(zhuǎn)換模塊、LED模塊等,教學平臺將各個功能模塊源程序模塊化封裝后生成的特定功能模塊函數(shù)或文件集中存放在上位機教學平臺實驗窗口素材庫中,便于使用者下載、編譯。
2.1 功能程序模塊化設(shè)計
在系統(tǒng)軟件平臺中,程序模塊化封裝過程略——編者注,由學生完成軟件環(huán)境相關(guān)設(shè)置,并對芯片的各個功能進行配置,根據(jù)實驗?zāi)康臉?gòu)思軟件架構(gòu),有選擇性地從模塊素材庫中下載所需的模塊源文件。源文件由教學平臺提供,根據(jù)功能的不同,編寫模塊源文件所需要的宏定義或結(jié)構(gòu)體,提供C語言模塊程序接口,方便學生調(diào)用。各功能模塊程序由教學平臺封裝后得到唯一的封裝函數(shù)或文件,并且僅實現(xiàn)對該功能模塊硬件的驅(qū)動。不同的功能模塊程序可以相互嵌套、調(diào)用和編譯??紤]到預(yù)處理程序能夠提供條件編譯的功能,可以按不同的條件編譯不同的程序部分,產(chǎn)生不同的目標代碼?;诖?,在同一模塊的源文件中使用條件編譯,軟件系統(tǒng)根據(jù)宏定義及芯片配置,有選擇性地編譯單片機程序的代碼部分或者嵌入式系統(tǒng)程序的代碼部分,實現(xiàn)單片機核心板與嵌入式核心板源程序代碼共享,提高兩種代碼的對比學習,有助于學生對知識的理解。
2.2 程序模塊化編譯舉例
以矩陣鍵盤數(shù)碼顯示實驗為例,實驗系統(tǒng)包括硬件模塊和軟件模塊。硬件模塊包括2×8矩陣鍵盤輸入模塊、數(shù)碼顯示模塊和74HC595級聯(lián)模塊。軟件模塊包括74HC595級聯(lián)模塊硬件驅(qū)動程序、數(shù)碼管顯示程序、按鍵掃描程序、取鍵值程序。
74HC595_Send Dat()為74HC595級聯(lián)模塊驅(qū)動程序函數(shù),負責發(fā)送一個字節(jié)的數(shù)據(jù)到74HC595。Key.c文件對應(yīng)2×8矩陣鍵盤功能模塊目標代碼,包括鍵掃描程序和取鍵值程序,此Key.c文件是教學平臺窗口下提供2×8矩陣鍵盤驅(qū)動的預(yù)編譯程序,平臺軟件系統(tǒng)需要根據(jù)實驗所選微處理器為單片機AT89C51芯片或嵌入式LPC2103芯片的配置,以及I/O硬件接口設(shè)置對原始Key.c文件中的預(yù)編譯目標代碼重新宏定義,再條件編譯生成新的模塊化封裝文件Key.c。Num show.c文件實現(xiàn)數(shù)碼管顯示功能,它的軟件系統(tǒng)條件編譯過程同Key.c,這里不再贅述。
學生實驗時,在遞階教學平臺軟件系統(tǒng)工具軟件窗口下打開Keil μVision4并新建工程,將已經(jīng)依據(jù)實驗要求重新條件編譯生成的功能模塊Key.c和Num show.c文件添加到工程中。打開main.c文件,依照鍵盤顯示程序流程圖編寫主程序,定義頭文件Key.h與Num show.h,并將其添加到main.c中。編譯顯示函數(shù)main.c時,只需根據(jù)接口的定義合理嵌套74HC595_Send Dat()、鍵掃描函數(shù)和取鍵值函數(shù),然后通過調(diào)用數(shù)碼管顯示函數(shù)Num show()對結(jié)果進行顯示,最終準確快速地完成整個程序代碼的編寫過程。
3.1 遞階教學平臺CDIO模式的實現(xiàn)
嵌入式課程遞階教學實驗平臺是基于CDIO思想,即從構(gòu)思、設(shè)計到實施、運作這一工程教學理念來實現(xiàn)嵌入式課程教學與實踐一體化。整個教學平臺以“實驗”為核心,旨在讓學生在學習實踐過程中,逐步地從8位51系列經(jīng)典單片機基礎(chǔ)過渡到功能齊全的綜合性單片機,最后遞階到ARM7體系,學習過程從簡單到復(fù)雜、逐步深入[9-10]。
初級教學階段對應(yīng)于CDIO模式中的構(gòu)思階段,以運行LPC2103、STM32F103C8芯片模塊程序,學生觀察實驗結(jié)果為主。將51單片機微處理器的硬件核心板與嵌入式微處理器的硬件核心板對比使用,采用統(tǒng)一的軟件結(jié)構(gòu)搭建起嵌入式的學習平臺,保證能夠快速進入嵌入式學習中。
第二階段為設(shè)計階段,教學平臺為學生構(gòu)思、搭建實驗硬件電路提供完整的資料與環(huán)境支持。通過對嵌入式教學實驗系統(tǒng)各個模塊:UART、USB、LCD、觸摸屏和矩陣鍵盤等常用接口操作實踐,模仿改編實驗程序,熟悉ARM7的無操作系統(tǒng)基礎(chǔ)應(yīng)用,為后續(xù)應(yīng)用系統(tǒng)的開發(fā)做好鋪墊。
在實施和運作階段,從教學平臺實驗素材庫提供的應(yīng)用開發(fā)實驗(例如D/A、A/D實驗,LCD顯示實驗,觸摸屏實驗)切入,探索研究交叉編譯環(huán)境的建立、調(diào)試方法和編程技術(shù)。熟練掌握51、ARM7基本編程,同時,學習編寫系統(tǒng)的Bootloader程序以及實現(xiàn)μC/OS-II操作系統(tǒng)在STM32F103C8芯片上的移植和WinCE操作系統(tǒng)的移植,實現(xiàn)了操作系統(tǒng)各接口電路驅(qū)動程序和應(yīng)用程序的編寫也作為教學實驗平臺的一個重要功能。
3.2 CDIO應(yīng)用模式下遞階實驗設(shè)置
CDIO模式化設(shè)計的遞階實驗系統(tǒng)有利于教師改革教學方法,從傳統(tǒng)的純理論教學改為理論與實踐并重的項目教學,取得了較好實踐效果。
教學平臺基于AT89S51芯片、STM32F103C8芯片和LPC2103芯片,設(shè)置了基礎(chǔ)教學實驗,適用于多核實驗平臺和無操作系統(tǒng)實驗平臺的基礎(chǔ)實驗,包括:LED 8流水燈實驗、LCD顯示實驗、2×8鍵盤顯示實驗、液晶顯示實驗、外部中斷實驗、串口通信實驗、A/D 與D/A轉(zhuǎn)換實驗[11]。基于簡單操作系統(tǒng)的綜合實驗包括:μC/OS-II操作系統(tǒng)移植;μC/OS-II操作系統(tǒng)任務(wù)的創(chuàng)建、掛起、恢復(fù)、刪除實驗;任務(wù)的中斷和時鐘實驗;任務(wù)的同步和通信實驗等。實驗軟件部分按照模塊化進行設(shè)計,在實驗教學中,使用軟件模塊化讓學生可以自主選擇實驗項目內(nèi)容,如:輸入接口實驗,可以根據(jù)自己的能力選擇獨立按鍵和矩陣鍵盤中的一個或者多個;輸出接口實驗,同樣可以選擇LED、數(shù)碼管、點陣和液晶中的一個或者多個,這樣有利于充分發(fā)揮學生的主觀能動性,讓學生自主設(shè)計實驗項目以完成綜合性、設(shè)計性實驗[12]。
基于學生不同的研究方向可以設(shè)計創(chuàng)新性實驗,有ZigBee模塊配套的島嶼安防系統(tǒng)實驗、基于溫濕度傳感器的農(nóng)業(yè)大棚環(huán)境監(jiān)控系統(tǒng)設(shè)計實驗等。
嵌入式課程遞階教學平臺經(jīng)過調(diào)試和測試,實現(xiàn)了多核心板適配多功能擴展底板的使用模式,各個實驗?zāi)K工作均比較穩(wěn)定。實踐教學結(jié)果證明,教學平臺提供了豐富的接口資源,可進行二次開發(fā),完全能夠滿足實驗課程的要求,并幫助學生快速從單片機的學習過渡到嵌入式系統(tǒng)學習當中?;贑DIO理念設(shè)計了一系列配套的實驗,以符合大眾學生為目的,設(shè)置了普遍需要的基礎(chǔ)實驗以及綜合實驗,針對嵌入式專業(yè)的學生設(shè)置了更為專業(yè)的基本的嵌入式操作系統(tǒng)實驗,以滿足不同層次的學生。教學平臺針對性強,教學效果明顯,擁有廣闊的教學應(yīng)用前景,更重要的是能夠增強高校大學生的形象思維與創(chuàng)新能力,為學生今后進一步深造或踏入社會進行相關(guān)系統(tǒng)的開發(fā)奠定扎實的基礎(chǔ)。
編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。
參考文獻
[1] 劉泉,李方敏,呂鋒,等.現(xiàn)代嵌入式實踐教學平臺在實踐教學中的應(yīng)用[J].理工高教研究,2006,25(2):96-97.
[2] 郭明良,王朋,郭松林.基于CDIO模式的電類本科實踐教學體系構(gòu)建[J].中國電力教育,2014(2):158-159.
[3] 劉會英,蓋玉先,徐寧.探索適合我國國情的CDIO工程教育模式[J].實驗室研究與探索,2011,30(7):119-120.
[4] 朱向慶,黎東濤,蘇超益,等.適合于項目教學法的三合一單片機實驗箱設(shè)計[J].實驗技術(shù)與管理,2013,80(7):55-59.
[5] 王朋,郭明良,王越明.“單片機原理及應(yīng)用”課程的CDIO教學模式探索[J].中國電力教育,2014(14):83-84.
[6] 王朋.“單片機原理”實驗教學體系建設(shè)[J].電氣電子教學學報,2010,32(5):107-108.
[7] 桑靜,徐金宏,趙偉.嵌入式輔助教學平臺的構(gòu)建[J].科學技術(shù)與工程,2010,10(36):9115-9117.
[8] 王高鵬,朱寧西.基于LPC2368嵌入式實驗平臺的構(gòu)建[J].微計算機信息,2008,24(6-2):18-20.
[9] 章民融,徐亞鋒.嵌入式教學關(guān)鍵點的研究和嵌入式實驗教學平臺的設(shè)計[J].計算機應(yīng)用與軟件,2009,26(3):160-162.
[10] 李東.提高單片機應(yīng)用系統(tǒng)可靠性的研究[J].信陽師范學院學報:自然科學版,1999,12(3):354-357.
[11] 蔣躍文.以設(shè)計實驗為主線的單片機實驗平臺的開發(fā)與應(yīng)用[J].蘇州大學學報:工科版,2010,30(1):28-31.
[12] 賈萍,丁向榮,胡美蘭.“教、學、做”一體化單片機教學實驗平臺的設(shè)計與應(yīng)用[J].實驗技術(shù)與管理,2012,29(6):139-142.
(責任編輯:薛士然 收稿日期:2015-04-15)
Debugging Scheme of Dynamic Allocation Memory in Embedded Program※
Chen Hongjun,Feng Yadong,Wen Jifeng,Zhou Qiang
(NR Electric Co.,Ltd.,Nanjing 211102,China)
This paper proposes a variable debugging scheme of dynamic allocation memory in the embedded program.The application program is organized by the component,and the component's data is encapsulated by structure.The embedded system program provides the interface to record the head address and instance name of the structure.The upper computer debugging software analyzes the structure variable's relative address,then sends the information of name and relative address to the embedded server.The server calculates the absolute address by adding the head address and relative address,then accesses to the address and reads the data,sends the data to the debugging tool for displaying lastly.The debugging scheme has been used in the protection and monitoring device of the power system,which improves the diagnostic efficiency of the program.
embedded program;dynamic allocate;memory debugging;structure analysis
Platform Teaching Mode of Embedded Project Teaching Platform※
Guo Guofa,Gong Yao,Zhang Kaisheng
(College of Electrical and Information Engineering,Shanxi University of Science and Technology,Xi,an 710021,China)
TP393
A
士然
2015-04-20)
陜西省西安未央科技區(qū)項目“基于物聯(lián)網(wǎng)的信息監(jiān)控平臺研究”(項目編號:2012-03);陜西校地合作項目-基于無線傳感器網(wǎng)絡(luò)的礦井環(huán)境及人員監(jiān)測系統(tǒng)研究(項目編號:2011K-29)。
文獻標識碼: A