ucos ii介紹
μC/OS-II由Micrium公司提供,是一個可移植、可固化的、可裁剪的、占先式多任務實時內核,它適用于多種微處理器,微控制器和數字處理芯片(已經移植到超過100種以上的微處理器應用中)。同時,該系統(tǒng)源代碼開放、整潔、一致,注釋詳盡,適合系統(tǒng)開發(fā)。
常用函數介紹:
OSInit()初始化函數
在uC/OS II的學習中,OSInit(OS_CORE.C )(函數原型位于);是一個重要的函數,它在OS應用中的main()函數中首先被調用,是OS運行的第一個函數,它完成各初始變量的初始化。主要工作:
OSInitHookBegin(); /* 調用用戶特定的初始化代碼(通過一個接口函數實現(xiàn)用戶要求的插件式進入系統(tǒng)中)*/
OS_InitMisc(); /* 初始化變量*/
OS_InitRdyList(); /* 初始化就緒列表*/
OS_InitTCBList(); /* 初始化OS_TCB空閑列表*/
OS_InitEventList(); /* 初始化OS_EVENT空閑列表*/
OS_InitTaskIdle(); /創(chuàng)建空閑任務/
程序注釋詳解:
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(); /* 調用用戶特定的初始化代碼(通過一個接口函數實現(xiàn)用戶要求的插件式進入系統(tǒng)中)*/
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); /* 創(chuàng)建任務前初始化TLS*/ /* Initialize TLS, before creating tasks */
if (err != OS_ERR_NONE) {
return;
}
#endif
#endif
OS_InitTaskIdle(); /* 創(chuàng)建空閑任務(無條件)Create the Idle Task */
#if OS_TASK_STAT_EN > 0u
OS_InitTaskStat(); /* 創(chuàng)建統(tǒng)計任務*/ /* 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
}
123456789101112131415161718192021222324252627282930313233343536373839404142
任務函數相關:
OSTaskCreate()任務創(chuàng)建函數
1、主要作用:建立一個新任務。任務的建立可以在多任務環(huán)境啟動之前,也可以在正在運行的任務中建立。中斷處理程序中不能建立任務;注意,ISR中禁止建立任務,一個任務必須為無限循環(huán)結構。
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:任務優(yōu)先級
4、返回值介紹:
OS_NO_ERR:函數調用成功。
OS_PRIO_EXIST:具有該優(yōu)先級的任務已經存在。
OS_PRIO_INVALID:參數指定的優(yōu)先級大于OS_LOWEST_PRIO。
OS_NO_MORE_TCB:系統(tǒng)中沒有OS_TCB可以分配給任務了。
5、函數主體在os_task.c中
OSTaskCreateExt
1、主要作用:建立一個新任務。與OSTaskCreate()不同的是,OSTaskCreateExt()允許用戶設置更多的細節(jié)內容。任務的建立可以在多任務環(huán)境啟動之前,也可以在正在運行的任務中建立,但中斷處理程序中不能建立新任務。,且不
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:任務優(yōu)先級
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:具有該優(yōu)先級的任務已經存在。
OS_PRIO_INVALID:參數指定的優(yōu)先級大于OS_LOWEST_PRIO。
OS_NO_MORE_TCB:系統(tǒng)中沒有OS_TCB可以分配給任務了。
5、函數主體在os_task.c中
OSTaskSuspend()任務掛起:
1、主要作用: 無條件掛起一個任務。調用此函數的任務也可以傳遞參數 OS_PRIO_SELF,掛起調用任務本身。當前任務掛起后,只有其他任務才能喚醒被掛起的任務。任務掛起后,系統(tǒng)會重新進行任務調度,運行下一個優(yōu)先級最高的就緒任務。喚醒掛起任務需要調用函數OSTaskResume()。任務的掛起是可以疊加到其他操作上的。例如,任務被掛起時正在進行延時操作,那么任務的喚醒就需要兩個條件:延時的結束以及其他任務的喚醒操作。又如,任務被掛起時正在等待信號量,當任務從信號量的等待對列中清除后也不能立即運行,而必須等到被喚醒后。[!--empirenews.page--]
2、函數原型:INT8U OSTaskSuspend(INT8U prio);
3、參數說明:prio為指定要獲取掛起的任務優(yōu)先級,也可以指定參數 OS_PRIO_SELF,掛起任務本身。此時,下一個優(yōu)先級最高的就緒任務將運行。
4、返回值說明:
OS_NO_ERR:函數調用成功。
OS_TASK_SUSPEND_IDLE:試圖掛起μC/OS-II中的空閑任務(Idle task)。此為非法操作。
OS_PRIO_INVALID:參數指定的優(yōu)先級大于 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指定要喚醒任務的優(yōu)先級。
4、返回值說明:
OS_NO_ERR:函數調用成功。
OS_TASK_RESUME_PRIO:要喚醒的任務不存在
OS_TASK_NOT_SUSPENDED:要喚醒的任務不在掛起狀態(tài)。
OS_PRIO_INVALID:參數指定的優(yōu)先級大于或等于OS_LOWEST_PRIO。
5、函數主體在os_task.c中
時間相關的函數
OSTimeDly()延時節(jié)拍函數
1、主要作用:調用該函數的任務將自己延時一段時間并執(zhí)行一次任務調度,一旦規(guī)定的延時時間完成或有其它的任務通過調用OSTimeDlyResume()取消了延時,調用OSTimeDly()函數的任務馬上進入就緒狀態(tài)(前提是先將任務調度后執(zhí)行的任務執(zhí)行到程序尾,且調用OSTimeDly的任務此時優(yōu)先級最高)。
2、函數原型:void OSTimeDly (INT16U ticks);
3、參數說明:ticks為需要延時的時鐘節(jié)拍數;
4、返回值:無
5、函數主體在os_time.c中
OSTimeDlyHMSM()系統(tǒng)延時函數
1、主要作用:函數是以小時(H)、分(M)、秒(S)和毫秒(m)四個參數來定義延時時間的,函數在內部把這些參數轉換為時鐘節(jié)拍,再通過單次或多次調用OSTimeDly()進行延時和任務調度,所以延時原理和調用延時函數OSTimeDly()是一樣的。調用 OSTimeDlyHMSM() 后,如果延時時間不為0,系統(tǒng)將立即進行任務調度。
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、主要作用:任務在延時之后,進入阻塞態(tài)。當延時時間到了就從阻塞態(tài)恢復到就緒態(tài),可以被操作系統(tǒng)調度執(zhí)行。但是,并非回到就緒態(tài)就只有這么一種可能,因為即便任務的延時時間沒到,還是可以通過函數OSTimeDlyResume恢復該任務到就緒態(tài)的。另外,OSTimeDlyResume也不僅僅能恢復使用OSTimeDly或OSTimeDlyHMSM而延時的任務。對于因等待事件發(fā)生而阻塞的,并且設置了超時(timeout)時間的任務,也可以使用OSTimeDlyResume來恢復。對這些任務使用了OSTimeDlyResume,就好像已經等待超時了一樣。但是,對于采用OSTaskSuspend掛起的任務,是不允許采用OSTimeDlyResume來恢復的。
2、函數原型:INT8U OSTimeDlyResume (INT8U prio)
3.參數說明:prio 被恢復任務的優(yōu)先級
4、返回值:
OS_ERR_TASK_NOT_EXIST:任務優(yōu)先級指針表中沒有此任務
OS_NO_ERR:函數調用成功。
OS_ERR_PRIO_INVALID:參數指定的優(yōu)先級大于或等于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)釋放該信號量。這里就實現(xiàn)了一個資源的互斥訪問。
(注:初始化OSSemCreate(1),那么一個任務中有OSSemPend,那么可以執(zhí)行,執(zhí)行之后cnt==0,其他任務的OSSemPend無法獲得sem,只能等待,除非任務一有OSSemPost,使其cnt++,這樣其他任務的Pend可以執(zhí)行。)
同理,如果一個任務要等待n個事件發(fā)生后才能執(zhí)行,則應定義為Semp = OSSemCreate(n)。然后在這n個任務分別運行時調用OSSemPost(Semp),直到這n個事件均發(fā)生后,這個任務才能運行。
OSSemCreate(cnt)賦初始值cnt,OSSemPend一次,cnt– 一次,OSSemPost一次,cnt++一次。
下面對信號量函數做簡要介紹:
OSSemCreate()建立信號量函數
1、主要作用:該函數建立并初始化一個信號量,信號量的作用如下:
允許一個任務和其他任務或者中斷同步
取得設備的使用權
標志事件的發(fā)生
2、函數原型:OS_EVENT *OSSemCreate(INT16U value);
3、參數說明:value 參數是所建立的信號量的初始值,可以取0到65535之間的任何值。
4、返回值:OSSemCreate() 函數返回指向分配給所建立的信號量的控制塊的指針。如果沒有可用的控制塊,OSSemCreate() 函數返回空指針。
5、函數主體在os_sem.c中
OSSemPend()取得使用權函數
1、主要作用: 該函數用于任務試圖取得設備的使用權、任務需要和其他任務或中斷同步、任務需要等待特定事件的發(fā)生的場合。如果任務調用OSSemPend() 函數時,信號量的值大于零,OSSemPend() 函數遞減該值。如果調用時信號量值等于零,OSSemPend() 函數將任務加入該信號量的等待隊列。OSSemPend() 函數掛起當前任務直到其他的任務或中斷設置信號量或超出等待的預期時間。如果在預期的時鐘節(jié)拍內信號量被設置,μC/OS-Ⅱ默認讓最高優(yōu)先級的任務取得信號量并回到就緒狀態(tài)。一個被OSTaskSuspend() 函數掛起的任務也可以接受信號量,但這個任務將一直保持掛起狀態(tài)直到通過調用OSTaskResume() 函數恢復該任務的運行。[!--empirenews.page--]
2、函數原型:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );
3、參數說明:
pevent 是指向信號量的指針。該指針的值在建立該信號量時可以得到。(參考OSSemCreate() 函數)。
timeout 允許一個任務在經過了指定數目的時鐘節(jié)拍后還沒有得到需要的信號量時恢復就緒狀態(tài)。如果該值為零表示任務將持續(xù)地等待信號量,最大的等待時間為65535個時鐘節(jié)拍。這個時間長度并不是非常嚴格的,可能存在一個時鐘節(jié)拍的誤差。
err 是指向包含錯誤碼的變量的指針,返回的錯誤碼可能為下述幾種:
OS_NO_ERR :信號量不為零。
OS_TIMEOUT :信號量沒有在指定數目的時鐘周期內被設置。
OS_ERR_PEND_ISR :從中斷調用該函數。雖然規(guī)定了不允許從中斷調用該函數,但μC/OS-Ⅱ仍然包含了檢測這種情況的功能。
OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針。
4、返回值:無
5、函數主體在os_sem.c中
OSSemPost()使用權放棄函數
1、主要作用: 該函數用于設置指定的信號量。如果指定的信號量是零或大于零,OSSemPost() 函數遞增該信號量的值并返回。如果有任何任務在等待該信號量,則最高優(yōu)先級的任務將得到信號量并進入就緒狀態(tài)。任務調度函數將進行任務調度,決定當前運行的任務是否仍然為最高優(yōu)先級的就緒任務。
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中另一種通訊機制,它可以使一個任務或者中斷服務子程序向另一個任務發(fā)送以指針方式定義的變量。因具體的應用有所不同,每個指針指向的數據結構變量也有所不同。為了使用µC/OS-II的消息隊列功能,需要在OS_CFG.H 文件中,將OS_Q_EN常數設置為1,并且通過常數OS_MAX_QS來決定µC/OS-II支持的最多消息隊列數。
12
OSQCreate()建立消息隊列函數
1、主要作用:該函數用于建立一個消息隊列。任務或中斷可以通過消息隊列向一個或多個任務發(fā)送消息。消息的含義是和具體的應用密切相關的。
2、函數原型:OS_EVENT *OSQCreate (void **start, INT8U size);
3、參數說明:start 是消息內存區(qū)的首地址,消息內存區(qū)是一個指針數組
size 是消息內存區(qū)的大小。
4、返回值說明:OSQCreate() 函數返回一個指向消息隊列控制塊的指針。如果沒有空閑的控制塊,OSQCreate() 函數返回空指針
5、函數主體在os_q.c中
OSQPend()任務等待消息函數
1、主要作用: 該函數用于任務等待消息。消息通過中斷或任務發(fā)送給需要的任務。消息是一個指針變量,在不同的應用中消息的具體含義不同。如果調用 OSQPend() 函數時隊列中已經存在消息,那么該消息被返回給 OSQPend() 函數的調用者,該消息同時從隊列中清除。如果調用 OSQPend() 函數時隊列中沒有消息,OSQPend() 函數掛起調用任務直到得到消息或超出定義的超時時間。如果同時有多個任務等待同一個消息,μC/OS-Ⅱ默認最高優(yōu)先級的任務取得消息。一個由 OSTaskSuspend() 函數掛起的任務也可以接受消息,但這個任務將一直保持掛起狀態(tài)直到通過調用 OSTaskResume() 函數恢復任務的運行。
2、函數原型:void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
3、參數說明:pevent 是指向消息隊列的指針,該指針的值在建立該隊列時可以得到。(參考 OSQCreate() 函數)。 timeout 允許一個任務以指定數目的時鐘節(jié)拍等待消息。超時后如果還沒有得到消息則恢復成就緒狀態(tài)。如果該值設置成零則表示任務將持續(xù)地等待消息,最大的等待時間為65535個時鐘節(jié)拍。這個時間長度并不是非常嚴格的,可能存在一個時鐘節(jié)拍的誤差。
err 是指向包含錯誤碼的變量的指針。OSQPend() 函數返回的錯誤碼可能為下述幾種:
* OS_NO_ERR :消息被正確地接受。
* OS_TIMEOUT :消息沒有在指定的時鐘周期數內接收到消息。
* OS_ERR_PEND_ISR :從中斷調用該函數。雖然規(guī)定了不允許從中斷中調用該函數,但μC/OS-Ⅱ仍然包含了檢測這種情況的功能。
* OS_ERR_EVENT_TYPE :pevent 不是指向消息隊列的指針。
12345678
4、返回值說明:OSQPend() 函數返回取得的消息并將 *err 置為 OS_NO_ERR。如果沒有在指定數目的時鐘節(jié)拍內接受到消息,OSQPend() 函數返回空指針并將 *err 設置為 OS_TIMEOUT。
5、函數主體在os_q.c中
其他的消息函數
INT8U OSQPost (OS_EVENT *pevent, void *msg)
發(fā)送一個消息到消息隊列 FIFO模式
INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
發(fā)送一個消息到消息隊列 FIFO模式
void *OSQAccept (OS_EVENT *pevent)
無等待地從消息隊列中得到一個消息
INT8U OSQFlush (OS_EVENT *pevent)
清空一個消息隊列
INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
查詢一個消息隊列的當前狀態(tài)
使用消息隊列的通常步驟為:
1)定義指針: OS_EVENT *proSQ
定義指針數組: void *start[4]
2) 在主程序中建立信號列隊:*proSQ = OSQCreate(start,4);
3)在任務中等待消息列隊中得到消息或者給消息列隊發(fā)送消息
12345678910111213141516
內存管理:參考于:μC/OS-II學習筆記四(內存管理)注:以下都為轉載;
在ANSI C中可以用malloc()和free()兩個函數動態(tài)地分配內存和釋放內存。但是,在嵌入式實時操作系統(tǒng)中,多次這樣做會把原來很大的一塊連續(xù)內存區(qū)域,逐漸地分割成許多非常小而且彼此又不相鄰的內存區(qū)域,也就是內存碎片。由于這些碎片的大量存在,使得程序到后來連非常小的內存也分配不到。另外,由于內存管理算法的原因,malloc()和free()函數執(zhí)行時間是不確定的。[!--empirenews.page--]
在μC/OS-II中,操作系統(tǒng)把連續(xù)的大塊內存按分區(qū)來管理。每個分區(qū)中包含有整數個大小相同的內存塊。利用這種機制,μC/OS-II 對malloc()和free()函數進行了改進,使得它們可以分配和釋放固定大小的內存塊。這樣一來,malloc()和free()函數的執(zhí)行時間也是固定的了。
在一個系統(tǒng)中可以有多個內存分區(qū)。這樣,用戶的應用程序就可以從不同的內存分區(qū)中得到不同大小的內存塊。但是,特定的內存塊在釋放時必須重新放回它以前所屬于的內存分區(qū)。顯然,采用這樣的內存管理算法,上面的內存碎片問題就得到了解決。
內存控制塊
為了便于內存的管理,在μC/OS-II中使用內存控制塊(memory control blocks)的數據結構來跟蹤每一個內存分區(qū),系統(tǒng)中的每個內存分區(qū)都有它自己的內存控制塊。
內存控制塊的定義如下:
typedef struct {
void *OSMemAddr; //指向內存分區(qū)起始地址的指針
void *OSMemFreeList; //是指向下一個空閑內存控制塊或者下一個空閑的內存塊的指針
INT32U OSMemBlkSize; //是內存分區(qū)中內存塊的大小
INT32U OSMemNBlks; //內存分區(qū)中總的內存塊數量
INT32U OSMemNFree; //內存分區(qū)中當前可以得空閑內存塊數量
} OS_MEM;
如果要在μC/OS-II中使用內存管理,需要在OS_CFG.H文件中將開關量OS_MEM_EN設置為1。這樣μC/OS-II 在啟動時就會對內存管理器進行初始化[由OSInit()調用OSMemInit()實現(xiàn)]。常數OS_MAX_MEM_PART(見文件OS_CFG.H)定義了最大的內存分區(qū)數,該常數值最小應為2。
OSMemCreate()內存塊創(chuàng)建函數
1 主要作用: 該函數建立并初始化一個用于動態(tài)內存分配的區(qū)域,該內存區(qū)域包含指定數目的、大小確定的內存塊。應用可以動態(tài)申請這些內存塊并在用完后將其釋放回這個內存區(qū)域。該函數的返回值就是指向這個內存區(qū)域控制塊的指針,并作為OSMemGet(),OSMemPut(),OSMemQuery() 等相關調用的參數。
2函數原型:OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err );
3參數說明:addr 建立的內存區(qū)域的起始地址??梢允褂渺o態(tài)數組或在系統(tǒng)初始化時使用 malloc() 函數來分配這個區(qū)域的空間。
nblks 內存塊的數目。每一個內存區(qū)域最少需要定義兩個內存塊。
blksize 每個內存塊的大小,最小應該能夠容納一個指針變量。
err 是指向包含錯誤碼的變量的指針。Err可能是如下幾種情況:
OS_NO_ERR :成功建立內存區(qū)域。
OS_MEM_INVALID_ADDR :非法地址,即地址為空指針。
OS_MEM_INVALID_PART :沒有空閑的內存區(qū)域。
OS_MEM_INVALID_BLKS :沒有為內存區(qū)域建立至少兩個內存塊。
OS_MEM_INVALID_SIZE :內存塊大小不足以容納一個指針變量。
4返回值:
OSMemCreate() 函數返回指向所創(chuàng)建的內存區(qū)域控制塊的指針。如果創(chuàng)建失敗,函數返回空指針。
OSMemGet()函數
1 主要作用: 該函數用于從內存區(qū)域分配一個內存塊。用戶程序必須知道所建立的內存塊的大小,并必須在使用完內存塊后釋放它??梢远啻握{用 OSMemGet() 函數。它的返回值就是指向所分配內存塊的指針,并作為 OSMemPut() 函數的參數。
2函數原型:void *OSMemGet(OS_MEM *pmem, INT8U *err);
3參數說明:pmem 是指向內存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數的返回值中得到。
err 是指向包含錯誤碼的變量的指針。Err可能是如下情況:
OS_NO_ERR :成功得到一個內存塊。
OS_MEM_NO_FREE_BLKS :內存區(qū)域中已經沒有足夠的內存塊。
4返回值:
OSMemGet() 函數返回指向所分配內存塊的指針。如果沒有可分配的內存塊,OSMemGet() 函數返回空指針。
OSMemPut()
1 主要作用:該函數用于釋放一個內存塊,內存塊必須釋放回它原先所在的內存區(qū)域,否則會造成系統(tǒng)錯誤。
2函數原型:INT8U OSMemPut (OS_MEM *pmem, void *pblk);
3參數說明:pmem 是指向內存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數的返回值中得到。
pblk 是指向將被釋放的內存塊的指針。
4返回值:
OSMemPut() 函數的返回值為下述之一:
OS_NO_ERR :成功釋放內存塊
OS_MEM_FULL :內存區(qū)域已滿,不能再接受更多釋放的內存塊。這種情況說明用戶程序出現(xiàn)了錯誤,釋放了多于用 OSMemGet() 函數得到的內存塊。
OSMemQuery()
1 主要作用:該函數用于得到內存區(qū)域的信息。
2函數原型:INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
3參數說明:pmem 是指向內存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數的返回值中得到。
pdata 是一個指向 OS_MEM_DATA 數據結構的指針,該數據結構包含了以下的域:
void OSAddr; /* 指向內存區(qū)域起始地址的指針 */
void OSFreeList; /* 指向空閑內存塊列表起始地址的指針 */
INT32U OSBlkSize; /* 每個內存塊的大小 */
INT32U OSNBlks; /* 該內存區(qū)域中的內存塊總數 */
INT32U OSNFree; /* 空閑的內存塊數目 */
INT32U OSNUsed; /* 已使用的內存塊數目 */
參考文章:
1、 uC/OS II 函數說明 之–OSTaskCreate()與OSTaskCreateExt()
2、uC-OS-II_中文手冊





