STM32簡單多任務(wù)調(diào)度_第1頁
STM32簡單多任務(wù)調(diào)度_第2頁
STM32簡單多任務(wù)調(diào)度_第3頁
STM32簡單多任務(wù)調(diào)度_第4頁
STM32簡單多任務(wù)調(diào)度_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、3STM32簡單多任務(wù)調(diào)度STM32的開發(fā)目前大多數(shù)還開處于 裸奔”的階段,處于開發(fā)成本的考慮, 可能還未嵌入任 何的RTOS系統(tǒng),由于沒有操作系統(tǒng)的支持,因而不能方便的對多任務(wù)進(jìn)行調(diào)度和管理,在main函數(shù)中你可能會寫成如下方式:cpp view pla in 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鐘

2、閃爍一次),這樣的話一是頻繁的調(diào)用任務(wù)2占用了任務(wù)1執(zhí)行的時間,二是任務(wù)2根本不需要這樣頻繁的執(zhí)行,白白耗費(fèi)了 CPU的處理。因此可以考慮實現(xiàn)一個調(diào)度策略來解決這個問題。對于每個任務(wù),我們可以定義這樣一個結(jié)構(gòu):cpp view pla in copy1. typedef struct 2. void (*fTask)( void );3. int64u uNextTick;4. int32u uLenTick;5. sTask;其中fTask為任務(wù)指針,指向具體的任務(wù),uNextTick為該任務(wù)下一次執(zhí)行的時間,uLenTick為任務(wù)的調(diào)度周期或叫調(diào)度頻率,即每隔多長時間執(zhí)行一次。按照這個結(jié)構(gòu)

3、,可以預(yù)先定義一個結(jié)構(gòu)體數(shù)組,然后將要調(diào)用的任務(wù)和任務(wù)的調(diào)度時 間按照如下方式羅列出來:cpp view pla in copy1. /任務(wù)列表2. static sTask mTaskTab=3. 4. Task_SysTick, 0, 05. ,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)用時間和

4、當(dāng)前時間比較, 如果發(fā)現(xiàn)輪到該任務(wù)執(zhí)行,就執(zhí)行該任務(wù),執(zhí)行完成后,將該任務(wù)的下一次執(zhí)行時間設(shè)為當(dāng) 前時間加任務(wù)的調(diào)度時間,然后按照此方法去執(zhí)行下一個需要執(zhí)行的任務(wù),代碼如下:cpp view pla in copy11. while 2. 3. /任務(wù)循環(huán)4. for (i = 0; i ARRAYSIZE(mTaskTab); i+)5. 6. if (mTaskTabi.uNextTick = GetTimingTick()7. 8. mTaskTabi.uNextTick += mTaskTabi.uLenTick;9. mTaskTabi.fTask();I 這樣,就可以對多個任務(wù)做一

5、個簡單的調(diào)度,以后添加任務(wù)時只需要在mTaskTab表中添加即可,需要強(qiáng)調(diào)的是,由于執(zhí)行每個任務(wù)也需要耗費(fèi)時間,就會導(dǎo)致一個任務(wù)的實際調(diào)度周期可能會比設(shè)定的調(diào)度周期要長,這樣會存在時間不準(zhǔn)的情況,當(dāng)然這僅僅是適合于對輪詢周期不是很嚴(yán)格的任務(wù),如果想要任務(wù)在嚴(yán)格的時間周期內(nèi)執(zhí)行或者需要更精確的時間處理,則必須采用定時器的方式了。附:完整的main文件代碼:cpp view pla in copy1.#ifndef ARRAYSIZE2.#define ARRAYSIZE(a) (sizeof(a) / sizeof(a)0)3.#endif4./任務(wù)結(jié)構(gòu)5.typedef struct 6.vo

6、id (*fTask)(void );7.u64 uNextTick;8.u32 uLenTick;9.sTask;10./任務(wù)列表11.static sTask mTaskTab=12.13Task_SysTick, 0, 014,Task1,0, 10/ 10ms執(zhí)行一次15,Task2,0, 200/ 200ms執(zhí)行一次16./在這之前添加任務(wù)17.;18./*9./:5kkkkkk19.Function Name : main20.Description : Main program.21.Input:None22.Output:None23.Return:None24.*/25.intmain( void )26.27.28.int i = 0;/硬件初始化29.HW_init();30./初始化系統(tǒng)Tick任務(wù)31.dev_SysTick_init(void );32./ .33.while (1)34.35./任務(wù)循環(huán)36.for(i = 0; i ARRAYSIZE(mTaskTab); i+)37.38.if (mTaskTabi.uNextTick 1000)TIM_SetC

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論