當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 任務(wù)管理1 OSTaskCreate()建立一個(gè)新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動(dòng)之前,也可以在正在運(yùn)行的任務(wù)中建立。中斷處理程序中不能建立任務(wù)。一個(gè)任務(wù)可以為無(wú)限循環(huán)的結(jié)構(gòu)。函數(shù)原型:INT8U OSTaskCreate(void (

 任務(wù)管理

1 OSTaskCreate()

建立一個(gè)新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動(dòng)之前,也可以在正在運(yùn)行的任務(wù)中建立。中斷處理程序中不能建立任務(wù)。一個(gè)任務(wù)可以為無(wú)限循環(huán)的結(jié)構(gòu)。

函數(shù)原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

參數(shù)說(shuō)明:task 是指向任務(wù)代碼首地址的指針。

pdata 指向一個(gè)數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來(lái)在建立任務(wù)時(shí)向任務(wù)傳遞參數(shù)。

ptos is a pointer to the task's top of stack. If the configuration constant OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high memory to low memory). 'pstk' will thus point to the highest (valid) memory location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the lowest memory location of the stack and the stack will grow with increasing memory locations.

prio is the task's priority. A unique priority MUST be assigned to each task and the lower the number, the higher the priority.

返回值:

OSTaskCreate() 的返回值為下述之一:

* OS_NO_ERR:函數(shù)調(diào)用成功。

* OS_PRIO_EXIST:具有該優(yōu)先級(jí)的任務(wù)已經(jīng)存在。

* OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO。

* OS_NO_MORE_TCB:系統(tǒng)中沒(méi)有OS_TCB可以分配給任務(wù)了。

2 OSTaskSuspend()

無(wú)條件掛起一個(gè)任務(wù)。調(diào)用此函數(shù)的任務(wù)也可以傳遞參數(shù) OS_PRIO_SELF,掛起調(diào)用任務(wù)本身。當(dāng)前任務(wù)掛起后,只有其他任務(wù)才能喚醒被掛起的任務(wù)。任務(wù)掛起后,系統(tǒng)會(huì)重新進(jìn)行任務(wù)調(diào)度,運(yùn)行下一個(gè)優(yōu)先級(jí)最高的就緒任務(wù)。喚醒掛起任務(wù)需要調(diào)用函數(shù)OSTaskResume()。

任務(wù)的掛起是可以疊加到其他操作上的。例如,任務(wù)被掛起時(shí)正在進(jìn)行延時(shí)操作,那么任務(wù)的喚醒就需要兩個(gè)條件:延時(shí)的結(jié)束以及其他任務(wù)的喚醒操作。又如,任務(wù)被掛起時(shí)正在等待信號(hào)量,當(dāng)任務(wù)從信號(hào)量的等待對(duì)列中清除后也不能立即運(yùn)行,而必須等到被喚醒后。

函數(shù)原型:INT8U OSTaskSuspend(INT8U prio);

參數(shù)說(shuō)明:prio為指定要獲取掛起的任務(wù)優(yōu)先級(jí),也可以指定參數(shù) OS_PRIO_SELF,掛起任務(wù)本身。此時(shí),下一個(gè)優(yōu)先級(jí)最高的就緒任務(wù)將運(yùn)行。

返回值:

OSTaskSuspend() 的返回值為下述之一:

* OS_NO_ERR:函數(shù)調(diào)用成功。

* OS_TASK_SUSPEND_IDLE:試圖掛起μC/OS-II中的空閑任務(wù)(Idle task)。此為非法操作。

* OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于 OS_LOWEST_PRIO 或沒(méi)有設(shè)定 OS_PRIO_SELF 的值。

* OS_TASK_SUSPEND_PRIO:要掛起的任務(wù)不存在。

3 OSTaskResume()

喚醒一個(gè)用 OSTaskSuspend() 函數(shù)掛起的任務(wù)。OSTaskResume() 也是唯一能“解掛”掛起任務(wù)的函數(shù)。

函數(shù)原型:INT8U OSTaskResume(INT8U prio);

參數(shù)說(shuō)明:prio指定要喚醒任務(wù)的優(yōu)先級(jí)。

返回值:

OSTaskResume() 的返回值為下述之一:

* OS_NO_ERR:函數(shù)調(diào)用成功。

* OS_TASK_RESUME_PRIO:要喚醒的任務(wù)不存在。

* OS_TASK_NOT_SUSPENDED:要喚醒的任務(wù)不在掛起狀態(tài)。

* OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于或等于OS_LOWEST_PRIO。

信號(hào)量

1 OSSemCreate()

該函數(shù)建立并初始化一個(gè)信號(hào)量,信號(hào)量的作用如下:

* 允許一個(gè)任務(wù)和其他任務(wù)或者中斷同步

* 取得設(shè)備的使用權(quán)

* 標(biāo)志事件的發(fā)生

函數(shù)原型:OS_EVENT *OSSemCreate(INT16U value);

參數(shù)說(shuō)明:value 參數(shù)是所建立的信號(hào)量的初始值,可以取0到65535之間的任何值。

返回值:

OSSemCreate() 函數(shù)返回指向分配給所建立的信號(hào)量的控制塊的指針。如果沒(méi)有可用的控制塊,OSSemCreate() 函數(shù)返回空指針。

2 OSSemPend()

該函數(shù)用于任務(wù)試圖取得設(shè)備的使用權(quán)、任務(wù)需要和其他任務(wù)或中斷同步、任務(wù)需要等待特定事件的發(fā)生的場(chǎng)合。如果任務(wù)調(diào)用OSSemPend() 函數(shù)時(shí),信號(hào)量的值大于零,OSSemPend() 函數(shù)遞減該值并返回該值。如果調(diào)用時(shí)信號(hào)量值等于零,OSSemPend() 函數(shù)將任務(wù)加入該信號(hào)量的等待隊(duì)列。OSSemPend() 函數(shù)掛起當(dāng)前任務(wù)直到其他的任務(wù)或中斷設(shè)置信號(hào)量或超出等待的預(yù)期時(shí)間。如果在預(yù)期的時(shí)鐘節(jié)拍內(nèi)信號(hào)量被設(shè)置,μC/OS-Ⅱ默認(rèn)讓最高優(yōu)先級(jí)的任務(wù)取得信號(hào)量并回到就緒狀態(tài)。一個(gè)被OSTaskSuspend() 函數(shù)掛起的任務(wù)也可以接受信號(hào)量,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過(guò)調(diào)用OSTaskResume() 函數(shù)恢復(fù)該任務(wù)的運(yùn)行。

函數(shù)原型:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );

參數(shù)說(shuō)明:pevent 是指向信號(hào)量的指針。該指針的值在建立該信號(hào)量時(shí)可以得到。(參考OSSemCreate() 函數(shù))。

timeout 允許一個(gè)任務(wù)在經(jīng)過(guò)了指定數(shù)目的時(shí)鐘節(jié)拍后還沒(méi)有得到需要的信號(hào)量時(shí)恢復(fù)就緒狀態(tài)。如果該值為零表示任務(wù)將持續(xù)地等待信號(hào)量,最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長(zhǎng)度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差。

err 是指向包含錯(cuò)誤碼的變量的指針,返回的錯(cuò)誤碼可能為下述幾種:

* OS_NO_ERR :信號(hào)量不為零。

* OS_TIMEOUT :信號(hào)量沒(méi)有在指定數(shù)目的時(shí)鐘周期內(nèi)被設(shè)置。

* OS_ERR_PEND_ISR :從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但μC/OS-Ⅱ仍然包含了檢測(cè)這種情況的功能。

* OS_ERR_EVENT_TYPE :pevent 不是指向信號(hào)量的指針。

返回值:無(wú)

3 OSSemPost()

該函數(shù)用于設(shè)置指定的信號(hào)量。如果指定的信號(hào)量是零或大于零,OSSemPost() 函數(shù)遞增該信號(hào)量的值并返回。如果有任何任務(wù)在等待該信號(hào)量,則最高優(yōu)先級(jí)的任務(wù)將得到信號(hào)量并進(jìn)入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進(jìn)行任務(wù)調(diào)度,決定當(dāng)前運(yùn)行的任務(wù)是否仍然為最高優(yōu)先級(jí)的就緒任務(wù)。

函數(shù)原型:INT8U OSSemPost(OS_EVENT *pevent);

參數(shù)說(shuō)明:pevent 是指向信號(hào)量的指針。該指針的值在建立該信號(hào)量時(shí)可以得到。(參考OSSemCreate() 函數(shù))。

返回值:

OSSemPost() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :信號(hào)量被成功地設(shè)置

* OS_SEM_OVF :信號(hào)量的值溢出

* OS_ERR_EVENT_TYPE :pevent 不是指向信號(hào)量的指針

時(shí)間

1 OSTimeDly()

該函數(shù)用于將一個(gè)任務(wù)延時(shí)若干個(gè)時(shí)鐘節(jié)拍。如果延時(shí)時(shí)間大于0,系統(tǒng)將立即進(jìn)行任務(wù)調(diào)度。延時(shí)時(shí)間的長(zhǎng)度可從0到65535個(gè)時(shí)鐘節(jié)拍。延時(shí)時(shí)間0表示不進(jìn)行延時(shí),函數(shù)將立即返回調(diào)用者。延時(shí)的具體時(shí)間依賴于系統(tǒng)每秒鐘有多少個(gè)時(shí)鐘節(jié)拍(由文件OS_CFG.H中的OS_TICKS_PER_SEC宏來(lái)設(shè)定)。

函數(shù)原型:void OSTimeDly (INT16U ticks);

參數(shù)說(shuō)明:ticks 為要延時(shí)的時(shí)鐘節(jié)拍數(shù)。

返回值:無(wú)

2 OSTimeDlyHMSM()

該函數(shù)用于將一個(gè)任務(wù)延時(shí)若干時(shí)間。延時(shí)的單位是小時(shí)、分、秒、毫秒。調(diào)用 OSTimeDlyHMSM() 后,如果延時(shí)時(shí)間不為0,系統(tǒng)將立即進(jìn)行任務(wù)調(diào)度。

函數(shù)原型: INT8U OSTimeDlyHMSM (INT8U hours,INT8U minutes,INT8U seconds,INT16U milli);

參數(shù)說(shuō)明:hours 為延時(shí)小時(shí)數(shù),范圍從0-255。

minutes 為延時(shí)分鐘數(shù),范圍從0-59。

seconds 為延時(shí)秒數(shù),范圍從0-59

milli 為延時(shí)毫秒數(shù),范圍從0-999。

需要說(shuō)明的是,操作系統(tǒng)在處理延時(shí)操作時(shí)都是以時(shí)鐘節(jié)拍為單位的,實(shí)際的延時(shí)時(shí)間是時(shí)鐘節(jié)拍的整數(shù)倍。如果系統(tǒng)時(shí)鐘節(jié)拍的間隔是10ms,而設(shè)定延時(shí)為5ms的話,則不會(huì)產(chǎn)生延時(shí)操作;而如果設(shè)定延時(shí)為15ms,則實(shí)際的延時(shí)是兩個(gè)時(shí)鐘節(jié)拍,也就是20ms。

返回值:

OSTimeDlyHMSM() 的返回值為下述之一:

* OS_NO_ERR:函數(shù)調(diào)用成功。

* OS_TIME_INVALID_MINUTES:參數(shù)錯(cuò)誤,分鐘數(shù)大于59。

* OS_TIME_INVALID_SECONDS:參數(shù)錯(cuò)誤,秒數(shù)大于59。

* OS_TIME_INVALID_MILLI:參數(shù)錯(cuò)誤,毫秒數(shù)大于999。

* OS_TIME_ZERO_DLY:四個(gè)參數(shù)全為0。

內(nèi)存管理

1 OSMemCreate()

該函數(shù)建立并初始化一個(gè)用于動(dòng)態(tài)內(nèi)存分配的區(qū)域,該內(nèi)存區(qū)域包含指定數(shù)目的、大小確定的內(nèi)存塊。應(yīng)用可以動(dòng)態(tài)申請(qǐng)這些內(nèi)存塊并在用完后將其釋放回這個(gè)內(nèi)存區(qū)域。該函數(shù)的返回值就是指向這個(gè)內(nèi)存區(qū)域控制塊的指針,并作為OSMemGet(),OSMemPut(),OSMemQuery() 等相關(guān)調(diào)用的參數(shù)。

函數(shù)原型:OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err );

