張偉++張建++霍亮++高巖++孫天澳++李旭升++王云亮
摘 要:本文介紹一種基于建立索引查詢方式實(shí)現(xiàn)層次化的嵌入式軟件設(shè)計(jì)方法,本方法具有可移植性、可重構(gòu)性等特點(diǎn),特別適合在控制器嵌入式軟件實(shí)現(xiàn)層次化查詢方式的多級(jí)調(diào)用的軟件結(jié)構(gòu)。
關(guān)鍵詞:嵌入式軟件 可移植性 可重構(gòu)性 層次化
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2017)11(a)-0157-02
在嵌入式軟件系統(tǒng)設(shè)計(jì)中,C或C++軟件結(jié)構(gòu)設(shè)計(jì)是一種過(guò)程設(shè)計(jì),對(duì)于軟件設(shè)計(jì)中存在的事件調(diào)用,一般都使用硬件或軟件中斷調(diào)用方式,但由于子函數(shù)在調(diào)用過(guò)程中體量的大小不同,容易導(dǎo)致中斷,在設(shè)計(jì)中往往對(duì)于程序存在隱患。而查詢方式又過(guò)多地占用CPU的運(yùn)行時(shí)間。
本文介紹一種基于建立索引查詢方式的層次化的嵌入式軟件設(shè)計(jì)應(yīng)用,通過(guò)結(jié)合硬件或軟件中斷產(chǎn)生信號(hào)量,通過(guò)查詢方式來(lái)實(shí)現(xiàn)多層次函數(shù)的調(diào)用,既避免了過(guò)程設(shè)計(jì)中重復(fù)調(diào)用子函數(shù)導(dǎo)致的代碼冗余,也避免了中斷調(diào)用子函數(shù)導(dǎo)致的程序隱患。本方法已經(jīng)成功運(yùn)用到固態(tài)物料鐵品位檢測(cè)儀的產(chǎn)品中。
1 應(yīng)用介紹
目前較為流行的控制器包括單片機(jī)、ARM、DSP等,利用有限的存儲(chǔ)空間和設(shè)計(jì)資源,提高嵌入式軟件的設(shè)計(jì)方法,減少數(shù)據(jù)結(jié)構(gòu)冗余,提高程序效率是提高軟件設(shè)計(jì)穩(wěn)定性的重要方法。
本文利用一個(gè)簡(jiǎn)單的硬件環(huán)境實(shí)現(xiàn)靜態(tài)物料移動(dòng)平臺(tái)的功能。包括利用電機(jī)控制、顯示、按鍵控制、I/O等硬件外設(shè),實(shí)現(xiàn)電機(jī)軌跡的返回原點(diǎn)、方向控制、功能控制、菜單顯示、I/O檢測(cè)等功能。其基本功能如下。
(1)功能介紹。
“X軸正”:通過(guò)查詢X軸正索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
“X軸負(fù)”:通過(guò)查詢X軸負(fù)索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
“Y軸正”:通過(guò)查詢Y軸正索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
“Y軸負(fù)”:通過(guò)查詢Y軸負(fù)索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
“復(fù)位”:通過(guò)查詢復(fù)位索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
“停止”:通過(guò)查詢停止索引值,找到需要操作的函數(shù)指針,并執(zhí)行相應(yīng)移動(dòng)。
(2)液晶顯示。
執(zhí)行相應(yīng)操作后,在液晶顯示屏中,顯示對(duì)應(yīng)的操作。
(3)I/O檢測(cè)。
檢測(cè)接近開關(guān)狀態(tài),實(shí)現(xiàn)原點(diǎn)復(fù)位操作。
本系統(tǒng)相關(guān)底層驅(qū)動(dòng)程序,包括I/O檢測(cè)、顯示屏顯示、電機(jī)控制等程序已經(jīng)測(cè)試完成。
2 軟件結(jié)構(gòu)設(shè)計(jì)
索引查詢方式的層次化軟件設(shè)計(jì)結(jié)構(gòu)是根據(jù)結(jié)構(gòu)體加函數(shù)指針實(shí)現(xiàn)的。結(jié)構(gòu)體變量IndexlistStruct,并在結(jié)構(gòu)體中的定義不同功能下的索引號(hào)IndexState,并建立對(duì)于電機(jī)運(yùn)行軌跡的索引號(hào),以及函數(shù)指針變量,指向需下一步操作所需執(zhí)行的函數(shù)。
底層驅(qū)動(dòng)函數(shù)名如下所示:
void I_Ocheck(void); //采樣函數(shù) void XPosMove(void); //左移函數(shù)
void XNegMove(void); //右移函數(shù) void YPosMove(void); //加法函數(shù)
void YNegMove(void); //減法函數(shù) void ResetMove(void); //菜單函數(shù)
void StopMove(void); //返回函數(shù)
結(jié)構(gòu)體定義根據(jù)需要對(duì)數(shù)據(jù)類型進(jìn)行定義,本文使用無(wú)符號(hào)整形變量。結(jié)構(gòu)體所示如下:
typedef struct
{uint8 IndexState; //當(dāng)前狀態(tài)索引 uint8 XPosState;//按“向左”鍵時(shí)轉(zhuǎn)向的索引
uint8 XNegState;//按“向右”鍵時(shí)轉(zhuǎn)向的索引uint8 YPosState; //按“向上”鍵時(shí)轉(zhuǎn)向的索引 uint8 YNegState;//按“向下”鍵時(shí)轉(zhuǎn)向的索引 uint8 ResetState; //按“菜單”鍵時(shí)轉(zhuǎn)向的索引 uint8 StopMoveState; //按“退出”鍵時(shí)轉(zhuǎn)向的索引 void (*DealOperate);//當(dāng)前狀態(tài)應(yīng)該執(zhí)行的功能操作} IndexlistStruct; IndexlistStruct結(jié)構(gòu)體需要建立一個(gè)數(shù)組構(gòu)成菜單索引號(hào),包括同一驅(qū)動(dòng)函數(shù)不同層次下的下一級(jí)指向的索引號(hào)和每個(gè)獨(dú)立操作的底層驅(qū)動(dòng)函數(shù)的函數(shù)指針,共同組成了一個(gè)“標(biāo)簽”,通過(guò)同層次上的索引號(hào),電機(jī)控制的X軸正、X軸負(fù)、Y軸正、Y軸負(fù)4個(gè)方向的運(yùn)動(dòng)軌跡就可以依據(jù)同級(jí)菜單的索引號(hào)找到下一級(jí)next_index索引號(hào),并通過(guò)更新next_index索引號(hào),并根據(jù)next_index對(duì)應(yīng)的*DealOperate()函數(shù)的操作號(hào),執(zhí)行DealOperate()函數(shù)。不同功能函數(shù)對(duì)應(yīng)的索引號(hào)和層數(shù)數(shù)通過(guò)Sizeofmenu的具體操作值來(lái)定義。如下所示為具體的設(shè)計(jì)方法:
IndexlistStruct code IndexTab[Sizeofmenu]=
{{0,0,1,2,3,4,5,(*XPosMove)},//X軸正 {1,0,1,2,3,4,5,(*XNegMove)}, //X軸負(fù)
{2,0,1,2,3,4,5,(*YPosMove)}, //Y軸正 {3,0,1,2,3,4,5,(*YNegMove)},//Y軸負(fù)
{4,0,1,2,3,4,5,(*ResetMove)}, //復(fù)位 {5,0,1,2,3,4,5,(*StopMove)} //停止
……}
在設(shè)計(jì)過(guò)程中可以把結(jié)構(gòu)體數(shù)組放在程序代碼的code區(qū),這樣在建立大體量的多層次結(jié)構(gòu)索引時(shí)可以減少了內(nèi)存的使用。另外可根據(jù)需要優(yōu)化菜單的層數(shù)。如下是通過(guò)查詢方式更新索引號(hào)并執(zhí)行相應(yīng)函數(shù)指針的操作:
//錯(cuò)誤處理返回主菜單 break; }
DealOperateFunc=IndexTab[next_index].DealOperate; (*DealOperateFunc)(); //執(zhí)行需要處理的操作 }綜上所述,通過(guò)建立結(jié)構(gòu)體變量實(shí)現(xiàn)對(duì)驅(qū)動(dòng)函數(shù)的說(shuō)明,構(gòu)建包括索引號(hào)及函數(shù)指針的數(shù)組菜單,通過(guò)查詢方式,更新不同操作的索引號(hào),可以通過(guò)預(yù)先設(shè)計(jì)的功能順序,實(shí)現(xiàn)不同函數(shù)功能,不同函數(shù)調(diào)用的交叉設(shè)計(jì)。在軟件設(shè)計(jì)上,減少了多次調(diào)用函數(shù)的冗余設(shè)計(jì),減少了C語(yǔ)言執(zhí)行過(guò)程中的邏輯錯(cuò)誤,提高了設(shè)計(jì)的重構(gòu)性,方便地實(shí)現(xiàn)了在函數(shù)調(diào)用上的復(fù)雜性。
3 結(jié)語(yǔ)
產(chǎn)品設(shè)計(jì)中針對(duì)硬件系統(tǒng)和嵌入式軟件系統(tǒng)的設(shè)計(jì)體量平衡是提高產(chǎn)品性能的重要指標(biāo),應(yīng)避免“頭大腳輕”。本文介紹的基于建立索引查詢方式實(shí)現(xiàn)層次化的嵌入式軟件設(shè)計(jì)方法,能夠更好地平衡軟件設(shè)計(jì)結(jié)構(gòu),提高軟件設(shè)計(jì)效率,其可移植性和可重構(gòu)性,也給在不同硬件系統(tǒng)平臺(tái)上查詢帶來(lái)了方便。
參考文獻(xiàn)
[1] 楊智明.C語(yǔ)言指針使用分析[J].保山學(xué)院學(xué)報(bào),2012,31 (2):67-70.
[2] 夏偉偉.C語(yǔ)言指針用法的探討[J].電腦編程技巧與維護(hù), 2014(21):12-13.
[3] 華玉明.51單片機(jī)C語(yǔ)言模塊化多文件編程方法探討[J].吉林廣播電視大學(xué)學(xué)報(bào),2014(10):11-12.endprint