天天看點

ucosIII OS_CFG.H 解釋B-1 μC/OS-III FEATURES (OS_CFG.H)

想要對ucos 的功能進行裁剪,必不可少的需要了解OS_CFG.H 檔案。這裡對官方的《ucosIII User's Manual.pdf》文檔,

B-1 μC/OS-III FEATURES (OS_CFG.H)章節,進行簡要的翻譯,如有歧義,以原文為主。

B-1 μC/OS-III FEATURES (OS_CFG.H)

ucosIII OS_CFG.H 解釋B-1 μC/OS-III FEATURES (OS_CFG.H)

相關宏定義說明如下:

OS_CFG_APP_HOOKS_EN:

當#define設定為1時,說明μC/OS-III的鈎子函數(介入函數)可以調用使用者定義的鈎子函數。進而實作μC/OS-III自身的功能能夠擴充,通過使用者程式代碼實作。

當然,如果根本不打算擴充μC/OS-III鈎子函數功能,則将該宏設定為0,來節省記憶體(例如,函數指針的開銷)。

OS_CFG_ARG_CHK_EN:

該宏決定使用者是否希望對μC/OS-III的大部分函數執行參數檢查,如確定傳遞傳遞給函數的指針非NULL、參數值在允許的範圍内、選項是有效的等。

當設定為0時,将禁止參數檢查功能,相應的節省核心的代碼空間和處理時間。

統計發現,μC/OS-III為超過40個函數提供參數檢查功能。是以,禁用此選項将節約幾百位元組的代碼空間。

應用中,可以考慮調試階段開啟此選項,項目的後期釋出階段禁止該選項。

OS_CFG_CALLED_FROM_ISR_CHK_EN:

決定核心是否進行檢查以確定大多數的函數沒有被ISR調用。換句話說,大多數μC/OS-III函數應該隻被任務級代碼調用,除了“POST”類的發送函數(它們可以被ISR調用)。

μC/OS-III為大約50個函數提供此項檢查。是以,禁用此選項,将節約幾百位元組的代碼空間。

應用中,可以考慮調試階段開啟此選項,項目的後期釋出階段禁止該選項。

OS_CFG_DBG_EN:

當這個宏設定為1時,os_dbg.c中的ROM常量将被添加以幫助支援核心調試器。具體來說,調試器将可以通過查詢一系列所謂的ROM變量,來獲知編譯時的選項。例如,調試器可以找出OS_TCB的尺寸大小、μC/OS-III的版本号、一個事件标志組的尺寸(OS_FLAG_GRP)等。

OS_CFG_FLAG_EN:

設定為1時,允許生成事件标志服務的代碼和資料結構,即開啟了事件标志服務功能。

如果設定為0,那麼無需再開啟/禁止該檔案中任何名稱為OS_CFG_FLAG_xxx的#define常量。

應用不需要相關服務時,可以禁止該功能,以此來減少代碼和資料的空間需求。

OS_CFG_FLAG_DEL_EN:

決定是否生成OSFlagDel()函數代碼。

OS_CFG_FLAG_MODE_CLR_EN:

是否生成代碼用于等待事件标志變為0.通常是等待事件标志被置為1。但是使用者也可能需要等待事件标志的清零,在這種情況下,需要開啟此選項。

OS_CFG_FLAG_PEND_ABORT_EN:

OSFlagPendAbort().函數是否生成。

OS_CFG_ISR_POST_DEFERRED_EN

當置為1時,将減小中斷延遲,因為在μC/OS-III的大多數臨界段代碼中将不再禁用中斷。相反,在這些臨界段代碼執行期間,排程器将被鎖定。該宏設定為1的好處是中斷延遲小,但是,ISR到任務的響應時間會變得略長。如果啟用了以下服務,建議設定改為1,因為若設定它為0,則中斷延遲有可能會變得無法接受的長:

ucosIII OS_CFG.H 解釋B-1 μC/OS-III FEATURES (OS_CFG.H)

需要選擇的是:

OS_CFG_ISR_POST_DEFERRED_EN set to 1

中斷延遲短,ISR—任務響應長。

OS_CFG_ISR_POST_DEFERRED_EN set to 0

中斷延遲(見上表),ISR-任務響應短。

OS_CFG_MEM_EN:

決定是否生成分區存儲管理代碼和相關的資料結構。這讓使用者在不使用存儲分區時,減少代碼和資料的空間需求。