參數(shù)說(shuō)明:addr 建立的內(nèi)存區(qū)域的起始地址??梢允褂渺o態(tài)數(shù)組或在系統(tǒng)初始化時(shí)使用 malloc() 函數(shù)來(lái)分配這個(gè)區(qū)域的空間。

nblks 內(nèi)存塊的數(shù)目。每一個(gè)內(nèi)存區(qū)域最少需要定義兩個(gè)內(nèi)存塊。

blksize 每個(gè)內(nèi)存塊的大小,最小應(yīng)該能夠容納一個(gè)指針變量。

err 是指向包含錯(cuò)誤碼的變量的指針。Err可能是如下幾種情況:

* OS_NO_ERR :成功建立內(nèi)存區(qū)域。

* OS_MEM_INVALID_ADDR :非法地址,即地址為空指針。

* OS_MEM_INVALID_PART :沒(méi)有空閑的內(nèi)存區(qū)域。

* OS_MEM_INVALID_BLKS :沒(méi)有為內(nèi)存區(qū)域建立至少兩個(gè)內(nèi)存塊。

* OS_MEM_INVALID_SIZE :內(nèi)存塊大小不足以容納一個(gè)指針變量。

返回值:

OSMemCreate() 函數(shù)返回指向所創(chuàng)建的內(nèi)存區(qū)域控制塊的指針。如果創(chuàng)建失敗,函數(shù)返回空指針。

