国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于KeilC51模塊化程序的結(jié)構(gòu)優(yōu)化

2013-08-16 06:28孔憲青
山東工業(yè)技術(shù) 2013年11期
關(guān)鍵詞:調(diào)用時(shí)序模塊化

孔憲青

(威海職業(yè)學(xué)院,山東 威海264200)

0 引言

用C 語(yǔ)言在Keil 軟件上進(jìn)行單片機(jī)程序的編譯是比較有代表性的。并且隨著單片機(jī)小系統(tǒng)控制模塊越來(lái)越多,發(fā)展出了模塊化程序結(jié)構(gòu)。但不可避免的是,單片機(jī)控制的模塊越多,模塊間數(shù)據(jù)交換和函數(shù)的相互調(diào)用也越復(fù)雜。傳統(tǒng)上的main 主函數(shù)所在文件是所以模塊調(diào)用和數(shù)據(jù)匯總的集中區(qū)域,同時(shí)main 主函數(shù)的while(1)循環(huán)要對(duì)總線模塊進(jìn)行多任務(wù)的時(shí)序分配,本文通過(guò)附加一個(gè)模塊化程序Assistant.c 文件使時(shí)序分配和模塊管理分離,使之各自獨(dú)立化,提高了程序的條理和可讀性,并使改錯(cuò)和程序擴(kuò)展進(jìn)一步簡(jiǎn)化。

1 KeilC51 模塊化程序簡(jiǎn)介

傳統(tǒng)的KeilC51 模塊化程序就是有一個(gè)main.c 文件和若干子模塊構(gòu)成。而其中子模塊由一組*.c 和*.h 共同構(gòu)成。Main.c 文件調(diào)用各自子模塊的頭文件,而子模塊頭文件里帶有可外部調(diào)用的函數(shù)和數(shù)據(jù)。這樣通過(guò)頭文件建立和主函數(shù)文件的溝通橋梁,事實(shí)上也是唯一的一個(gè)橋梁。結(jié)構(gòu)見(jiàn)圖一,程序構(gòu)成如下:

#include "h_a.h" ......