OS_CFG_MUTEX_EN:

決定是否開啟互斥信号量服務的代碼和資料結構。

同其他的核心服務開關一樣,OS_CFG_MUTEX_EN被設定為0,那麼無需再開啟/禁止本系統中任何名為OS_CFG_MUTEX_XXX 的#define常量。

OS_CFG_MUTEX_DEL_EN:

是否生成OSMutexDel().代碼。

OS_CFG_MUTEX_PEND_ABORT_EN:

是否生成OSMutexPendAbort().代碼

OS_CFG_OBJ_TYPE_CHK_EN:

決定是否讓大多數的μC/OS-III函數檢查其操作的核心對象類型是否正确。換言之,如果希望發送一個信号量,那麼使用者傳遞的是否确實是一個信号量,或者錯誤的使用了其他類型的核心對象呢?

μC/OS-III的核心對象檢查大約有30處,禁用該選項,将節約幾百位元組的代碼空間以及部分的處理時間。

建議調試階段開啟該選項;釋放代碼時關閉該檢查項。

OS_CFG_PEND_MULTI_EN:

決定代碼是否支援等待多個事件(如信号量或消息隊列),啟用(1)或禁用(0)。

OS_CFG_PRIO_MAX:

指定應用程式可用優先級的最大數量。将該宏指定為剛好夠使用者計劃使用的優先級數量,将減少μC/OS-III所需的RAM量。

在μC/OS-III.中,如果OS_PRIO資料類型為CPU_INT08U,則任務優先級可以從0(最高優先級)到最大255(最低優先級)。然而在μC/OS-III中,對于優先級的數量實際上沒有限制。

具體來說,如果定義OS_PRIO資料類型為CPU_INT16U,則任務優先級将多達65536個。應該總是設定OS_CFG_PRIO_MAX為8的倍數(如8,16,32,6,4,128,256等),設定的優先級數量越多,μC/OS-III.的RAM開銷越大。

另,μC/OS-III.為自身保留了優先級(OS_CFG_PRIO_MAX-2)和(OS_CFG_PRIO_MAX-1);前者用于空閑任務OS_IdleTask()。此外,不要将優先級0用于任何應用程式沒因為它是μC/OS-III.保留作為ISR處理任務的。是以,應用程式的優先級可以在2到(OS_CFG_PRIO_MAX-3)之間(含)取值。

OS_CFG_Q_EN:

決定是否生成消息隊列服務的代碼和資料結構。

同其他的核心服務開關一樣,OS_CFG_Q_EN被設定為0,那麼無需再開啟/禁止本系統中任何名為OS_CFG_Q_XXX 的#define常量。

OS_CFG_Q_DEL_EN:

OS_CFG_Q_FLUSH_EN:

OS_CFG_Q_PEND_ABORT_EN:

OS_CFG_SCHED_LOCK_TIME_MEAS_EN:

決定是否生成 測量排程器被鎖定時間(measure the amount of time the scheduler is locked) 的代碼。這主要用于确定任務延遲。

OS_CFG_SCHED_ROUND_ROBIN_EN:

決定是否生成時間片輪轉排程代碼。

OS_CFG_SEM_EN:

信号量相關的服務工能開關宏

OS_CFG_SEM_DEL_EN:

OS_CFG_SEM_PEND_ABORT_EN:

OS_CFG_SEM_SET_EN:

OS_CFG_STAT_TASK_EN:

決定是否啟用μC/OS-III.的統計任務OS_StatTask(),以及他的初始化函數void OS_StatTaskInit ()。

OS_StatTask()計算應用程式的CPU使用率、每個任務的堆棧開銷、每個任務在運作時的CPU使用率等。

當啟用時,OS_StatTask()按照OS_CFG_TICK_RATE_HZ(see os_cfg_app.h)的頻率執行。計算OSStatTaskCPUUsage的值時應該注意,它是一個應用程式CPU使用率的百分比值。OS_StatTask()在每次執行時調用OSStatTaskHook()鈎子函數,進而使用者可以通過它添加自定義的統計功能。統計任務的詳細資訊,參見os_stat.c。OS_StatTask()的優先級是應用程式中可配置的(see os_cfg_app.h)

