uC/OS-III 函數整理

學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],/*給任務分配的RAM0爲首地址*/

                 (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_Period16位的數

{

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.cOS_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_BIT0MY_EVENT_BIT1MY_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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章