1. 程式人生 > >uC/OS-II 一些函式簡介

uC/OS-II 一些函式簡介

獲得更多資料歡迎進入我的網站或者 csdn或者部落格園

以前搞硬體的經驗,最近突然翻出來了。分享給大家;主要講解uC/OS-II常用函式;雖說現在轉行軟體了,但是感覺之前搞硬體的經驗還真是很有用對於理解底層等很有幫助。比如這裡對於作業系統還是有點用的;好了,開始嘮叨下。

ucos ii介紹

μC/OS-II由Micrium公司提供,是一個可移植、可固化的、可裁剪的、佔先式多工實時核心,它適用於多種微處理器,微控制器和數字處理晶片(已經移植到超過100種以上的微處理器應用中)。同時,該系統原始碼開放、整潔、一致,註釋詳盡,適合系統開發。

常用函式介紹:

OSInit()初始化函式

在uC/OS II的學習中,OSInit(OS_CORE.C )(函式原型位於);是一個重要的函式,它在OS應用中的main()函式中首先被呼叫,是OS執行的第一個函式,它完成各初始變數的初始化。主要工作:
OSInitHookBegin(); /* 呼叫使用者特定的初始化程式碼(通過一個介面函式實現使用者要求的外掛式進入系統中)*/
OS_InitMisc(); /* 初始化變數*/
OS_InitRdyList(); /* 初始化就緒列表*/
OS_InitTCBList(); /* 初始化OS_TCB空閒列表*/
OS_InitEventList(); /* 初始化OS_EVENT空閒列表*/
OS_InitTaskIdle(); /建立空閒任務

/
程式註釋詳解:

void  OSInit (void)
{
#if OS_TASK_CREATE_EXT_EN > 0u
#if defined(OS_TLS_TBL_SIZE) && (OS_TLS_TBL_SIZE > 0u)
    INT8U  err;
#endif
#endif
    OSInitHookBegin();                              /* 呼叫使用者特定的初始化程式碼(通過一個介面函式實現使用者要求的外掛式進入系統中)*/
    OS_InitMisc();                                              /* 初始化變數*/
/* Initialize miscellaneous variables */ OS_InitRdyList(); /* 初始化就緒列表*/ /* Initialize the Ready List */ OS_InitTCBList(); /* 初始化OS_TCB空閒列表*/ /* Initialize the free list of OS_TCBs */ OS_InitEventList(); /* 初始化OS_EVENT空閒列表*/ /* Initialize the free list of OS_EVENTs */ #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u) OS_FlagInit(); /* 初始化事件標誌結構*/ /* Initialize the event flag structures */ #endif #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u) OS_MemInit(); /* 初始化記憶體管理器*/ /* Initialize the memory manager */ #endif #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u) OS_QInit(); /* 初始化訊息佇列結構*/ /* Initialize the message queue structures */ #endif #if OS_TASK_CREATE_EXT_EN > 0u #if defined(OS_TLS_TBL_SIZE) && (OS_TLS_TBL_SIZE > 0u) OS_TLS_Init(&err); /* 建立任務前初始化TLS*/ /* Initialize TLS, before creating tasks */ if (err != OS_ERR_NONE) { return; } #endif #endif OS_InitTaskIdle(); /* 建立空閒任務(無條件)Create the Idle Task */ #if OS_TASK_STAT_EN > 0u OS_InitTaskStat(); /* 建立統計任務*/ /* Create the Statistic Task */ #endif #if OS_TMR_EN > 0u OSTmr_Init(); /* 初始化時間管理器*/ /* Initialize the Timer Manager */ #endif OSInitHookEnd(); /*呼叫使用者特定的初始化程式碼*/ #if OS_DEBUG_EN > 0u OSDebugInit(); #endif }

任務函式相關:

OSTaskCreate()任務建立函式

1、主要作用:建立一個新任務。任務的建立可以在多工環境啟動之前,也可以在正在執行的任務中建立。中斷處理程式中不能建立任務;注意,ISR中禁止建立任務,一個任務必須為無限迴圈結構。
2、函式原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
3、引數說明:
void (*task)(void *pd):指向任務程式碼首地址的指標。
void *pdata:指向一個數據結構,該結構用來在建立任務時向任務傳遞引數。
OS_STK *ptos: 指向堆疊任務棧頂的指標
INT8U prio:任務優先順序
4、返回值介紹:
OS_NO_ERR:函式呼叫成功。

OS_PRIO_EXIST:具有該優先順序的任務已經存在。

OS_PRIO_INVALID:引數指定的優先順序大於OS_LOWEST_PRIO。

OS_NO_MORE_TCB:系統中沒有OS_TCB可以分配給任務了。

5、函式主體在os_task.c中

OSTaskCreateExt

1、主要作用:建立一個新任務。與OSTaskCreate()不同的是,OSTaskCreateExt()允許使用者設定更多的細節內容。任務的建立可以在多工環境啟動之前,也可以在正在執行的任務中建立,但中斷處理程式中不能建立新任務。,且不
2、函式原型:NT8U OSTaskCreateExt (void (*task)(void *pd),void *pdata, OS_STK *ptos,INT8U prio ,INT16U id, OS_STK *pbos,INT32U stk_size,void *pext,INT16U opt)
3、引數說明:
void (*task)(void *pd):指向任務程式碼首地址的指標。
void *pdata:指向一個數據結構,該結構用來在建立任務時向任務傳遞引數。
OS_STK *ptos: 指向堆疊任務棧頂的指標
INT8U prio:任務優先順序
INT16U id: 任務ID,2.52版本,無實際作用,保留作為擴充套件用
OS_STK *pbos: 指向堆疊底部的指標,用於OSTaskStkChk()函式
INT32U stk_size:指定任務堆疊的大小,由OS_STK型別決定
void *pext:定義資料結構的指標,作為TCB的擴充套件
INT16U opt) :存放於任務操作相關的資訊,詳見uCOS-II.H
4、返回值說明:
OS_NO_ERR:函式呼叫成功。