如果OS_CFG_STAT_TASK_STK_CHK_EN被設為1,則OS_StatTask()還将計算每個任務的堆棧使用情況。此時OS_StatTask()每次執行時,将為每個任務調用OSTaskStkChk(),并将結果放置在該任務的TCB中。任務TCB的.StkFree 和.StkUsed域分别代表剩餘空間(位元組機關)已用空間(位元組機關)。

如果OS_CFG_STAT_TASK_STK_CHK_EN被設為0,則統計任務用到的所有變量都将沒有聲明(見os.h),當然也将減少核心的RAM開銷。

OS_CFG_STAT_TASK_STK_CHK_EN:

決定統計任務是否為每個任務調用OSTaskStkChk()堆棧監測。為了做到這一點,需要将OS_CFG_STAT_TASK_EN設定為1(即統計任務需要開啟)。當然,可以在某個任務中調用OSTaskStkChk()函數以獲得這個任務的此類資訊。

OS_CFG_STK_SIZE_MIN:

定義各個任務的最小堆棧大小(以CPU_STK為單元)。這為μC/OS-III在每個任務建立時提供了足夠的堆棧空間。假設一個處理器包含16個32位的寄存器。同樣,假設CPU_STK被聲明為CPU_INT32U類型,那麼最低限度,設定OS_CFG_STK_SIZE_MIN為16.然而,這将是很不明智的,因為可能無法容納存儲局部變量、函數調用的傳回、可能的ISR嵌套。

請參閱處理器的“移植”來看看如何設定這個最小值。注意,這是一個保障,來確定有足夠的任務堆棧空間。

OS_CFG_TASK_CHANGE_PRIO_EN:

決定是否生成OSTaskChangePrio()函數。

OS_CFG_TASK_DEL_EN:

OS_CFG_TASK_Q_EN:

決定是否生成直接向/從任務和ISR發送和接收消息的OSTaskQXXX()函數代碼。

直接向一個任務發送消息回避通過消息隊列發送消息更有效率一些,因為不再有與消息關聯的等待表。

OS_CFG_TASK_Q_PEND_ABORT_EN:

OS_CFG_TASK_PROFILE_EN:

決定是否允許在每個任務的OS_TCB中配置設定變量來儲存各個任務的性能資料。如果開啟,則每個任務将有一些變量來跟蹤任務切換的次數、任務的執行時間、任務相對其他任務的CPU使用率等。

這項功能提供的資訊對于調試非常有用,但需要額外的RAM,軟體釋放的時候關掉就好啦。

OS_CFG_TASK_REG_TBL_SIZE:

該宏允許各個任務擁有任務上下文變量(This constant allows each task to have task context variables)。可以使用任務變量存儲諸如“errno”、任務辨別和其他的 任務相關的數值等元素。任務擁有的變量數目是由這個常量設定的。每個任務都有一個唯一的辨別,從0到(OS_CFG_TASK_REG_TBL_SIZE-1)。此外。每個任務變量被聲明為OS_REG資料類型(見os_type.h)。如果OS_REG被定義為CPU_INT32U,那麼此表中所有的變量都為這種類型。

OS_CFG_TASK_SEM_PEND_ABORT_EN:

Include code for OSTaskSemPendAbort()

OS_CFG_TASK_SUSPEND_EN:

決定是否包含OSTaskSuspend() and OSTaskResume()實作代碼,。任務挂起和任務恢複功能在調試時是非常有用的,特别是可以在運作時通過一個終端借口調用這些函數。。。

OS_CFG_TIME_DLY_HMSM_EN:

Include code for OSTimeDlyHMSM(),用于将一個任務延遲指定的(時,分,秒和毫秒)。

OS_CFG_TIME_DLY_RESUME_EN:

Include code for OSTimeDlyResume(),用于立刻恢複被任務延遲函數挂起的任務。

OS_CFG_TLS_TBL_SIZE:

決定數組的大小:.TLS_Tbl[],在每個任務的OS_TCB。

OS_CFG_TLS_TBL_SIZE為TLS(thread-local storage)服務,當OS_CFG_TLS_TBL_SIZE大于0時開啟,等于0時禁用。TLS特性在V3.03.00.版本加入。

OS_CFG_TMR_EN:

決定是否生成定時器管理服務的代碼。

OS_CFG_TMR_DEL_EN:

Enable (1) or Disable (0) code generation for OSTmrDel()

以上為OS_CFG.H檔案相關宏定義的解釋。。。

繼續閱讀