2 OSMemGet()

該函數(shù)用于從內(nèi)存區(qū)域分配一個(gè)內(nèi)存塊。用戶程序必須知道所建立的內(nèi)存塊的大小,并必須在使用完內(nèi)存塊后釋放它??梢远啻握{(diào)用 OSMemGet() 函數(shù)。它的返回值就是指向所分配內(nèi)存塊的指針,并作為 OSMemPut() 函數(shù)的參數(shù)。

函數(shù)原型:void *OSMemGet(OS_MEM *pmem, INT8U *err);

參數(shù)說(shuō)明:pmem 是指向內(nèi)存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數(shù)的返回值中得到。

err 是指向包含錯(cuò)誤碼的變量的指針。Err可能是如下情況:

* OS_NO_ERR :成功得到一個(gè)內(nèi)存塊。

* OS_MEM_NO_FREE_BLKS :內(nèi)存區(qū)域中已經(jīng)沒(méi)有足夠的內(nèi)存塊。

返回值:

OSMemGet() 函數(shù)返回指向所分配內(nèi)存塊的指針。如果沒(méi)有可分配的內(nèi)存塊,OSMemGet() 函數(shù)返回空指針。

3 OSMemPut()

該函數(shù)用于釋放一個(gè)內(nèi)存塊,內(nèi)存塊必須釋放回它原先所在的內(nèi)存區(qū)域,否則會(huì)造成系統(tǒng)錯(cuò)誤。

函數(shù)原型:INT8U OSMemPut (OS_MEM *pmem, void *pblk);

參數(shù)說(shuō)明:pmem 是指向內(nèi)存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數(shù)的返回值中得到。

pblk 是指向?qū)⒈会尫诺膬?nèi)存塊的指針。

