資源描述:
《C語言軟件程序架構(gòu)設(shè)計(jì).pdf》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、時(shí)間片輪詢法對(duì)于一個(gè)單片機(jī)程序員來說,接受一個(gè)項(xiàng)目,在軟件設(shè)計(jì)方面,你首先需要考慮的是如何安排你的功能函數(shù)使之達(dá)到你的項(xiàng)目要求。也就是說你得有個(gè)自己的軟件架構(gòu)。對(duì)于像我這種菜鳥級(jí)的程序員來說,就是采用簡單的順序執(zhí)行,需要什么功能就添加什么功能函數(shù)。這樣做應(yīng)付小項(xiàng)目非??欤坏╉?xiàng)目的功能復(fù)雜,隨著函數(shù)的不斷增加,程序?qū)?huì)變得混亂。面對(duì)大的項(xiàng)目,如果一定要使用這種順序執(zhí)行法,則程序員本人應(yīng)當(dāng)在接手項(xiàng)目時(shí),保持設(shè)計(jì)思路的清晰,設(shè)計(jì)好完整的流程圖。操作系統(tǒng)不是一句兩句就能說得清楚的。如果你能駕馭那最好不過,如果你對(duì)之不熟悉,就不說操作系統(tǒng)本身的復(fù)雜性,其移植這一塊就需要花費(fèi)相
2、當(dāng)多的時(shí)間和精力。時(shí)間片輪詢法,本人也是在電子工程論壇看到zhaojun_xf的《淺談單片機(jī)應(yīng)用程序架構(gòu)》一文才知道這種軟件架構(gòu)的。下面就通過一個(gè)具體的例子來熟悉下時(shí)間片輪詢法的架構(gòu)和具體應(yīng)有。任務(wù):我們現(xiàn)在有一個(gè)任務(wù)可以細(xì)分為三個(gè)功能模塊:時(shí)鐘顯示、按鍵掃描和工作狀態(tài)顯示。我們的程序應(yīng)當(dāng)這么進(jìn)行:1、設(shè)計(jì)一個(gè)結(jié)構(gòu)體并完成初始化//任務(wù)結(jié)構(gòu)typedefstruct_TASK_COMPONENTS{uint8Run;//程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行uint8Timer;//計(jì)時(shí)器uint8ItvTime;//任務(wù)運(yùn)行間隔時(shí)間void(*TaskHook)(void)
3、;//要運(yùn)行的任務(wù)函數(shù)}TASK_COMPONENTS;//任務(wù)定義在結(jié)構(gòu)體變量定義后,進(jìn)行初始化(按照三個(gè)功能模塊設(shè)定好初始值):staticTASK_COMPONENTSTaskComps[]={{0,60,60,TaskDisplayClock},//顯示時(shí)鐘{0,20,20,TaskKeySan},//按鍵掃描{0,30,30,TaskDispStatus},//顯示工作狀態(tài)//這里添加你的任務(wù)。。。。};2、任務(wù)列表//任務(wù)清單typedefenum_TASK_LIST{TAST_DISP_CLOCK,//顯示時(shí)鐘TAST_KEY_SAN,//按鍵掃描TASK
4、_DISP_WS,//工作狀態(tài)顯示//這里添加你的任務(wù)。。。。TASKS_MAX//總的可供分配定時(shí)任務(wù)數(shù)目}TASK_LIST此任務(wù)清單只是為了很好的展示任務(wù)的關(guān)系,我們所要的只是總?cè)蝿?wù)數(shù)這一項(xiàng)。與#defineTASK_NUM(3)語句作用是一致的。3、中斷服務(wù)函數(shù)voidTaskRemarks(void){uint8i;for(i=0;i5、完了{(lán)//恢復(fù)計(jì)時(shí)器值,從新下一次TaskComps[i].Timer=TaskComps[i].ItvTime;TaskComps[i].Run=1;//任務(wù)可以運(yùn)行}}}}此函數(shù)放入中斷服務(wù)函數(shù)。在中斷中逐個(gè)判斷,如果定時(shí)值為0了,表示沒有使用此定時(shí)器或此定時(shí)器已經(jīng)完成定時(shí),不作處理。否則定時(shí)器減一,直到為零時(shí),相應(yīng)標(biāo)志位值1,表示此任務(wù)的定時(shí)值到了。4、任務(wù)處理voidTaskProcess(void){uint8i;for(i=0;i6、].TaskHook();//運(yùn)行任務(wù)TaskComps[i].Run=0;//標(biāo)志清0}}}此函數(shù)就是判斷什么時(shí)候該執(zhí)行哪一個(gè)任務(wù)了,實(shí)現(xiàn)任務(wù)的管理操作,應(yīng)用者只需要在main()函數(shù)中調(diào)用此函數(shù)就可以了,并不需要去分別調(diào)用和處理任務(wù)函數(shù)。/***************************************************************************************FunctionName:TaskDisplayClock()*Description:顯示任務(wù)*EntryParameter:None*ReturnValu
7、e:None**************************************************************************************/voidTaskDisplayClock(void){}/***************************************************************************************FunctionName:TaskKeySan()*Description:掃描任務(wù)*EntryParameter:None*