OS_PRIO_EXIST:具有該優先順序的任務已經存在。

OS_PRIO_INVALID:引數指定的優先順序大於OS_LOWEST_PRIO。

OS_NO_MORE_TCB:系統中沒有OS_TCB可以分配給任務了。

5、函式主體在os_task.c中

OSTaskSuspend()任務掛起:

1、主要作用: 無條件掛起一個任務。呼叫此函式的任務也可以傳遞引數 OS_PRIO_SELF,掛起呼叫任務本身。當前任務掛起後,只有其他任務才能喚醒被掛起的任務。任務掛起後,系統會重新進行任務排程,執行下一個優先順序最高的就緒任務。喚醒掛起任務需要呼叫函式OSTaskResume()。任務的掛起是可以疊加到其他操作上的。例如,任務被掛起時正在進行延時操作,那麼任務的喚醒就需要兩個條件:延時的結束以及其他任務的喚醒操作。又如,任務被掛起時正在等待訊號量,當任務從訊號量的等待對列中清除後也不能立即執行,而必須等到被喚醒後。
2、函式原型:INT8U OSTaskSuspend(INT8U prio);
3、引數說明:prio為指定要獲取掛起的任務優先順序,也可以指定引數 OS_PRIO_SELF,掛起任務本身。此時,下一個優先順序最高的就緒任務將執行。
4、返回值說明:
OS_NO_ERR:函式呼叫成功。
OS_TASK_SUSPEND_IDLE:試圖掛起μC/OS-II中的空閒任務(Idle task)。此為非法操作。
OS_PRIO_INVALID:引數指定的優先順序大於 OS_LOWEST_PRIO 或沒有設定 OS_PRIO_SELF 的值。
OS_TASK_SUSPEND_PRIO:要掛起的任務不存在。
5、函式主體在os_task.c中