返回值:

OSMemPut() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :成功釋放內(nèi)存塊

* OS_MEM_FULL :內(nèi)存區(qū)域已滿,不能再接受更多釋放的內(nèi)存塊。這種情況說(shuō)明用戶程序出現(xiàn)了錯(cuò)誤,釋放了多于用 OSMemGet() 函數(shù)得到的內(nèi)存塊。

4 OSMemQuery()

該函數(shù)用于得到內(nèi)存區(qū)域的信息。

函數(shù)原型:INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);

參數(shù)說(shuō)明:pmem 是指向內(nèi)存區(qū)域控制塊的指針,可以從 OSMemCreate() 函數(shù)的返回值中得到。

pdata 是一個(gè)指向 OS_MEM_DATA 數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含了以下的域:

void OSAddr; /* 指向內(nèi)存區(qū)域起始地址的指針 */

void OSFreeList; /* 指向空閑內(nèi)存塊列表起始地址的指針 */

INT32U OSBlkSize; /* 每個(gè)內(nèi)存塊的大小 */

INT32U OSNBlks; /* 該內(nèi)存區(qū)域中的內(nèi)存塊總數(shù) */

INT32U OSNFree; /* 空閑的內(nèi)存塊數(shù)目 */

INT32U OSNUsed; /* 已使用的內(nèi)存塊數(shù)目 */

消息隊(duì)列

1 OSQCreate()

該函數(shù)用于建立一個(gè)消息隊(duì)列。任務(wù)或中斷可以通過(guò)消息隊(duì)列向一個(gè)或多個(gè)任務(wù)發(fā)送消息。消息的含義是和具體的應(yīng)用密切相關(guān)的。

