亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        孔憲青

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

        0 引言

        用C 語言在Keil 軟件上進(jìn)行單片機(jī)程序的編譯是比較有代表性的。并且隨著單片機(jī)小系統(tǒng)控制模塊越來越多,發(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)要對總線模塊進(jìn)行多任務(wù)的時(shí)序分配,本文通過附加一個(gè)模塊化程序Assistant.c 文件使時(shí)序分配和模塊管理分離,使之各自獨(dú)立化,提高了程序的條理和可讀性,并使改錯(cuò)和程序擴(kuò)展進(jìn)一步簡化。

        1 KeilC51 模塊化程序簡介

        傳統(tǒng)的KeilC51 模塊化程序就是有一個(gè)main.c 文件和若干子模塊構(gòu)成。而其中子模塊由一組*.c 和*.h 共同構(gòu)成。Main.c 文件調(diào)用各自子模塊的頭文件,而子模塊頭文件里帶有可外部調(diào)用的函數(shù)和數(shù)據(jù)。這樣通過頭文件建立和主函數(shù)文件的溝通橋梁,事實(shí)上也是唯一的一個(gè)橋梁。結(jié)構(gòu)見圖一,程序構(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)模塊,一種特定硬件對應(yīng)一個(gè)模塊(圖中以h 開頭的模塊);

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

        主函數(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ú)立化的要求,下面通過Ds1302 模塊說明的聲明形式:

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

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

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

        (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è)置的長一些比較好,例如50ms,同時(shí)定時(shí)器也設(shè)置為低優(yōu)先級(jí)。通過節(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ù)要把所有采集回來的數(shù)據(jù)進(jìn)行處理,并進(jìn)行時(shí)序分配,這些任務(wù)對于模塊較少時(shí)候可以,但是模塊多于6 個(gè)以上后,這種控制變得的極其繁瑣。例如做一個(gè)萬年歷的小系統(tǒng),內(nèi)部使用了h_N5110.c(顯示)、h_Ds18b20.c(溫度)、h_Ds1302.c(時(shí) 間/日歷)、h_Isd1420.c(放音)、s_IrNecRxd(設(shè)置通訊)、s_ChinaLunar.h (陽陰歷轉(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)見圖1。

        Assistant 模塊對于子模塊來說其實(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ù),這樣才能斷開main 和子模塊的所有聯(lián)系。Assistant 模塊是一個(gè)承上啟下的一個(gè)模塊,通過它把子模塊的若干問題解決后,提供個(gè)main 若干單一純粹的函數(shù)。Assistant 的出現(xiàn)使并行模塊的時(shí)間分配和數(shù)據(jù)處理分離開來。使時(shí)序的問題和函數(shù)的問題解耦并各自獨(dú)立化。

        4 結(jié)束語

        子模塊構(gòu)建要求它不能外調(diào)其他模塊的函數(shù),完全靠自身的函數(shù)來實(shí)現(xiàn)基本驅(qū)動(dòng)的功能。如果模塊內(nèi)部需要調(diào)用來自外部的值,應(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)用。換句話說,優(yōu)化模塊化程序設(shè)計(jì)KeilC51,集中的任務(wù)就是如何寫Assistant。Main 函數(shù)的唯一任務(wù)就是通過節(jié)拍控制Assistant 提供的函數(shù)以實(shí)現(xiàn)多任務(wù)并行運(yùn)行,高效率的完成總線周期。

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

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

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

        猜你喜歡
        調(diào)用時(shí)序模塊化
        時(shí)序坐標(biāo)
        模塊化自主水下機(jī)器人開發(fā)與應(yīng)用
        基于Sentinel-2時(shí)序NDVI的麥冬識(shí)別研究
        模塊化住宅
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        ACP100模塊化小型堆研發(fā)進(jìn)展
        中國核電(2017年2期)2017-08-11 08:00:56
        模塊化VS大型工廠
        一種毫米波放大器時(shí)序直流電源的設(shè)計(jì)
        電子制作(2016年15期)2017-01-15 13:39:08
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        久久精品无码一区二区日韩av| 国产精品玖玖资源站大全| 亚洲av天堂久久精品| 国产av日韩a∨亚洲av电影| 久久99精品久久久久九色 | 公与淑婷厨房猛烈进出| 久久国产精品久久久久久| 婷婷开心深爱五月天播播| 69堂在线无码视频2020| 亚洲日本中文字幕乱码| 中国一级黄色片久久久| 久久久久av无码免费网| 亚洲av中文无码字幕色三| 人妻无码一区二区19P| 日本中文字幕官网亚洲| 国产一品二品三品精品在线| 黑森林福利视频导航| 国内精品久久久久久无码不卡| 亚洲美女国产精品久久久久久久久 | 国产精品h片在线播放| 亚洲欧美激情精品一区二区| 九九九影院| 欧美黑人xxxx性高清版| 亚洲精品成人久久av| 日本系列中文字幕99| 日本肥老妇色xxxxx日本老妇| 日韩乱码人妻无码中文字幕视频| 亚洲欧洲AV综合色无码| 一区二区亚洲熟女偷拍| 变态调教一区二区三区女同| 亚洲国产欧美日韩欧美特级 | 国产精品爽爽ⅴa在线观看| 亚洲av日韩av综合| 又爽又黄禁片视频1000免费 | 国产伦久视频免费观看视频| 国产九色AV刺激露脸对白 | 亚洲最大日夜无码中文字幕| 男女激情床上视频网站| 人妻经典中文字幕av| 少妇性bbb搡bbb爽爽爽| 亚洲av无码成人精品区在线观看|