OSTaskResume()喚醒任務

1、主要作用: 喚醒一個用 OSTaskSuspend() 函式掛起的任務。OSTaskResume() 也是唯一能“解掛”掛起任務的函式。
2、函式原型:INT8U OSTaskResume(INT8U prio);
3、引數說明:prio指定要喚醒任務的優先順序。
4、返回值說明:
OS_NO_ERR:函式呼叫成功。
OS_TASK_RESUME_PRIO:要喚醒的任務不存在
OS_TASK_NOT_SUSPENDED:要喚醒的任務不在掛起狀態。
OS_PRIO_INVALID:引數指定的優先順序大於或等於OS_LOWEST_PRIO。
5、函式主體在os_task.c中

時間相關的函式

OSTimeDly()延時節拍函式

1、主要作用:呼叫該函式的任務將自己延時一段時間並執行一次任務排程,一旦規定的延時時間完成或有其它的任務通過呼叫OSTimeDlyResume()取消了延時,呼叫OSTimeDly()函式的任務馬上進入就緒狀態(前提是先將任務排程後執行的任務執行到程式尾,且呼叫OSTimeDly的任務此時優先順序最高)。
2、函式原型:void OSTimeDly (INT16U ticks);
3、引數說明:ticks為需要延時的時鐘節拍數;
4、返回值:無
5、函式主體在os_time.c中

OSTimeDlyHMSM()系統延時函式

1、主要作用:函式是以小時(H)、分(M)、秒(S)和毫秒(m)四個引數來定義延時時間的,函式在內部把這些引數轉換為時鐘節拍,再通過單次或多次呼叫OSTimeDly()進行延時和任務排程,所以延時原理和呼叫延時函式OSTimeDly()是一樣的。呼叫 OSTimeDlyHMSM() 後,如果延時時間不為0,系統將立即進行任務排程。
2、函式原型:INT8U OSTimeDlyHMSM (INT8U hours,INT8U minutes,INT8U seconds,INT16U milli);
3、引數說明:
hours 為延時小時數,範圍從0-255。
minutes 為延時分鐘數,範圍從0-59
seconds 為延時秒數,範圍從0-59
milli 為延時毫秒數,範圍從0-999
4、返回值說明:
OS_NO_ERR:函式呼叫成功。
OS_TIME_INVALID_MINUTES:引數錯誤,分鐘數大於59。
OS_TIME_INVALID_SECONDS:引數錯誤,秒數大於59。
OS_TIME_INVALID_MILLI:引數錯誤,毫秒數大於999。
OS_TIME_ZERO_DLY:四個引數全為0。
5、函式主體在os_time.c中

OSTimeDlyResume()延時恢復函式

1、主要作用:任務在延時之後,進入阻塞態。當延時時間到了就從阻塞態恢復到就緒態,可以被作業系統排程執行。但是,並非回到就緒態就只有這麼一種可能,因為即便任務的延時時間沒到,還是可以通過函式OSTimeDlyResume恢復該任務到就緒態的。另外,OSTimeDlyResume也不僅僅能恢復使用OSTimeDly或OSTimeDlyHMSM而延時的任務。對於因等待事件發生而阻塞的,並且設定了超時(timeout)時間的任務,也可以使用OSTimeDlyResume來恢復。對這些任務使用了OSTimeDlyResume,就好像已經等待超時了一樣。但是,對於採用OSTaskSuspend掛起的任務,是不允許採用OSTimeDlyResume來恢復的。
2、函式原型:INT8U OSTimeDlyResume (INT8U prio)
3.引數說明:prio 被恢復任務的優先順序
4、返回值:
OS_ERR_TASK_NOT_EXIST:任務優先順序指標表中沒有此任務
OS_NO_ERR:函式呼叫成功。
OS_ERR_PRIO_INVALID:引數指定的優先順序大於或等於OS_LOWEST_PRIO。
OS_ERR_TIME_NOT_DLY:任務沒有被延時阻塞
5、函式主體在os_time.c中