函數(shù)原型:OS_EVENT *OSQCreate (void **start, INT8U size);

參數(shù)說(shuō)明:start 是消息內(nèi)存區(qū)的首地址,消息內(nèi)存區(qū)是一個(gè)指針數(shù)組。

size 是消息內(nèi)存區(qū)的大小。

返回值:

OSQCreate() 函數(shù)返回一個(gè)指向消息隊(duì)列控制塊的指針。如果沒(méi)有空閑的控制塊,OSQCreate() 函數(shù)返回空指針。

2 OSQPend()

該函數(shù)用于任務(wù)等待消息。消息通過(guò)中斷或任務(wù)發(fā)送給需要的任務(wù)。消息是一個(gè)指針變量,在不同的應(yīng)用中消息的具體含義不同。如果調(diào)用 OSQPend() 函數(shù)時(shí)隊(duì)列中已經(jīng)存在消息,那么該消息被返回給 OSQPend() 函數(shù)的調(diào)用者,該消息同時(shí)從隊(duì)列中清除。如果調(diào)用 OSQPend() 函數(shù)時(shí)隊(duì)列中沒(méi)有消息,OSQPend() 函數(shù)掛起調(diào)用任務(wù)直到得到消息或超出定義的超時(shí)時(shí)間。如果同時(shí)有多個(gè)任務(wù)等待同一個(gè)消息,μC/OS-Ⅱ默認(rèn)最高優(yōu)先級(jí)的任務(wù)取得消息。一個(gè)由 OSTaskSuspend() 函數(shù)掛起的任務(wù)也可以接受消息,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過(guò)調(diào)用 OSTaskResume() 函數(shù)恢復(fù)任務(wù)的運(yùn)行。

函數(shù)原型:void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);

參數(shù)說(shuō)明:pevent 是指向消息隊(duì)列的指針,該指針的值在建立該隊(duì)列時(shí)可以得到。(參考 OSQCreate() 函數(shù))。

timeout 允許一個(gè)任務(wù)以指定數(shù)目的時(shí)鐘節(jié)拍等待消息。超時(shí)后如果還沒(méi)有得到消息則恢復(fù)成就緒狀態(tài)。如果該值設(shè)置成零則表示任務(wù)將持續(xù)地等待消息,最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長(zhǎng)度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差。

err 是指向包含錯(cuò)誤碼的變量的指針。OSQPend() 函數(shù)返回的錯(cuò)誤碼可能為下述幾種:

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

* OS_TIMEOUT :消息沒(méi)有在指定的時(shí)鐘周期數(shù)內(nèi)接收到消息。

* OS_ERR_PEND_ISR :從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷中調(diào)用該函數(shù),但μC/OS-Ⅱ仍然包含了檢測(cè)這種情況的功能。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息隊(duì)列的指針。

返回值:

OSQPend() 函數(shù)返回取得的消息并將 *err 置為 OS_NO_ERR。如果沒(méi)有在指定數(shù)目的時(shí)鐘節(jié)拍內(nèi)接受到消息,OSQPend() 函數(shù)返回空指針并將 *err 設(shè)置為 OS_TIMEOUT。

3 OSQPostFront()

該函數(shù)用于向消息隊(duì)列發(fā)送消息。OSQPostFront() 函數(shù)和 OSQPost() 函數(shù)非常相似,不同之處在于 OSQPostFront() 函數(shù)將發(fā)送的消息插到消息隊(duì)列的最前端。也就是說(shuō),OSQPostFront() 函數(shù)使得消息隊(duì)列按照后入先出(LIFO)的方式工作,而不是先入先出(FIFO)。消息是一個(gè)指針長(zhǎng)度的變量,在不同的應(yīng)用中消息的含義也可能不同。如果隊(duì)列中已經(jīng)存滿消息,則此調(diào)用將返回錯(cuò)誤碼。OSQPost() 函數(shù)也是如此。在調(diào)用此函數(shù)時(shí)如果有任何任務(wù)在等待隊(duì)列中的消息,則最高優(yōu)先級(jí)的任務(wù)將得到這個(gè)消息。如果等待消息的任務(wù)優(yōu)先級(jí)比發(fā)送消息的任務(wù)優(yōu)先級(jí)高,那么高優(yōu)先級(jí)的任務(wù)在得到消息后將立即搶占當(dāng)前任務(wù)執(zhí)行,也就是說(shuō),將發(fā)生一次任務(wù)切換。

