學uC/OS-III的時候 覺得這些常用的函數找起來太麻煩,便整理在一起,方便複製粘貼用。
更改任務優先級
void OSTaskChangePrio( OS_TCB *p_tcb, //需要更改優先級的任務函數名稱。可以爲空,即改變當前任務優先級。
OS_PRIO prio_new, //需要更改的新優先級。不能爲0和 大於或等於OS_CFG_PRIO_MAX-1的數值。
OS_ERR *p_err);
OSTaskChangePrio((OS_TCB *)&Main2TaskLedTCB, 3, &err);
if(OS_ERR_NONE == err)
{
printf("Main2Task Change Prio To 3 Success\n");
}
任務創建
OSTaskCreate( (OS_TCB *)&AppTaskStartTCB,/*創建任務控制塊 */
(CPU_CHAR *)"App Task Start",/*非任務函數名稱,系統本身不知道任務名稱,僅知道任務地址與指針,此爲輸出或調試時使用任務名稱的代替字符串*/
(OS_TASK_PTR )AppTaskStart,
(void *)0u,/*定義函數形參,可以爲&取址全局變量。若只有局部變量,可用static定義局部變量*/
(OS_PRIO )APP_CFG_TASK_START_PRIO, /*任務優先級*/
(CPU_STK *)&AppTaskStartStk[0u],/*給任務分配的RAM,0爲首地址*/
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10u,/*堆棧溢出警戒線*/
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,/*堆棧大小*/
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0u,/*需打開浮點開關,存儲浮點數至外擴區域。定義全局CPU_INT32U out_buf[256];則此處填寫out_buf[0]或者out_buf(外擴區首地址)*/
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_SAVE_FP),
/* CPU支持選項OS_OPT_TASK_STK_CHK是否允許檢測該任務堆棧
OS_OPT_TASK_STK_CLR是否需要清零該任務堆棧
OS_OPT_TASK_SAVE_FP是否儲存浮點運算寄存器*/
(OS_ERR *)&err);
OS_ERR err;
OSTaskCreate((OS_TCB *)&Main3TaskLedTCB,/*創建任務控制塊 */
(CPU_CHAR *)"Main3",
(OS_TASK_PTR )main3,
(void *)10u,/*定義函數形參,可以爲&取址全局變量。若只有局部變量,可用static定義局部變量*/
(OS_PRIO )3,/*任務優先級*/
(CPU_STK *)&Main3TaskLedStk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0u,/*浮點開關。定義全局CPU_INT32U out_buf[256];則此處填寫out_buf*/
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
鉤子函數
在主函數前添加鉤子函數
void MyAppCreateHook(OS_TCB *p_tcb) //形參填寫任務函數名稱
{
printf("任務%s被創建\n",p_tcb->NamePtr);
}
在主函數中添加
OS_AppTaskCreateHookPtr = (OS_APP_HOOK_TCB)MyAppCreateHook;
刪除任務
OS_ERR err;
if(*key == 'd')
{
printf("KeyHook Get key:%c\n",*key);
OSTaskDel(&Main3TaskLedTCB,&err);
if(OS_ERR_NONE == err)
{
printf("Del main3 success!!\n");
}
*key = 0;
}
不可重入數組賦值 舉例
void OSTaskRegSet (OS_TCB *p_tcb,//任務指針,NULL即爲當前任務
OS_REG_ID id,//數組下標
OS_REG value,//數組[id]中的值
OS_ERR *p_err)
OS_ERR err;
OS_REG reg;
if(*key == 's')
{
printf("KeyHook Get key:%c\n",*key);
OSTaskRegSet(&Main3TaskLedTCB,3,126,&err);
printf("Set reg = 126\n");
*key = 0;
}
不可重入數組取值 舉例
OS_ERR err;
OS_REG reg;
if(*key == 'g')
{
printf("KeyHook Get key:%c\n",*key);
reg = OSTaskRegGet(&Main3TaskLedTCB,3,&err);
printf("Get reg = %d\n",reg);
*key = 0;
}
任務掛起
OS_ERR err;
if(*key == 'u')
{
printf("KeyHook Get key:%c\n",*key);
OSTaskSuspend(&Main3TaskLedTCB,&err);
if(OS_ERR_NONE == err)
{
printf("Main3 has been suspend success!!\n");
}
*key = 0;
}
掛起任務恢復 任務被掛起幾次 需調用幾次此函數
OS_ERR err;
if(*key == 'r')
{
printf("KeyHook Get key:%c\n",*key);
OSTaskResume(&Main3TaskLedTCB,&err);
if(OS_ERR_NONE == err)
{
printf("Main3 resumed success!!\n");
}
*key = 0;
}
堆棧檢查函數
OS_ERR err;
CPU_STK_SIZE free,used;
if(*key == 't')
{
printf("KeyHook Get key:%c\n",*key);
OSTaskStkChk(&Main3TaskLedTCB,&free,&used,&err);
if(OS_ERR_NONE == err)
{
printf("free = %d,used = %d\n",free,used);
}
*key = 0;
}
硬件定時器
主函數中初始化:TIM3_Init(2563,65535);
Time.h
#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f4xx_conf.h"
void TIM3_Init(u32 TIM_scale, u32 TIM_Period);
#endif
Timer.c
#include "timer.h"
#include <includes.h>
中斷函數
void TIM3_ISR(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
void TIM3_Init(u32 TIM_scale, u32 TIM_Period)//TIM_Period爲16位的數
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseStructure.TIM_Period = TIM_Period;//計數器重裝值
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM3, (TIM_scale-1), TIM_PSCReloadMode_Immediate);
BSP_IntVectSet (BSP_INT_ID_TIM3,(CPU_FNCT_VOID)TIM3_ISR);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
軟件定時器
OS_TMR tmrTest;//定時器名字
OS_ERR err;
void TmrTestIsr(void) //中斷函數
{
printf("TmrTestIsr\n");
}
void OSTmrCreate (OS_TMR *p_tmr, //定時器名字
CPU_CHAR *p_name, //調試調用名稱
OS_TICK dly, //若是選擇單次模式則爲定時長度dly*10ms, 若爲週期模式則爲前等待dly*10ms後開始進入週期循環,
OS_TICK period, //單次模式下爲0,週期模式下爲定時器週期間隔
OS_OPT opt,//OS_OPT_TMR_ONE_SHOT單次模式。 OS_OPT_TMR_PERIODIC週期模式
OS_TMR_CALLBACK_PTR p_callback, //中斷函數名稱exc:(OS_TMR_CALLBACK_PTR)TmrTestIsr
void *p_callback_arg, //定時結束傳遞給回調函數的參數(形參初值)
OS_ERR *p_err) //錯誤返回
OSTmrCreate(&tmrTest,"TimerTest",100,200,OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR)TmrTestIsr,(void *)0,&err);//100*10ms後開始運行,每200*10ms進一次中斷。
OSTmrStart(&tmrTest,&err);//使能定時器
printf("OSTimeTick = %ld\n",OSTimeGet(&err));
延時函數
ucos內核驅動心臟:OSTimeTick()
這裏在os_cpu_c.c的OS_CPU_SysTickHandler()中
我們需要讓他跑起來,只需要不停的調用它就可以了,至於是定時器還是其他,如按鍵觸發
都無所謂,定時器觸發只是提供了一個準確的時間
OS_ERR err;
void OSTimeDly (OS_TICK dly, //滴答時鐘計數數值. 爲0時表示不拖延。1000表示1000ms
OS_OPT opt, //相對模式、週期模式(指定多長時間間隔執行一次)、絕對模式(OSTickCtr >= dly時程序不再停止在此函數)
OS_ERR *p_err) //錯誤返回值
void OSTimeDlyHMSM (CPU_INT16U hours,
CPU_INT16U minutes,
CPU_INT16U seconds,
CPU_INT32U milli,
OS_OPT opt, // ————
OS_ERR *p_err)// |
// |
//---------------------------------
// OS_OPT_TIME_HMSM_STRICT strictly allow only hours (0...99)
// Minutes (0...59)
// seconds (0...59)
// Milliseconds (0...999)
//
// OS_OPT_TIME_HMSM_NON_STRICT allow any value of hours (0...999)
minutes (0...9999)
seconds (0...65535)
milliseconds (0...4294967295)
if(*key == 'y')
{
printf("KeyHook Get key:%c\n",*key);
OSTimeDlyResume(&Main3TaskLedTCB,&err);//main3的延時本次跳出
if(OS_ERR_NONE == err)
{
printf("Main3 Dly Resumed!\n");
}
*key = 0;
}
查看系統計數器
OS_ERR err;
ucos有個系統計數器:OSTickCtr 這個是全局變量
printf("OSTimeTick = %ld\n",OSTimeGet(&err));
開關總中斷
void main2(char *arg)
{
CPU_SR_ALLOC();
OS_ERR err;
while(1)
{
OS_CRITICAL_ENTER();
//。。。
OS_CRITICAL_EXIT();
OSTimeDlyHMSM(0u, 0u, 0u, 10u,OS_OPT_TIME_HMSM_STRICT,&err);//讓出CPU,並且附帶了DelayMs的功能
}
}
任務調度上鎖、解鎖
OS_ERR err;
OSSchedLock(&err);
//。。。
OSSchedUnlock(&err);
創建互斥信號量(對象創建)
OS_MUTEX atom1Section;
OS_ERR err;
void OSMutexCreate (OS_MUTEX *p_mutex,//互斥信號量指針
CPU_CHAR *p_name,//調試用的字符串名稱
OS_ERR *p_err)
OSSemCreate(&atom1Section,"atom1Section",&err);
創建信號量(對象創建)
OS_SEM atom1Section;
OS_ERR err;
void OSSemCreate (OS_SEM *p_sem,//信號量指針
CPU_CHAR *p_name,//調試用的字符串名稱
OS_SEM_CTR cnt,//創建幾個信號量
OS_ERR *p_err)
OSSemCreate(&atom1Section,"atom1Section",1,&err);
接收、發送互斥信號量
OS_ERR err;
void OSMutexPend (OS_MUTEX *p_mutex,//互斥信號量指針
OS_TICK timeout,//等待信號量超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//是否選擇阻塞模式OS_OPT_PEND_BLOCKING無信號量時,任務掛起等待信號量
//OS_OPT_PEND_NON_BLOCKING無信號量任務直接返回
CPU_TS *p_ts,//NULL表示用戶不要求時間戳.發送信號亮至任務恢復的時間delta=OS_TS_GET() - * P_ts;
OS_ERR *p_err)
void OSMutexPost (OS_MUTEX *p_mutex,//互斥信號量指針
OS_OPT opt,//OS_OPT_POST_NONE NULL
//OS_OPT_POST_NO_SCHED 發送後禁止任務調度 ?????
接收、發送信號量
OS_ERR err;
OS_SEM_CTR OSSemPend (OS_SEM *p_sem,//信號量指針
OS_TICK timeout,//等待信號量超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//是否選擇阻塞模式OS_OPT_PEND_BLOCKING無信號量時,任務掛起等待信號量
//OS_OPT_PEND_NON_BLOCKING無信號量任務直接返回
CPU_TS *p_ts,//NULL表示用戶不要求時間戳.發送信號亮至任務恢復的時間delta=OS_TS_GET() - * P_ts;
OS_ERR *p_err)
OS_SEM_CTR OSSemPost (OS_SEM *p_sem,
OS_OPT opt,//選擇信號量發送方式
//OS_OPT_POST_1 僅向等待該信號量的優先級最高的任務發送
//OS_OPT_POST_ALL 想等待該信號量的所有任務發送。不能用作資源共享時使用,僅用作信號機制
//OS_OPT_POST_NO_SCHED 發送後禁止任務調度
OS_ERR *p_err)
OSSemPend(&atom1Section,0,OS_OPT_PEND_BLOCKING,NULL,&err);
。。。
。。。
OSSemPost(&atom1Section,OS_OPT_POST_1,&err);
終止任務等待互斥信號量
OS_OBJ_QTY OSMutexPendAbort (OS_MUTEX *p_mutex,//互斥信號量指針
OS_OPT opt,//OS_OPT_PEND_ABORT_1 僅終止等待該信號量的最高優先級任務
//OS_OPT_PEND_ABORT 終止所有等待該信號量的任務
//OS_OPT_POST_NO_SCHED 取消等待信號量後禁止任務調度
OS_ERR *p_err)
終止任務等待信號量
OS_ERR err;
OS_OBJ_QTY OSSemPendAbort (OS_SEM *p_sem,//信號量指針
OS_OPT opt, //OS_OPT_PEND_ABORT_1 僅終止等待該信號量的最高優先級任務
//OS_OPT_PEND_ABORT 終止所有等待該信號量的任務
//OS_OPT_POST_NO_SCHED 取消等待信號量後禁止任務調度
OS_ERR *p_err)
if(*key == 'f')
{
printf("KeyHook Get key:%c\n",*key);
semAbortCnt = OSSemPendAbort(&atom1Section,OS_OPT_PEND_ABORT_ALL,&err);
if(OS_ERR_NONE == err)
{
printf("atom1Section Aborded = %d\n",semAbortCnt);
}
*key = 0;
}
終止任務等待任務信號量
OS_ERR err;
CPU_BOOLEAN OSTaskQPendAbort (OS_TCB *p_tcb,//任務指針
OS_OPT opt, //OS_OPT_POST_NONE無指定
//OS_OPT_POST_NO_SCHED 取消等待信號量後禁止任務調度
OS_ERR *p_err)
終止任務等待事件標誌組
OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,//事件標誌組指針myEventFlag
OS_OPT opt,//OS_OPT_PEND_ABORT_1 僅終止等待該信號量的最高優先級任務
//OS_OPT_PEND_ABORT 終止所有等待該信號量的任務
//OS_OPT_POST_NO_SCHED 取消等待信號量後禁止任務調度
OS_ERR *p_err)
接收、發送任務信號量
OS_ERR err;
OS_SEM_CTR OSTaskSemPend (OS_TICK timeout,//等待信號量超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//是否選擇阻塞模式OS_OPT_PEND_BLOCKING無信號量時,任務掛起等待信號量
//OS_OPT_PEND_NON_BLOCKING無信號量任務直接返回
CPU_TS *p_ts,//NULL表示用戶不要求時間戳.發送信號量至任務恢復的時間delta=OS_TS_GET() - * P_ts;
OS_ERR *p_err)
OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb,//任務指針
OS_OPT opt,//OS_OPT_PEND_BLOCKING 無指定
//OS_OPT_PEND_NON_BLOCKING發送後禁止任務調度
OS_ERR *p_err
刪除互斥信號量
OS_ERR err;
OS_OBJ_QTY OSMutexDel (OS_MUTEX *p_mutex,//信號量指針
OS_OPT opt,//OS_OPT_DEL_NO_PEND 沒有任務等待這個信號量時才刪除
// OS_OPT_DEL_ALWAYS 不管是否有任務在等待信號量都刪除此信號量。等待該信號量的任務進入就緒狀態
OS_ERR *p_err)
刪除信號量
OS_ERR err;
OS_OBJ_QTY OSSemDel (OS_SEM *p_sem,//信號量指針
OS_OPT opt,//OS_OPT_DEL_NO_PEND 沒有任務等待這個信號量時才刪除
// OS_OPT_DEL_ALWAYS 不管是否有任務在等待信號量都刪除此信號量。等待該信號量的任務進入就緒狀態
OS_ERR *p_err)
if(*key == 'j')
{
printf("KeyHook Get key:%c\n",*key);
OSSemDel(&atom1Section,OS_OPT_DEL_ALWAYS,&err);
if(OS_ERR_NONE == err)
{
printf("atom1Section OSSemDel!\n");
}
*key = 0;
}
修改信號量計數值
OS_ERR err;
void OSSemSet (OS_SEM *p_sem,//信號量指針
OS_SEM_CTR cnt,//需設定的信號量計數值
OS_ERR *p_err)
修改任務信號量計數值
OS_ERR err;
OS_SEM_CTR OSTaskSemSet (OS_TCB *p_tcb,//任務指針
OS_SEM_CTR cnt,幾個信號量
OS_ERR *p_err))
創建事件標誌組
OS_FLAG_GRP myEventFlag;
OS_ERR err;
#define MY_EVENT_BIT00x01
#define MY_EVENT_BIT1 0x02
#define MY_EVENT_BIT2 0x04
void OSFlagCreate (OS_FLAG_GRP *p_grp,//事件標誌組指針myEventFlag;
CPU_CHAR *p_name,//調試用的字符串名稱
OS_FLAGS flags,//MY_EVENT_BIT0 MY_EVENT_BIT1 MY_EVENT_BIT2。。。
OS_ERR *p_err)
OSFlagCreate(&myEventFlag,"myEventFlag",0,&err);
刪除事件標誌組
OS_ERR err;
OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp, //事件標誌組指針myEventFlag
OS_OPT opt,//OS_OPT_DEL_NO_PEND 沒有任務等待這個事件標誌組時才刪除
//OS_OPT_DEL_ALWAYS 不管是否有任務在等待這個事件標誌組都刪除,若在等待的任務會進入就緒態
OS_ERR *p_err)
接收、發送事件標誌組
OS_ERR err;
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,//任務事件標誌組指針myEventFlag
OS_FLAGS flags,//MY_EVENT_BIT0、MY_EVENT_BIT1、MY_EVENT_BIT2。可以相加
OS_TICK timeout,//等待事件標誌組的超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//OS_OPT_PEND_FLAG_CLR_ALL 等待所有標誌組置0
OS_OPT_PEND_FLAG_CLR_ANY 等待標誌組任意一個標誌置0
OS_OPT_PEND_FLAG_SET_ALL 等代標誌組的所有標誌位被置1
OS_OPT_PEND_FLAG_SET_ANY 等待標誌組的任意一個標誌位被置1
若需條件滿足後事件標誌組的置1標誌位清零+ OS_OPT_PEND_FLAG_CONSUME
CPU_TS *p_ts,//NULL表示用戶不要求時間戳.發送信號量至任務恢復的時間delta=OS_TS_GET() - * P_ts;
OS_ERR *p_err)
OSFlagPend(&myEventFlag,MY_EVENT_BIT0 + MY_EVENT_BIT1,0,OS_OPT_PEND_FLAG_SET_ALL + OS_OPT_PEND_FLAG_CONSUME,NULL,&err);
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,//任務事件標誌組指針myEventFlag
OS_FLAGS flags,//填寫對哪些標誌位置1或置0
OS_OPT opt,//OS_OPT_POST_FLAG_SET 置1有效
//OS_OPT_POST_FLAG_CLR 置0有效
//若上面兩個選項 + OS_OPT_POST_NO_SCHED ,在發送信號後不會調用任務調度。
OS_ERR *p_err)
OSFlagPost(&myEventFlag,MY_EVENT_BIT2,OS_OPT_POST_FLAG_SET + OS_OPT_POST_NO_SCHED,&err);
獲取使任務進入就緒狀態的事件標誌組的標誌位
OS_FLAGS rdyFLags;
OS_ERR err;
rdyFLags = OSFlagPendGetFlagsRdy(&err);
printf("rdyFLags = %d\n",rdyFLags);
創建消息列隊
OS_Q myAdQ;
OS_ERR err;
void OSQCreate (OS_Q *p_q,//消息列隊指針
CPU_CHAR *p_name,//調試用字符串名稱
OS_MSG_QTY max_qty,消息列隊最大長度,必須非零
OS_ERR *p_err)
OSQCreate(&myAdQ,"myAdQ",10,&err);
接收、發送消息列隊
OS_ERR err;
void *OSQPend (OS_Q *p_q,//消息列隊指針
OS_TICK timeout,//等待消息隊列的超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//OS_OPT_PEND_BLOCKING一直等
//OS_OPT_PEND_NON_BLOCKING
OS_MSG_SIZE *p_msg_size,//指向一個變量,表示收到消息的大小
CPU_TS *p_ts,//NULL表示用戶不要求時間戳.發送信號量至任務恢復的時間delta=OS_TS_GET() - * P_ts;
OS_ERR *p_err)
pAdBuf = (CPU_INT08U *)OSQPend(&myAdQ,0,OS_OPT_PEND_BLOCKING,(OS_MSG_SIZE *)&nSize,NULL,&err);
for(i = 0;i < nSize;i ++)
{
if((i % 10) == 0)printf("\n");
printf("%02x ",pAdBuf[i]);
}
OS_ERR err;
void OSQPost (OS_Q *p_q,//消息列隊指針
void *p_void,//發送的內容
OS_MSG_SIZE msg_size,//設置消息的大小
OS_OPT opt, //OS_OPT_POST_FIFO先進先出
//OS_OPT_POST_LIFO後進後出
// + OS_OPT_POST_ALL將消息發送給所有等待該消息列隊的任務,若不設置,則發送給優先級最高的
// + OS_OPT_POST_NO_SCHED禁止本函數任務調度
OS_ERR *p_err)
OSQPost(&myAdQ,(void *)ucAdBuf[n],AD_BUF_SIZE,OS_OPT_POST_FIFO,&err);
終止任務等待消息隊列 返回操作成功的任務數量
OS_ERR err;
OS_OBJ_QTY OSQPendAbort (OS_Q *p_q,//消息隊列名稱
OS_OPT opt,//OS_OPT_PEND_ABORT_1 僅終止等待該信號量的最高優先級任務
//OS_OPT_PEND_ABORT 終止所有等待該信號量的任務
//OS_OPT_POST_NO_SCHED 取消等待信號量後禁止任務調度
OS_ERR *p_err)
清空消息隊列 返回釋放的消息數量
OS_MSG_QTY OSQFlush (OS_Q *p_q,//消息隊列指針
OS_ERR *p_err)
等待多個內核對象 返回等待中可用對象數目
OS_PEND_DATA mPendBuf[2];
OS_ERR err;
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl,//mPendBuf[2];
OS_OBJ_QTY tbl_size,//等待對象的數目
OS_TICK timeout,//等待消息隊列的超時時間,若超時則任務恢復執行不在掛起。若爲0,一直等。不精確
OS_OPT opt,//OS_OPT_PEND_BLOCKING一直等
//OS_OPT_PEND_NON_BLOCKING
OS_ERR *p_err)
nObjPend = OSPendMulti(mPendBuf,2,0,OS_OPT_PEND_BLOCKING,&err);
創建內存分區
OS_MEM myMemMng;
CPU_INT08U myMemPartion[4][100];
OS_ERR err;
void OSMemCreate (OS_MEM *p_mem,//內存控制塊指針
CPU_CHAR *p_name,調試用字符串名稱
void *p_addr,//創建數組(void *)&myMemPartion[0][0]
OS_MEM_QTY n_blks,//分區內內存塊數量
OS_MEM_SIZE blk_size,//每個內存塊大小
OS_ERR *p_err)
OSMemCreate(&myMemMng,"myMemMng",(void *)&myMemPartion[0][0],4,100,&err);
將內存塊返回內存分區
void OSMemPut (OS_MEM *p_mem,//內存控制塊指針myMemMng;
void *p_blk,//要釋放的內存塊
OS_ERR *p_err)
OSMemPut(&myMemMng,(void *)pAdBuf,&err);
從內存分區獲取控制塊 返回被分配內存塊指針
void *OSMemGet (OS_MEM *p_mem,//內存控制塊指針myMemMng;
OS_ERR *p_err)
pBuf = OSMemGet(&myMemMng,&err);