訊號量相關函式:

如果我們想對一個公共資源進行互斥訪問,例如:如果我們想讓兩個任務Task1和Task2都可以呼叫Fun()函式,但不能同時呼叫,最好定義訊號量:Semp = OSSemCreate(1),同理在各自的任務中都需要呼叫OSSemPend(Semp,0,&err)請求此訊號量,如果可用,則呼叫Fun(),然後再用OSSemPost(Semp)釋放該訊號量。這裡就實現了一個資源的互斥訪問。
(注:初始化OSSemCreate(1),那麼一個任務中有OSSemPend,那麼可以執行,執行之後cnt==0,其他任務的OSSemPend無法獲得sem,只能等待,除非任務一有OSSemPost,使其cnt++,這樣其他任務的Pend可以執行。)
同理,如果一個任務要等待n個事件發生後才能執行,則應定義為Semp = OSSemCreate(n)。然後在這n個任務分別執行時呼叫OSSemPost(Semp),直到這n個事件均發生後,這個任務才能執行。
OSSemCreate(cnt)賦初始值cnt,OSSemPend一次,cnt– 一次,OSSemPost一次,cnt++一次。

下面對訊號量函式做簡要介紹:

OSSemCreate()建立訊號量函式

1、主要作用:該函式建立並初始化一個訊號量,訊號量的作用如下:
允許一個任務和其他任務或者中斷同步
取得裝置的使用權
標誌事件的發生
2、函式原型:OS_EVENT *OSSemCreate(INT16U value);
3、引數說明:value 引數是所建立的訊號量的初始值,可以取0到65535之間的任何值。
4、返回值:OSSemCreate() 函式返回指向分配給所建立的訊號量的控制塊的指標。如果沒有可用的控制塊,OSSemCreate() 函式返回空指標。
5、函式主體在os_sem.c中

OSSemPend()取得使用權函式

1、主要作用: 該函式用於任務試圖取得裝置的使用權、任務需要和其他任務或中斷同步、任務需要等待特定事件的發生的場合。如果任務呼叫OSSemPend() 函式時,訊號量的值大於零,OSSemPend() 函式遞減該值。如果呼叫時訊號量值等於零,OSSemPend() 函式將任務加入該訊號量的等待佇列。OSSemPend() 函式掛起當前任務直到其他的任務或中斷設定訊號量或超出等待的預期時間。如果在預期的時鐘節拍內訊號量被設定,μC/OS-Ⅱ預設讓最高優先順序的任務取得訊號量並回到就緒狀態。一個被OSTaskSuspend() 函式掛起的任務也可以接受訊號量,但這個任務將一直保持掛起狀態直到通過呼叫OSTaskResume() 函式恢復該任務的執行。
2、函式原型:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );
3、引數說明:
pevent 是指向訊號量的指標。該指標的值在建立該訊號量時可以得到。(參考OSSemCreate() 函式)。
timeout 允許一個任務在經過了指定數目的時鐘節拍後還沒有得到需要的訊號量時恢復就緒狀態。如果該值為零表示任務將持續地等待訊號量,最大的等待時間為65535個時鐘節拍。這個時間長度並不是非常嚴格的,可能存在一個時鐘節拍的誤差。
err 是指向包含錯誤碼的變數的指標,返回的錯誤碼可能為下述幾種:
OS_NO_ERR :訊號量不為零。

OS_TIMEOUT :訊號量沒有在指定數目的時鐘週期內被設定。

OS_ERR_PEND_ISR :從中斷呼叫該函式。雖然規定了不允許從中斷呼叫該函式,但μC/OS-Ⅱ仍然包含了檢測這種情況的功能。

OS_ERR_EVENT_TYPE :pevent 不是指向訊號量的指標。

4、返回值:無

5、函式主體在os_sem.c中

