ARM Cortex-M3嵌入式開發及應用教與學 課件 第11章 μCOS-II任務管理_第1頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第11章 μCOS-II任務管理_第2頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第11章 μCOS-II任務管理_第3頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第11章 μCOS-II任務管理_第4頁
ARM Cortex-M3嵌入式開發及應用教與學 課件 第11章 μCOS-II任務管理_第5頁
已閱讀5頁,還剩24頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARMCortex-M3嵌入式控制技術

——基于STM32F103RCT6

嵌入式實時操作系統μC/OS-II第十一章

μC/OS-II任務管理

本章將介紹μC/OS-II任務管理相關的系統函數及其應用方法,并將深入剖析多任務的工程實例及其工作原理,然后,還將介紹統計任務的作用和系統定時器的創建方法。

本章的學習目標:

了解統計任務的用法;

熟悉μC/OS-II用戶任務相關的系統函數;

掌握μC/OS-II用戶任務的創建方法;

熟練應用庫函數方法創建多任務工程。

1μC/OS-II用戶任務2μC/OS-II多任務工程實例3

統計任務實例4系統定時器11.1μC/OS-II用戶任務相對于系統任務而言,μC/OS-II應用程序中用戶創建的任務,稱為用戶任務,每個用戶任務都在周期性地執行著某項工作,或請求到事件后執行相應的功能。用戶任務的特點如下:(1)用戶任務對應的函數是一個帶有無限循環體的函數,由于具有無限循環體,故該類函數沒有返回值。(2)用戶任務對應的函數具有一個“void*”類型的指針參數,該類型指針可以指向任何類型的數據,通過該指針在任務創建時向任務傳遞一些數據,這種傳遞只能發生一次,即創建任務的時候,一旦任務開始工作,就無法再通過函數參數向任務傳遞數據了。(3)每個用戶任務具有唯一的優先級號,取值范圍為0~OS_LOWEST_PRIO-3(OS_LOWEST_PRIO為os_cfg.h中宏定義的常量,最大值為254),一般地,系統的空閑任務優先級號為OS_LOWEST_PRIO,統計任務的優先級號為OS_LOWEST_PRIO-1,定時器任務的優先級號常設定為OS_LOWEST_PRIO-2。此外,需要為優先級繼承優先級留出優先級號,所以,用戶任務的優先級號一般為5~OS_LOWEST_PRIO-3。在基于STM32F103RCT6的工程中,OS_LOWEST_PRIO被宏定義為63(參考表10-2和程序段10-10的os_cfg.h文件),定時器任務的優先級號為61,因此,用戶任務的優先級號的取值范圍為5~60。(4)每個用戶任務具有獨立的堆棧,使用OS_STK類型定義堆棧,堆棧數組的大小一般要在50(即200字節)以上。函數原型功能INT8UOSTaskCreate(void(*task)(void*p_arg),

void*p_arg,OS_STK*ptos,INT8Uprio);創建一個任務。4個參數的含義依次為:用戶任務對應的函數名、函數參數、任務堆棧、任務優先級。可以在啟動多任務前創建任務,也可在一個已經運行的任務中創建新的任務,但不能在中斷服務程序中創建任務。任務函數必須包含無限循環體,且必須調用OSMboxPend、OSFlagPend、OSMutexPend、OSQPend、OSSemPend、OSTimeDly、OSTimeDlyHMSM、OSTaskSuspend和OSTaskDel中的一個,用于實現任務調度。任務優先級不應取為0~4,并且不能取為OS_LOWEST_PRIO-1~OS_LOWEST_PRIOINT8UOSTaskCreateExt(void(*task)(void*p_arg),

void*p_arg,OS_STK*ptos,INT8Uprio,INT16Uid,OS_STK*pbos,

INT32Ustk_size,void*pext,INT16Uopt);與OSTaskCreate作用相同,用于創建一個任務。該函數的前4個參數與OSTaskCreate相同,增加了表示任務ID號、任務堆棧棧底、任務堆棧大小、用戶定義的任務外部空間指針和任務創建選項等參數。如果要對任務的堆棧進行檢查,必須使用該函數創建任務,且opt應設置為“OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR”,本書中實例全部使用該函數創建用戶任務INT8UOSTaskDel(INT8Uprio);通過指定任務優先級或OS_PRIO_SELF刪除一個任務或調用該函數的任務自己。被刪除的任務進入休眠態,調用OSTaskCreate或OSTaskCreateExt可再次激活它(中斷服務程序不能調用該函數)INT8UOSTaskDelReq(INT8Uprio);請求任務刪除自己。一般用于刪除占有資源的任務,假設該任務的優先級號為10,發出刪除任務10請求的任務優先級號為5,則在任務5中調用OSTaskDelReg(10),任務10中會調用OSTaskDelReq(OS_PRIO_SELF),如果返回值為OS_TASK_DEL_REQ,則表明有來自其他任務的刪除請求,任務10首先釋放其占有的資源,然后調用OSTaskDel(OS_PRIO_SELF)刪除自己(中斷服務程序不能調用該函數)INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio);更改任務的優先級INT8UOSTaskSuspend(INT8Uprio);無條件掛起一個任務,參數指定為OS_PRIO_SELF時掛起任務自己。與OSTaskResume配對使用INT8UOSTaskResume(INT8Uprio);恢復(或就緒)一個被OSTaskSuspend掛起的任務,而且是唯一可恢復被OSTaskSuspend掛起任務的函數INT8UOSTaskQuery(INT8Uprio,OS_TCB*p_task_data);查詢任務信息INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*p_stk_data);檢查任務堆棧信息,例如,棧未用空間和已用空間。該函數要求使用OSTaskCreateExt創建任務,且opt參數指定為OS_TASK_OPT_STK_CHKINT8UOSTaskNameGet(INT8Uprio,INT8U*pname,INT8U*perr);得到已命名任務的名稱,為ASCII字符串,長度最大為OS_TASK_NAME_SIZE(包括結尾NULL空字符),常用于調試(中斷服務程序不能調用該函數)。3個參數的含義為:任務優先級號、任務名、出錯信息碼voidOSTaskNameSet(INT8Uprio,INT8U*pname,INT8U*perr);為任務命名,名稱為ASCII字符串,長度最大為OS_TASK_NAME_SIZE(包括結尾NULL空字符),常用于調試(中斷服務程序不能調用該函數)。3個參數的含義為:任務優先級號、任務名、出錯信息碼μC/OS-II系統中有兩個創建任務的函數,即OSTaskCreate和OSTaskCreateExt。任務本質上是具有無限循環體的函數。一般地,要創建一個任務,有以下步驟:(1)編寫一個帶有無限循環體的函數,由于具有無限循環體,故函數沒有返回值。該函數具有一個void*類型的指針,該指針可以指向任何類型的數據,通過該指針在任務創建時向任務傳遞一些數據,這種傳遞只能發生一次,一旦任務開始工作,就無法通過函數參數向任務傳遞數據了。該函數的典型樣式如程序段11-1所示。2)為要創建的任務指定優先級號,每個任務都有唯一的優先級號,取值范圍從0至OS_LOWEST_PRIO-2(OS_LOWEST_PRIO為文件os_cfg.h中的宏定義常量,最大值為254),一般地,用戶任務優先級從5至OS_LOWEST_PRIO-3。優先級號常用宏常量來定義,例如#defineTask01Prio5(3)為要創建的任務定義堆棧,必須使用OS_STK類型定義堆棧,例如OS_STKTask01Stk[200];(4)調用OSTaskCreate或OSTaskCreateExt函數創建任務。例如OSTaskCreate(Task01,(void*)0,&Task01Stk[199],Task01Prio);或OSTaskCreateExt(Task01,(void*)0,&Task01Stk[199],Task01Prio,1,&Task01Stk[0],200,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);經過上述四步,一個基于函數Task01的任務創建好了,在不造成混淆的情況下,一般該任務也稱為Task01。在μC/OS-II中,用戶任務共有五種狀態11.2μC/OS-II多任務工程實例代碼:代碼:代碼:代碼:代碼:代碼:代碼:將文件task02.c、task03.c、task04.c、task05.c和task06.c添加到工程管理器的“USER”分組下,建設好的工程PRJ28如圖所示編譯鏈接并運行工程PRJ28,將在LCD屏上顯示如圖所示結果,同時,LED燈D11每隔1秒閃爍一次。注:上圖中編譯結果“BuildOutput”中會有2個警告信息,這2個警告信息是由于μC/OS-II系統中的函數參數沒有使用導致的,無需修改。工程PRJ28的文件目錄結構如表所示序號子目錄文件性質來源1USERmain.c、includes.h、vartypes.h、strfun.c、strfun.h、task01.c、task01.h、task02.c、task02.h、task03.c、task03.h、tasko4.c、task04.、task05.c、task05.h、task06.c、task06.h用戶應用程序文件用戶編寫2BSPbeep.c、beep.h、bsp.c、bsp.h、ds18b20.c、ds18b20.h、exti.c、exti.h、key.c、key.h、lcd.c、lcd.h、led.c、led.h、rt.c、rt.h、textlib.h、tim2.c、tim2.h、uart2.c、uart2.h、zlg7289.c、zlg7289.h板級支持包文件用戶編寫3STM32F10x_FWLibstm32f10x_conf.h庫函數配置文件4STM32F10x_FWLib\incmisc.h、stm32f10x_adc.h、stm32f10x_bkp.h、stm32f10x_can.h、stm32f10x_cec.h、stm32f10x_crc.h、stm32f10x_dac.h、stm32f10x_dbgmcu.h、stm32f10x_dma.h、stm32f10x_exti.h、stm32f10x_flash.h、stm32f10x_fsmc.h、stm32f10x_gpio.h、stm32f10x_i2c.h、stm32f10x_iwdg.h、stm32f10x_pwr.h、stm32f10x_rcc.h、stm32f10x_rtc.h、stm32f10x_sdio.h、stm32f10x_spi.h、stm32f10x_tim.h、stm32f10x_usart.h、stm32f10x_wwdg.h庫函數文件5STM32F10x_FWLib\srcmisc.c、stm32f10x_adc.c、stm32f10x_bkp.c、stm32f10x_can.c、stm32f10x_cec.c、stm32f10x_crc.c、stm32f10x_dac.c、stm32f10x_dbgmcu.c、stm32f10x_dma.c、stm32f10x_exti.c、stm32f10x_flash.c、stm32f10x_fsmc.c、stm32f10x_gpio.c、stm32f10x_i2c.c、stm32f10x_iwdg.c、stm32f10x_pwr.c、stm32f10x_rcc.c、stm32f10x_rtc.c、stm32f10x_sdio.c、stm32f10x_spi.c、stm32f10x_tim.c、stm32f10x_usart.c、stm32f10x_wwdg.c庫函數頭文件6PRJMyPrj.uvprojx、MyPrj.uvoptx、MyPrj.uvguix.Administrator工程文件KeilMDK創建7PRJ\RTE其下有四個子目錄RTOS、Device、_Target_1、_STM32F103RCT6運行環境組件頭文件KeilMDK創建8PRJ\RTE\Device\STM32F103RCstartup_stm32f10x_hd.s、system_stm32f10x.c、RTE_Device.hCPU相關文件KeilMDK創建9PRJ\RTE\RTOSapp_cfg.h、os_cfg.hμC/OS-II配置文件KeilMDK創建10PRJ\ListingsMyPrj.map等列表文件KeilMDK創建11PRJ\ObjectsMyPrj.axf、MyPrj.hex等目標文件KeilMDK創建工程PRJ28文件結構如圖所示工程PRJ28的文件目錄結構如表所示任務ID號優先級號任務名堆棧大小(字)執行頻率(Hz)15Task01200126Task022001/237Task03200148Task042001/259Task052001/4610Task062001/80xFFFD61定時器任務200100xFFFE62統計任務200100xFFFF63空閑任務200始終就緒任務ID號優先級號任務名堆棧大小(字)執行頻率(Hz)工程PRJ28的執行流程如圖所示11.3統計任務實例統計任務可用于統計微控制器的CPU使用率以及各個任務(包括它本身)的堆棧使用情況,下面的工程PRJ29介紹了統計任務的使用方法。代碼:代碼:工程PRJ29運行時在LCD屏上的顯示結果如圖所示:11.4系統定時器函數原型功能OS_TMR*OSTmrCreate(INT32Udly,INT32Uperiod,INT8Uopt,OS_TMR_CALLBACKcallback,void*callback_arg,INT8U*pname,INT8U*perr);創建一個定時器。定時器可以周期性連續運行,或僅運行一次,當定時計數減到0后,將執行回調函數(callback),callback函數可以向任務發送信號量,也可以執行其他功能,要求這個函數應盡可能地短小。必須調用OSTmrStart啟動定時器。對于僅運行一次的定時器,調用OSTmrStart可再次啟動它,調用OSTmrDel可刪除它(可在回調函數中刪除它)BOOLEANOSTrmStart(OS_TMR*ptmr,INT8U*perr);啟動定時器減計數voidOSTmrStop(OS_TMR*ptmr,INT8Uopt,void*callback_arg,INT8U*perr);停止定時器減計數,停止定時器時可以調用回調函數或向回調函數傳遞新的參數。如果調用該函數時定時器已經停止了,則回調函數不會被調用INT32UOSTmrRemainGet(OS_TMR*ptmr,INT8U*perr);得到定時器的當前計數值(以時鐘節拍為單位)INT8UOSTmrStateGet(OS_T

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論