




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十章
μC/OS-II系統與移植目錄μC/OS-II系統移植μC/OS-II系統結構與配置μC/OS-II系統任務本章小結本章將介紹嵌入式實時操作系統μC/OS-II的系統結構及其在STM32F103RCT6學習板上的移植工程,并將闡述μC/OS-II系統配置與裁剪的方法。μC/OS-II是美國Labrosse先生推出的開源嵌入式實時操作系統,具有體積小、實時性強和移植能力強的特點。μC/OS-II可以移植到幾乎所有的ARM微控制器上,那些具有一定RAM空間(最好是8kB以上)且具有堆棧操作的微控制器均可成功移植。STM32F103RCT6片上RAM空間為48kB,可以很好地支持μC/OS-II系統。110.1μC/OS-II系統移植23在工程PRJ26的基礎上,新建工程“PRJ27”,保存在“D:\STM32F103RCT6PRJ\PRJ27”目錄下,此時的工程PRJ27與工程PRJ26完全相同。現在,進行下面的設計工作:(1)在工程PRJ27工作窗口中,單擊“ManageRun-TimeEnvironment”快捷鈕(“管理運行環境”),或者單擊菜單“Project|Manage|Run-TimeEnvironment...”,將彈出如右圖所示對話框。μC/OS-II系統移植4然后,單擊“OK”按鈕進入下圖所示界面。μC/OS-II系統移植5(2)在上圖中左側的工程管理器中,鼠標右鍵單擊“STM32F103RCT6”,在其彈出菜單中單擊“OptionsforTarget‘STM32F103RCT6’...Alt+F7”,進入下圖所示對話框,在下圖中選擇“C/C++”選項卡。μC/OS-II系統移植6(3)修改系統啟動文件startup_stm32f10x_hd.s,如下面的程序段所示。μC/OS-II系統移植7(4)修改文件app_cfg.h,如下面的程序段所示。(5)修改includes.h文件,如下面的程序段所示。μC/OS-II系統移植8(6)修改main.c文件,如下面的程序段所示。μC/OS-II系統移植9(7)新建文件strfun.c和strfun.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ27\USER”下,其代碼如下面的程序段所示。μC/OS-II系統移植10μC/OS-II系統移植11(8)新建文件task01.c和task01.h,保存在“D:\STM32F103RCT6PRJ\PRJ27\USER”目錄下,其代碼如下面的程序段所示。μC/OS-II系統移植12(9)修改exti.c文件中如下面的程序段所示的部分。μC/OS-II系統移植13(10)修改os_cfg.h文件中宏常量“OS_TMR_EN”的值,由0u修改為1u(位于文件的第139行),表示打開系統定時器模塊。第10.2節中將詳細介紹os_cfg.h文件。(11)將文件strfun.c和task01.c添加到工程管理器的“USER”分組下。(12)在bsp.c文件中注釋掉SysTickInit函數,即“//SysTickInit();”,工程中的systick.c和systick.h文件可以從工程中移除,這是因為系統節拍定時器專用于μC/OS-II操作系統。工程PRJ27是一個完整的工程,在STM32F103RCT6學習板上運行時,LED燈D11每隔1秒閃爍一次(注意:LED燈D9不閃爍,D10的閃爍由通用定時器2控制),在LCD屏的左上角顯示一行信息“uC/OS-IIVersion:2.9211.”(如果按下按鍵S18或S19蜂鳴器將啟動或關閉),如右圖所示。μC/OS-II系統移植10.2μC/OS-II系統結構與配置1415本書使用的μC/OS-II嵌入式實時操作系統,版本號為V2.92.11,結合工程PRJ27工作窗口圖可知,μC/OS-II共有16個系統文件(包括ucos_ii.h),如下表所示。μC/OS-II系統結構與配置16如果重點關注μC/OS-II系統的應用程序設計,可以只關心系統配置文件os_cfg.h,通過該文件可對μC/OS-II系統進行裁剪,該文件內容如下面的程序段所示。μC/OS-II系統結構與配置17μC/OS-II系統結構與配置18μC/OS-II系統結構與配置19μC/OS-II系統結構與配置20μC/OS-II系統結構與配置下面將os_cfg.h文件中常用的配置宏列在下表中。10.3μC/OS-II系統任務2122μC/OS-II系統任務μC/OS-II具有3個系統任務,即空閑任務、統計任務和定時器任務(注意,定時器任務在一些書中被稱為用戶任務,本書中將定時器任務稱為系統任務)。系統任務由μC/OS-II內核創建;除了系統任務外,其余任務由用戶創建,實現所需要的功能,均被稱為用戶任務。23空閑任務空閑任務是當所有其他任務均沒有使用CPU時,空閑任務占用CPU,因此,空閑任務是μC/OS-II中優先級最低的任務,其優先級號固定為OS_LOWEST_PRIO。空閑任務實現的工作為:每執行一次空閑任務,系統全局變量OSIdleCtr自增1;每次空閑任務的執行都將調用一次鉤子函數OSTaskIdleHook,用戶可以通過該鉤子函數擴展功能,例如使STM32F103RCT6進入低功耗模式。24統計任務統計任務用于統計CPU的使用率和各個任務的堆棧使用情況。統計任務的優先級號固定為OS_LOWEST_PRIO-1,僅比空閑任務的優先級高,對于μC/OS-IIV2.92.11而言,每0.1秒執行統計任務一次,將統計這段時間內空閑任務運行的時間,用OSIdleCtr表示,用該數值與0.1秒時間內只有空閑任務運行時的OSIdleCtr的值(用OSIdleCtrMax表示,在OSStatInit函數中統計到該值)相比,即得到這0.1秒時間內的CPU空閑率,1減去CPU空閑率的差為CPU使用率。當需要查詢某個任務的堆棧使用情況時,必須在創建這個任務時把它的堆棧內容全部清0,這樣,統計任務在統計每個任務的堆棧使用情況時,統計其堆棧中不為0的元素個數,該值為其堆棧使用的長度,堆棧總長度減去前者即得到該任務的空閑堆棧空間長度。25統計任務當程序段10-10的第44行OS_TASK_STAT_EN為1時,則開啟μC/OS-II統計任務功能。此時需要在第一個用戶任務的無限循環體前面插入語句“OSStatInit();”以初始化統計任務,并且要求使用函數OSTaskCreateExt創建用戶任務,最后一個參數使用“OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR”。統計任務可以統計各個任務的CPU占用率以及其堆棧占用情況。一般地,在第一個用戶任務中顯示CPU使用率和各個任務堆棧占用情況,CPU使用率保存在一個系統全局變量OSCPUUsage中,其值為0~100的整數,如果為3,則表示CPU使用率為3%。26統計任務當查詢某個任務的堆棧使用情況時,需要定義結構體變量類型OS_STK_DATA的變量,然后調用函數OSTaskStkChk,該函數有兩個參數,第一個為任務優先級號,第二個為指向OS_STK_DATA型結構體變量的指針。例如,OS_STK_DATAStkData;OSTaskStkChk(2,&StkData);則將優先級號為2的任務的堆棧使用情況保存在StkData變量中,其中,StkData.OSFree為該任務空閑的堆棧大小,StkData.OSUsed為該任務使用的堆棧大小,單位為字節。27定時器任務定時器任務由μC/OS-II系統提供,用于創建軟定時器(或稱系統定時器)。相對于STM32F103RCT6芯片的硬件定時器而言,軟定時器是指μC/OS-II系統提供的軟件定時器組件,具有和硬件定時器相似的定時功能。根據表10-2所示的配置方式,在后續的工程中將定時器任務的優先級號配置為61。程序段10-10中第105行宏定義了常量OS_TMR_CFG_MAX為16,表示最多可以創建16個軟定時器。μC/OS-II定時器任務可管理的定時器數量僅受定時器數據類型的限制,對于16位無符號整型而言,可管理多達65536個定時器。10.4本章小結2829本章小結本章詳細討論了μC/OS-II系統移植到STM32F103RCT6硬件平臺的工程框架,并闡述了μC/OS-II系統的文件結構和裁剪系統內核組件的配置文件內容,最后,介紹了μC/OS-II系統的三個系統任務及其作用。本章給出的工程PRJ27是一個完整的可執行工程,但是只有一個用戶任務,下一章將在工程PRJ27的基礎上,添加更多的用戶任務,并深入闡述多任務的工程實例的工作原理。thankyouARMCortex-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_T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 珠寶貨品采購合同協議
- 特約代理商合同協議
- 物資搬遷協議合同書范本
- 瑜伽館次卡合同協議
- 牽頭方合同協議
- 現金混凝土合同協議
- 電子檔車庫轉讓合同協議
- 豬頭肉采購合同協議
- 電纜遷移設計合同協議
- 瓷磚展架采購合同協議
- 亞低溫的治療與護理
- 危險化學品企業設備完整性 第2部分 技術實施指南 編制說明
- 防高墜自查自糾臺賬
- GB/T 4437.1-2023鋁及鋁合金熱擠壓管第1部分:無縫圓管
- 市政工程消耗量定額 zya1-31-2015
- 《高等數學下冊》(資料全集)
- 奢侈品買賣協議書范本
- 抖音賬號運營服務投標方案
- 《新大學英語·跨文化交際閱讀》Values Behind Sayings
- 風電項目開發前期工作流程
- 勞動保障部《關于勞動合同制職工工齡計算問題的復函》
評論
0/150
提交評論