OSSemPost()使用權放棄函式

1、主要作用: 該函式用於設定指定的訊號量。如果指定的訊號量是零或大於零,OSSemPost() 函式遞增該訊號量的值並返回。如果有任何任務在等待該訊號量,則最高優先順序的任務將得到訊號量並進入就緒狀態。任務排程函式將進行任務排程,決定當前執行的任務是否仍然為最高優先順序的就緒任務。
2、函式原型:INT8U OSSemPost(OS_EVENT *pevent);
3、引數說明:pevent 是指向訊號量的指標。該指標的值在建立該訊號量時可以得到。(參考OSSemCreate() 函式)。
4、返回值:
OS_NO_ERR :訊號量被成功地設定

OS_SEM_OVF :訊號量的值溢位

OS_ERR_EVENT_TYPE :pevent 不是指向訊號量的指標

5、函式主體在os_sem.c中

訊息佇列函式

 訊息佇列是µC/OS-II中另一種通訊機制,它可以使一個任務或者中斷服務子程式向另一個任務傳送以指標方式定義的變數。因具體的應用有所不同,每個指標指向的資料結構變數也有所不同。為了使用µC/OS-II的訊息佇列功能,需要在OS_CFG.H 檔案中,將OS_Q_EN常數設定為1,並且通過常數OS_MAX_QS來決定µC/OS-II支援的最多訊息佇列數。

OSQCreate()建立訊息佇列函式

1、主要作用:該函式用於建立一個訊息佇列。任務或中斷可以通過訊息佇列向一個或多個任務傳送訊息。訊息的含義是和具體的應用密切相關的。
2、函式原型:OS_EVENT *OSQCreate (void **start, INT8U size);
3、引數說明:start 是訊息記憶體區的首地址,訊息記憶體區是一個指標陣列
size 是訊息記憶體區的大小。
4、返回值說明:OSQCreate() 函式返回一個指向訊息佇列控制塊的指標。如果沒有空閒的控制塊,OSQCreate() 函式返回空指標
5、函式主體在os_q.c中

OSQPend()任務等待訊息函式

1、主要作用: 該函式用於任務等待訊息。訊息通過中斷或任務傳送給需要的任務。訊息是一個指標變數,在不同的應用中訊息的具體含義不同。如果呼叫 OSQPend() 函式時佇列中已經存在訊息,那麼該訊息被返回給 OSQPend() 函式的呼叫者,該訊息同時從佇列中清除。如果呼叫 OSQPend() 函式時佇列中沒有訊息,OSQPend() 函式掛起呼叫任務直到得到訊息或超出定義的超時時間。如果同時有多個任務等待同一個訊息,μC/OS-Ⅱ預設最高優先順序的任務取得訊息。一個由 OSTaskSuspend() 函式掛起的任務也可以接受訊息,但這個任務將一直保持掛起狀態直到通過呼叫 OSTaskResume() 函式恢復任務的執行。
2、函式原型:void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
3、引數說明:pevent 是指向訊息佇列的指標,該指標的值在建立該佇列時可以得到。(參考 OSQCreate() 函式)。 timeout 允許一個任務以指定數目的時鐘節拍等待訊息。超時後如果還沒有得到訊息則恢復成就緒狀態。如果該值設定成零則表示任務將持續地等待訊息,最大的等待時間為65535個時鐘節拍。這個時間長度並不是非常嚴格的,可能存在一個時鐘節拍的誤差。
err 是指向包含錯誤碼的變數的指標。OSQPend() 函式返回的錯誤碼可能為下述幾種:

        * OS_NO_ERR :訊息被正確地接受。

        * OS_TIMEOUT :訊息沒有在指定的時鐘週期數內接收到訊息。

        * OS_ERR_PEND_ISR :從中斷呼叫該函式。雖然規定了不允許從中斷中呼叫該函式,但μC/OS-Ⅱ仍然包含了檢測這種情況的功能。

        * OS_ERR_EVENT_TYPE :pevent 不是指向訊息佇列的指標。