void main(void){ while(1){//模塊時(shí)序分配} }

#ifndef _H_A_H_ #define _H_A_H_

//模塊函數(shù)的外調(diào)函數(shù)

#endif

各子模塊滿足的條件是:

(1)硬件驅(qū)動(dòng)模塊,一種特定硬件對(duì)應(yīng)一個(gè)模塊(圖中以h 開(kāi)頭的模塊);

(2)軟件功能模塊,其模塊的劃分應(yīng)滿足低偶合、高內(nèi)聚[1]的要求(圖中以s 開(kāi)頭的模塊)。

主函數(shù)和子模塊頭文件的結(jié)構(gòu)類似于圖一中右側(cè)程序。

子函數(shù)的.c 文件的結(jié)構(gòu)是和mian.c 主函數(shù)文件是一致的,注意要把自身頭文件包含進(jìn)去。除了外調(diào)的函數(shù)外,包括全局常變量部分,所有函數(shù)都要用static 靜態(tài)關(guān)鍵字封閉函數(shù)本體。這樣才能滿足高內(nèi)聚和獨(dú)立化的要求,下面通過(guò)Ds1302 模塊說(shuō)明的聲明形式:

可以看出需要外調(diào)的都是不帶static 關(guān)鍵字的,內(nèi)聚函數(shù)都是靜態(tài)的,這樣也可以避免不同模塊的函數(shù)同名問(wèn)題。

2 通過(guò)節(jié)拍實(shí)現(xiàn)對(duì)模塊的并行時(shí)序分配

Main.c 文件內(nèi)部while(1){……}循環(huán)體內(nèi)要進(jìn)行模塊的時(shí)序分配,我個(gè)人的解決方式是通過(guò)節(jié)拍控制來(lái)管理。具體是采用一個(gè)定時(shí)器來(lái)產(chǎn)生節(jié)拍,例如AT89S52 的16 位T2 定時(shí)器,方式是設(shè)置T2 為自動(dòng)重裝,然后每50ms 產(chǎn)生一個(gè)節(jié)拍。這樣在程序的前臺(tái)[2]總有一個(gè)節(jié)拍來(lái)控制模塊的啟停。下面是程序段:

(1)定義節(jié)拍

char g_Beat[6]=0; //全局節(jié)拍的個(gè)數(shù)由并行模塊的數(shù)量決定

(2)設(shè)置節(jié)拍

(3)中斷方式激活節(jié)拍

(4)調(diào)用節(jié)拍控制并行模塊

while(1)

{if(g_Beat[1]>=10){g_Beat[1]=0;NecKey(); } //模塊一0.5 秒執(zhí)行一次

if(g_Beat[2]>=20){g_Beat[2]=0;CalendarShow(); } //模塊二1 秒執(zhí)行一次

if(g_Beat[3]>=30){g_Beat[3]=0;TimeDot(); } //模塊三1.5 秒執(zhí)行一次

if(g_Beat[4]>=50){g_Beat[4]=0;Ds18b20TempN5110();} } //模 塊 四2.5 秒執(zhí)行一次

節(jié)拍控制是占用一個(gè)定時(shí)器且利用中斷產(chǎn)生的節(jié)拍,因此把節(jié)拍設(shè)置的長(zhǎng)一些比較好,例如50ms,同時(shí)定時(shí)器也設(shè)置為低優(yōu)先級(jí)。通過(guò)節(jié)拍main 函數(shù)的并行模式不是一個(gè)真正的并行序列,因?yàn)閱纹瑱C(jī)指令的執(zhí)行微觀上是串行的,只有FPGA 這種器件才能實(shí)現(xiàn)真正的并行。但是宏觀上節(jié)拍的引入,使模塊的發(fā)生僅僅出現(xiàn)在時(shí)間軸的若干點(diǎn)上,這樣模塊的執(zhí)行就相似于并行序列,而且時(shí)鐘越快,這種串行模擬越能逼近并行的工作模式。

3 模塊化程序的優(yōu)化

優(yōu)化是因?yàn)?,main 主函數(shù)要把所有采集回來(lái)的數(shù)據(jù)進(jìn)行處理,并進(jìn)行時(shí)序分配,這些任務(wù)對(duì)于模塊較少時(shí)候可以,但是模塊多于6 個(gè)以上后,這種控制變得的極其繁瑣。例如做一個(gè)萬(wàn)年歷的小系統(tǒng),內(nèi)部使用了h_N5110.c(顯示)、h_Ds18b20.c(溫度)、h_Ds1302.c(時(shí) 間/日歷)、h_Isd1420.c(放音)、s_IrNecRxd(設(shè)置通訊)、s_ChinaLunar.h (陽(yáng)陰歷轉(zhuǎn)換)共6 個(gè)模塊。其中軟件模塊和硬件模塊都有,并且相互調(diào)用時(shí)候數(shù)據(jù)交互復(fù)雜,如N5110 模塊中顯示字符串這個(gè)函數(shù)就要被不同模塊中的很多函數(shù)調(diào)用。

優(yōu)化的方式是建立一個(gè)Assistant.c 模塊,稱為主函數(shù)的助手模塊。這個(gè)模塊的主要任務(wù)就是把所有子模塊的外出數(shù)據(jù)和外調(diào)函數(shù)都集中到本模塊內(nèi),在這里進(jìn)行匯總材料和組成被主函數(shù)main 調(diào)用的純函數(shù)(即輸入輸出都是void 的函數(shù))。假設(shè)子模塊是把原料合成半成品的加工廠,那么Assistant 模塊就是把半成品組裝成商品的組裝廠,而main 函數(shù)就是使用這些商品的客戶,而客戶的唯一任務(wù)就是使用這些商品并分配利益即分配多任務(wù)下的總線時(shí)間,具體程序優(yōu)化后的結(jié)構(gòu)見(jiàn)圖1。