函數(shù)原型:INT8U OSQPostFront(OS_EVENT *pevent, void *msg);

參數(shù)說(shuō)明:pevent 是指向即將接收消息的消息隊(duì)列的指針。該指針的值在建立隊(duì)列時(shí)可以得到。(參考 OSQCreate() 函數(shù))。

msg 是即將發(fā)送的消息的指針。不允許傳遞一個(gè)空指針。

返回值:

OSQPostFront() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :消息成功地放到消息隊(duì)列中。

* OS_Q_FULL :消息隊(duì)列已滿。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息隊(duì)列的指針。

4 OSQPost()

該函數(shù)用于向消息隊(duì)列發(fā)送消息。消息是一個(gè)指針長(zhǎng)度的變量,在不同的應(yīng)用中消息的含義也可能不同。如果隊(duì)列中已經(jīng)存滿消息,則此調(diào)用返回錯(cuò)誤碼。如果有任何任務(wù)在等待隊(duì)列中的消息,則最高優(yōu)先級(jí)的任務(wù)將得到這個(gè)消息。如果等待消息的任務(wù)優(yōu)先級(jí)比發(fā)送消息的任務(wù)優(yōu)先級(jí)高,那么高優(yōu)先級(jí)的任務(wù)將在得到消息后立即搶占當(dāng)前任務(wù)執(zhí)行,也就是說(shuō),將發(fā)生一次任務(wù)切換。消息是以先入先出(FIFO)方式進(jìn)入隊(duì)列的,即先進(jìn)入隊(duì)列的消息先被傳遞給任務(wù)。

函數(shù)原型:INT8U OSQPost(OS_EVENT *pevent, void *msg);

參數(shù)說(shuō)明:pevent 是指向即將接受消息的消息隊(duì)列的指針。該指針的值在建立隊(duì)列時(shí)可以得到。(參考 OSQCreate() 函數(shù))。

msg 是即將發(fā)送給隊(duì)列的消息。不允許傳遞一個(gè)空指針。

返回值:

OSQPost() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :消息成功地放到消息隊(duì)列中。

* OS_Q_FULL :消息隊(duì)列已滿。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息隊(duì)列的指針。

5 OSQFlush()

該函數(shù)用于清空消息隊(duì)列。

函數(shù)原型:INT8U *OSQFlush(OS_EVENT *pevent);

參數(shù)說(shuō)明:pevent 是指向消息隊(duì)列的指針。該指針的值在建立隊(duì)列時(shí)可以得到。(參考 OSQCreate() 函數(shù))。

返回值:

OSQFlush() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :消息隊(duì)列被成功清空

* OS_ERR_EVENT_TYPE :試圖清除不是消息隊(duì)列的對(duì)象

6 OSQQuery()

該函數(shù)用來(lái)取得消息隊(duì)列的信息。用戶程序必須建立一個(gè) OS_Q_DATA 的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來(lái)保存從消息隊(duì)列的控制塊得到的數(shù)據(jù)。通過(guò)調(diào)用該函數(shù)可以知道是否有任務(wù)在等待消息、有多少個(gè)任務(wù)在等待消息、隊(duì)列中有多少消息以及消息隊(duì)列可以容納的消息數(shù)。OSQQuery() 函數(shù)還可以得到即將被傳遞給任務(wù)的消息。

函數(shù)原型:INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);

參數(shù)說(shuō)明:pevent 是指向消息隊(duì)列的指針。該指針的值在建立消息隊(duì)列時(shí)可以得到。(參考 OSQCreate() 函數(shù))。

pdata 是指向 OS_Q_DATA 數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:

void *OSMsg; /* 下一個(gè)可用的消息 */

INT16U OSNMsgs; /* 隊(duì)列中的消息數(shù)目 */

INT16U OSQSize; /* 消息隊(duì)列的大小 */

INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 消息隊(duì)列的等待隊(duì)列 */

INT8U OSEventGrp;

返回值:

OSQQuery() 函數(shù)的返回值為下述之一:

* OS_NO_ERR :調(diào)用成功

* OS_ERR_EVENT_TYPE :pevent 不是指向消息隊(duì)列的指針。

7 OSQDel()

該函數(shù)用于刪除指定的消息隊(duì)列。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