4、返回值說明:OSQPend() 函式返回取得的訊息並將 *err 置為 OS_NO_ERR。如果沒有在指定數目的時鐘節拍內接受到訊息,OSQPend() 函式返回空指標並將 *err 設定為 OS_TIMEOUT。
5、函式主體在os_q.c中

其他的訊息函式

  INT8U OSQPost (OS_EVENT *pevent, void *msg)
     傳送一個訊息到訊息佇列   FIFO模式   
 INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
     傳送一個訊息到訊息佇列   FIFO模式         
 void *OSQAccept (OS_EVENT *pevent)
     無等待地從訊息佇列中得到一個訊息 
 INT8U OSQFlush (OS_EVENT *pevent)
     清空一個訊息佇列
  INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
     查詢一個訊息佇列的當前狀態
使用訊息佇列的通常步驟為:
  1)定義指標:              OS_EVENT *proSQ
     定義指標陣列:          void  *start[4] 
  2) 在主程式中建立訊號列隊:*proSQ  = OSQCreate(start,4);      
  3)在任務中等待訊息列隊中得到訊息或者給訊息列隊傳送訊息

在ANSI C中可以用malloc()和free()兩個函式動態地分配記憶體和釋放記憶體。但是,在嵌入式實時作業系統中,多次這樣做會把原來很大的一塊連續記憶體區域,逐漸地分割成許多非常小而且彼此又不相鄰的記憶體區域,也就是記憶體碎片。由於這些碎片的大量存在,使得程式到後來連非常小的記憶體也分配不到。另外,由於記憶體管理演算法的原因,malloc()和free()函式執行時間是不確定的。
在μC/OS-II中,作業系統把連續的大塊記憶體按分割槽來管理。每個分割槽中包含有整數個大小相同的記憶體塊。利用這種機制,μC/OS-II 對malloc()和free()函式進行了改進,使得它們可以分配和釋放固定大小的記憶體塊。這樣一來,malloc()和free()函式的執行時間也是固定的了。
在一個系統中可以有多個記憶體分割槽。這樣,使用者的應用程式就可以從不同的記憶體分割槽中得到不同大小的記憶體塊。但是,特定的記憶體塊在釋放時必須重新放回它以前所屬於的記憶體分割槽。顯然,採用這樣的記憶體管理演算法,上面的記憶體碎片問題就得到了解決。
記憶體控制塊
為了便於記憶體的管理,在μC/OS-II中使用記憶體控制塊(memory control blocks)的資料結構來跟蹤每一個記憶體分割槽,系統中的每個記憶體分割槽都有它自己的記憶體控制塊。
記憶體控制塊的定義如下:
typedef struct {
void *OSMemAddr; //指向記憶體分割槽起始地址的指標
void *OSMemFreeList; //是指向下一個空閒記憶體控制塊或者下一個空閒的記憶體塊的指標
INT32U OSMemBlkSize; //是記憶體分割槽中記憶體塊的大小
INT32U OSMemNBlks; //記憶體分割槽中總的記憶體塊數量
INT32U OSMemNFree; //記憶體分割槽中當前可以得空閒記憶體塊數量
} OS_MEM;
如果要在μC/OS-II中使用記憶體管理,需要在OS_CFG.H檔案中將開關量OS_MEM_EN設定為1。這樣μC/OS-II 在啟動時就會對記憶體管理器進行初始化[由OSInit()呼叫OSMemInit()實現]。常數OS_MAX_MEM_PART(見檔案OS_CFG.H)定義了最大的記憶體分割槽數,該常數值最小應為2。

OSMemCreate()記憶體塊建立函式