Assistant 模塊對(duì)于子模塊來(lái)說(shuō)其實(shí)是個(gè)管理者。它管理和接受各個(gè)子模塊部門的數(shù)據(jù)和函數(shù)。這里注意一點(diǎn)就是子模塊的外調(diào)函數(shù)也是純函數(shù),它們使用時(shí)不調(diào)用任何非自身模塊的數(shù)據(jù)和函數(shù),即使模塊內(nèi)部需要相同的某個(gè)函數(shù)例如延時(shí),也應(yīng)該設(shè)置成靜態(tài)函數(shù)。總之,子模塊是非常純粹的數(shù)據(jù)和函數(shù)包體。

而Assistant 和main 主函數(shù)的關(guān)系更像主管和秘書,它最后形成的函數(shù)必須是輸入輸出都是void 的函數(shù),這樣才能斷開(kāi)main 和子模塊的所有聯(lián)系。Assistant 模塊是一個(gè)承上啟下的一個(gè)模塊,通過(guò)它把子模塊的若干問(wèn)題解決后,提供個(gè)main 若干單一純粹的函數(shù)。Assistant 的出現(xiàn)使并行模塊的時(shí)間分配和數(shù)據(jù)處理分離開(kāi)來(lái)。使時(shí)序的問(wèn)題和函數(shù)的問(wèn)題解耦并各自獨(dú)立化。

4 結(jié)束語(yǔ)

子模塊構(gòu)建要求它不能外調(diào)其他模塊的函數(shù),完全靠自身的函數(shù)來(lái)實(shí)現(xiàn)基本驅(qū)動(dòng)的功能。如果模塊內(nèi)部需要調(diào)用來(lái)自外部的值,應(yīng)該設(shè)置成入口參數(shù)形式和返回值形式,不能把外部輸入量直接寫入函數(shù)內(nèi)部。只有子模塊內(nèi)部有中斷并且在中斷中產(chǎn)生了數(shù)值才允許使用extern 輸入輸出中間值。Assistant 是個(gè)混合模塊,事實(shí)上它是所有模塊中最復(fù)雜的,在這個(gè)模塊中有大量的全局變量和常量,它的目標(biāo)就是組合子模塊各種資源并形成純void 函數(shù)給main 調(diào)用。換句話說(shuō),優(yōu)化模塊化程序設(shè)計(jì)KeilC51,集中的任務(wù)就是如何寫Assistant。Main 函數(shù)的唯一任務(wù)就是通過(guò)節(jié)拍控制Assistant 提供的函數(shù)以實(shí)現(xiàn)多任務(wù)并行運(yùn)行,高效率的完成總線周期。

本文從KeilC51 的模塊化程序出發(fā),介紹了在多模塊下如何組織和優(yōu)化程序結(jié)構(gòu)方法。其中要點(diǎn)是建立Asssitant 模塊使多種模塊的功能單一化。這種組織形式為類似的程序處理提供了參考。

[1][美]Michael J.Pont.C 語(yǔ)言嵌入式系統(tǒng)開(kāi)發(fā)[M].中國(guó)電力出版社,2003-12-01.

[2]侯殿有.基于八位單片機(jī)的C 語(yǔ)言程序設(shè)計(jì)[M].北京大學(xué)出版社,2012-09-01

猜你喜歡
調(diào)用時(shí)序模塊化
顧及多種弛豫模型的GNSS坐標(biāo)時(shí)序分析軟件GTSA
重卡內(nèi)飾模塊化技術(shù)
清明
基于GEE平臺(tái)與Sentinel-NDVI時(shí)序數(shù)據(jù)江漢平原種植模式提取
你不能把整個(gè)春天都搬到冬天來(lái)
模塊化住宅
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
馬勒推出新型模塊化混動(dòng)系統(tǒng)
系統(tǒng)虛擬化環(huán)境下客戶機(jī)系統(tǒng)調(diào)用信息捕獲與分析①
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信