下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
STM32簡單多任務(wù)調(diào)度STM32的開發(fā)目前大多數(shù)還開處于“裸奔”的階段,處于開發(fā)成本的考慮,可能還未嵌入任何的RTOS系統(tǒng),由于沒有操作系統(tǒng)的支持,因而不能方便的對多任務(wù)進(jìn)行調(diào)度和管理,在main函數(shù)中你可能會寫成如下方式:[cpp]main(void)2.{3.while(1)4.{5.Task1();//調(diào)用任務(wù)16.Task2();//調(diào)用任務(wù)27.}8.}但簡單這樣寫的話會存在一個問題,假如任務(wù)1是一個很緊急的任務(wù),如AD采樣任務(wù),需要不斷的去執(zhí)行,而任務(wù)2是一個不太緊急的任務(wù),只要保證一段時間執(zhí)行一次就行(如控制LED燈閃爍,只需要每1s鐘閃爍一次),這樣的話一是頻繁的調(diào)用任務(wù)2占用了任務(wù)1執(zhí)行的時間,二是任務(wù)2根本不需要這樣頻繁的執(zhí)行,白白耗費了CPU的處理。因此可以考慮實現(xiàn)一個調(diào)度策略來解決這個問題。對于每個任務(wù),我們可以定義這樣一個結(jié)構(gòu):[cpp]viewplaincopytypedefstruct{void(*fTask)(void);int64uuNextTick;int32uuLenTick;}sTask;其中fTask為任務(wù)指針,指向具體的任務(wù),uNextTick為該任務(wù)下一次執(zhí)行的時間,uLenTick為任務(wù)的調(diào)度周期或叫調(diào)度頻率,即每隔多長時間執(zhí)行一次。按照這個結(jié)構(gòu),可以預(yù)先定義一個結(jié)構(gòu)體數(shù)組,然后將要調(diào)用的任務(wù)和任務(wù)的調(diào)度時間按照如下方式羅列出來:[cpp]viewplaincopy//任務(wù)列表staticsTaskmTaskTab[]={4.{Task_SysTick,0,0}5.,{Task1,0,10} //10ms執(zhí)行一次6.,{Task2,0,200} //200ms執(zhí)行一次7.};其中第一個任務(wù)Task_SysTick為計算系統(tǒng)時間的任務(wù),用以獲取上電后運(yùn)行的時間(Task_SysTick任務(wù)相關(guān)代碼附在文章后面)。這里默認(rèn)任務(wù)下一次執(zhí)行的時間為0,在main函數(shù)中,不斷的輪詢這個數(shù)組,然后將當(dāng)前任務(wù)的下一次調(diào)用時間和當(dāng)前時間比較,如果發(fā)現(xiàn)輪到該任務(wù)執(zhí)行,就執(zhí)行該任務(wù),執(zhí)行完成后,將該任務(wù)的下一次執(zhí)行時間設(shè)為當(dāng)前時間加任務(wù)的調(diào)度時間,然后按照此方法去執(zhí)行下一個需要執(zhí)行的任務(wù),代碼如下:[cpp]viewplaincopywhile(1)TOC\o"1-5"\h\z{//任務(wù)循環(huán)for(i=0;i<ARRAYSIZE(mTaskTab);i++){if(mTaskTab[i].uNextTick<=GetTimingTick()){mTaskTab[i].uNextTick+=mTaskTab[i].uLenTick;mTaskTab[i].fTask();}}}這樣,就可以對多個任務(wù)做一個簡單的調(diào)度,以后添加任務(wù)時只需要在mTaskTab表中添加即可,需要強(qiáng)調(diào)的是,由于執(zhí)行每個任務(wù)也需要耗費時間,就會導(dǎo)致一個任務(wù)的實際調(diào)度周期可能會比設(shè)定的調(diào)度周期要長,這樣會存在時間不準(zhǔn)的情況,當(dāng)然這僅僅是適合于對輪詢周期不是很嚴(yán)格的任務(wù),如果想要任務(wù)在嚴(yán)格的時間周期內(nèi)執(zhí)行或者需要更精確的時間處理,則必須采用定時器的方式了。附:完整的main文件代碼:[cpp]viewplaincopy#ifndefARRAYSIZE#defineARRAYSIZE(a)(sizeof(a)/sizeof((a)[0]))#endif4.//任務(wù)結(jié)構(gòu)typedefstruct{void(*fTask)(void);u64uNextTick;u32uLenTick;}sTask;11.12.//任務(wù)列表staticsTaskmTaskTab[]={16.{Task_SysTick,0,0}17.,{Task1,0,10} //10ms執(zhí)行一次18.,{Task2,0,200}//200ms執(zhí)行一次
19.20.21.//在這之前添加任務(wù)};22.23.24.FunctionName:main8.DescriptionInputOutputReturn:Mainprogram.:None:None:None29.30.*****/intmain(void)9.20.21.//在這之前添加任務(wù)};22.23.24.FunctionName:main8.DescriptionInputOutputReturn:Mainprogram.:None:None:None29.30.*****/intmain(void)7.38.39.inti=0;//硬件初始化HW_init();//初始化系統(tǒng)Tick任務(wù)dev_SysTick_init(void);//...while(1){40.41.//任務(wù)循環(huán)(i=0;i<ARRAYSIZE(mTaskTab);i++)for42.43.if(mTaskTab[i].uNextTick<=GetTimingTick())44.45.46.mTaskTab[i].uNextTick+=mTaskTab[i].uLenTick;45.46.mTaskTab[i].fTask();47.48.49.Task_SysTick任務(wù)相關(guān)代碼:[cpp]viewplaincopyvolatileint64ug_TimingTick=0;volatileint64ug_TimingTickOld=0;3.////【函數(shù)名稱】voiddev_SysTick_init(void)//【參 數(shù)】
能】初始化回值】None建者】2010-07-27firehood//【功//【返//【創(chuàng)10.//========================================================================10.voiddev_SysTick_init(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;14./*Timebaseconfiguration*/TIM_TimeBaseStructure.TIM_Period=65535;TIM_TimeBaseStructure.TIM_Prescaler=36000-1;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;20.TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);22.TIM_SetCounter(TIM2,0);24./*TIMenablecounter*/TIM_Cmd(TIM2,ENABLE);}28.//========================================================================30.//30.//【函數(shù)名稱】voidGetTimingTick(void)//【參//【參//【功//【返回數(shù)】能】獲取MCU啟動后的運(yùn)行時間值】MCU啟動后的運(yùn)行時間,單位ms34.//34.//【創(chuàng)建者】2010-07-27firehood//========================================================================int64uGetTimingTick(void){returng_TimingTick;}40.//========================================================================42.//【函數(shù)名稱】43.//【參數(shù)】44.//【功能】45.//【返回值】46.//【創(chuàng)建者】voidTask_SysTick(void)Tick任務(wù),從TIM2獲取系統(tǒng)時間None2010-07-27firehood
//
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 實驗室衛(wèi)生規(guī)章制度
- 養(yǎng)殖場獸醫(yī)衛(wèi)生制度
- 衛(wèi)生院疑難病例討論制度
- 服裝店內(nèi)衛(wèi)生管理制度
- 基層衛(wèi)生院節(jié)約制度
- 辦公樓內(nèi)部環(huán)境衛(wèi)生制度
- 蛋奶儲藏室衛(wèi)生消毒制度
- 居委會衛(wèi)生站工作制度
- 費縣隔離點衛(wèi)生制度
- 海鮮店衛(wèi)生安全管理制度
- 柴油維修技術(shù)培訓(xùn)課件
- 安全附件管理制度規(guī)范
- 2026院感知識考試題及答案
- 《紅樓夢》導(dǎo)讀 (教學(xué)課件) -高中語文人教統(tǒng)編版必修下冊
- 室外供熱管道安裝監(jiān)理實施細(xì)則
- 腰背部推拿課件
- DL∕T 5210.6-2019 電力建設(shè)施工質(zhì)量驗收規(guī)程 第6部分:調(diào)整試驗
- 陣發(fā)性室性心動過速課件
- 無機(jī)與分析化學(xué)理論教案
- 名詞性從句 講義-英語高考一輪復(fù)習(xí)語法部分
- T∕ZZB 2722-2022 鏈板式自動排屑裝置
評論
0/150
提交評論