1 主要作用: 該函式建立並初始化一個用於動態記憶體分配的區域,該記憶體區域包含指定數目的、大小確定的記憶體塊。應用可以動態申請這些記憶體塊並在用完後將其釋放回這個記憶體區域。該函式的返回值就是指向這個記憶體區域控制塊的指標,並作為OSMemGet(),OSMemPut(),OSMemQuery() 等相關呼叫的引數。

2函式原型:OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err );

3引數說明:addr 建立的記憶體區域的起始地址。可以使用靜態陣列或在系統初始化時使用 malloc() 函式來分配這個區域的空間。

nblks 記憶體塊的數目。每一個記憶體區域最少需要定義兩個記憶體塊。

blksize 每個記憶體塊的大小,最小應該能夠容納一個指標變數。

err 是指向包含錯誤碼的變數的指標。Err可能是如下幾種情況:

  • OS_NO_ERR :成功建立記憶體區域。

  • OS_MEM_INVALID_ADDR :非法地址,即地址為空指標。

    • OS_MEM_INVALID_PART :沒有空閒的記憶體區域。

    • OS_MEM_INVALID_BLKS :沒有為記憶體區域建立至少兩個記憶體塊。

    • OS_MEM_INVALID_SIZE :記憶體塊大小不足以容納一個指標變數。

4返回值:

OSMemCreate() 函式返回指向所建立的記憶體區域控制塊的指標。如果建立失敗,函式返回空指標。

OSMemGet()函式

1 主要作用: 該函式用於從記憶體區域分配一個記憶體塊。使用者程式必須知道所建立的記憶體塊的大小,並必須在使用完記憶體塊後釋放它。可以多次呼叫 OSMemGet() 函式。它的返回值就是指向所分配記憶體塊的指標,並作為 OSMemPut() 函式的引數。

2函式原型:void *OSMemGet(OS_MEM *pmem, INT8U *err);

3引數說明:pmem 是指向記憶體區域控制塊的指標,可以從 OSMemCreate() 函式的返回值中得到。

err 是指向包含錯誤碼的變數的指標。Err可能是如下情況:

  • OS_NO_ERR :成功得到一個記憶體塊。

  • OS_MEM_NO_FREE_BLKS :記憶體區域中已經沒有足夠的記憶體塊。

4返回值:

OSMemGet() 函式返回指向所分配記憶體塊的指標。如果沒有可分配的記憶體塊,OSMemGet() 函式返回空指標。

OSMemPut()

1 主要作用:該函式用於釋放一個記憶體塊,記憶體塊必須釋放回它原先所在的記憶體區域,否則會造成系統錯誤。

2函式原型:INT8U OSMemPut (OS_MEM *pmem, void *pblk);

3引數說明:pmem 是指向記憶體區域控制塊的指標,可以從 OSMemCreate() 函式的返回值中得到。

pblk 是指向將被釋放的記憶體塊的指標。

4返回值:

OSMemPut() 函式的返回值為下述之一:

  • OS_NO_ERR :成功釋放記憶體塊

  • OS_MEM_FULL :記憶體區域已滿,不能再接受更多釋放的記憶體塊。這種情況說明使用者程式出現了錯誤,釋放了多於用 OSMemGet() 函式得到的記憶體塊。

OSMemQuery()

1 主要作用:該函式用於得到記憶體區域的資訊。

2函式原型:INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);

3引數說明:pmem 是指向記憶體區域控制塊的指標,可以從 OSMemCreate() 函式的返回值中得到。

pdata 是一個指向 OS_MEM_DATA 資料結構的指標,該資料結構包含了以下的域:

void OSAddr; /* 指向記憶體區域起始地址的指標 */

void OSFreeList; /* 指向空閒記憶體塊列表起始地址的指標 */

INT32U OSBlkSize; /* 每個記憶體塊的大小 */

INT32U OSNBlks; /* 該記憶體區域中的記憶體塊總數 */

INT32U OSNFree; /* 空閒的記憶體塊數目 */

INT32U OSNUsed; /* 已使用的記憶體塊數目 */

參考文章: