變量定義
//任務優先級
#define START_TASK_PRIO 3
//任務堆棧大小
#define START_STK_SIZE 1024
//任務控制塊
OS_TCB StartTaskTCB;
//任務堆棧
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務函數
void start_task(void *p_arg);
初始化過程
OS_ERR err;
CPU_SR_ALLOC();
Systick_Init(72); //設定時鐘
OSInit(&err); //初始化UCOSIII
進入臨界區
OS_CRITICAL_ENTER();
建立開始任務
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務控制塊
(CPU_CHAR * )"start task", //任務名字
(OS_TASK_PTR )start_task, //任務函數
(void * )0, //傳遞給任務函數的參數
(OS_PRIO )START_TASK_PRIO, //任務優先級
(CPU_STK * )&START_TASK_STK[0], //任務堆棧基位址
(CPU_STK_SIZE)START_STK_SIZE/10, //任務堆棧深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任務堆棧大小
(OS_MSG_QTY )0, //任務内部消息隊列能夠接收的最大消息數目,為0時禁止接收消息
(OS_TICK )0, //當使能時間片輪轉時的時間片長度,為0時為預設長度
(void * )0, //使用者補充的存儲區
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務選項
(OS_ERR * )&err); //存放該函數錯誤時的傳回值
退出臨界
OS_CRITICAL_EXIT(); //退出臨界區
OSStart(&err); //開啟UCOSIII
開始任務函數
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //統計任務
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測量中斷關閉時間
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //當使用時間片輪轉的時候
//使能時間片輪轉排程功能,時間片長度為1個系統時鐘節拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
建立功能任務
類似于前面建立開始任務
挂起開始任務
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起開始任務
OS_CRITICAL_EXIT(); //退出臨界區
任務函數
//LED1任務
void led1_task(void *p_arg)
{
OS_ERR err;
while(1)
{
led1 = !led1;
OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_PERIODIC,&err);//延時200ms
}
}
挂起,恢複,删除
挂起
OS_TaskSuspend((OS_TCB*)&Led2TaskTCB,&err);//挂起LED2任務
恢複
OS_TaskResume((OS_TCB*)&Led2TaskTCB,&err);//恢複LED2任務
删除
OSTaskDel((OS_TCB*)&Led2TaskTCB,&err);//删除LED2任務
時間管理
擷取目前時鐘節拍值
ticks=OSTimeGet(&err);
延時節拍數
OSTimeDly(1000,OS_OPT_TIME_DLY,&err);
延時時分秒毫秒
OSTimeDlyHMSM(0,0,6,0,OS_OPT_TIME_DLY,&err);
軟體定時器使用
建立軟體定時器
OSTmrCreate((OS_TMR *)&my_tmr, //軟體定時器對象
(CPU_CHAR *)"MyTmr", //命名軟體定時器
(OS_TICK )10, //定時器初始值,依10Hz時基計算,即為1s
(OS_TICK )10, //定時器周期重載值,依10Hz時基計算,即為1s
(OS_OPT )OS_OPT_TMR_PERIODIC, //周期性定時
(OS_TMR_CALLBACK_PTR )MyTmrCallback, //回調函數
(void *)"Timer Over!", //傳遞實參給回調函數
(OS_ERR *)err); //傳回錯誤類型
啟動軟體定時器
OSTmrStart((OS_TMR *)&my_tmr,
(OS_ERR *)err);
删除軟體定時器
OSTmrDel(&my_tmr,&err);
信号量
建立多值信号量 key_sem
OSSemCreate((OS_SEM *)&key_sem, //指向信号量變量的指針
(CPU_CHAR *)"key_sem", //信号量的名字
(OS_SEM_CTR )0, //信号量這裡是訓示事件發生,是以指派為0,表示事件還沒有發生
(OS_ERR *)&err); //錯誤類型
等待信号量
OSSemPend(&key_sem,0,OS_OPT_PEND_BLOCKING,&ts_sem_post,&err);
發送信号量
OSSemPost(&key_sem,OS_OPT_POST_ALL,&err);
建立互斥信号量My_mutex
OSMutexCreate((OS_MUTEX *)&My_mutex, //指向信号量變量的指針
(CPU_CHAR *)"My_mutex", //信号量的名字
(OS_ERR *)&err); //錯誤類型
等待互斥信号量
OSMutexPend(&My_mutex,0,OS_OPT_PEND_BLOCKING,0,&err);
發送互斥信号量
OSMutexPost(&My_mutex,OS_OPT_POST_NONE,&err);
消息隊列
建立消息隊列
OSQCreate(&my_q,"my_q",10,&err);
發送消息
OSQPost(&my_q,
"www.prechin.cn",
sizeof("www.prechin.cn"),
OS_OPT_POST_FIFO | OS_OPT_POST_ALL,
&err
);
事件标志組
可将多個事件同步
等待多個核心對象
OSPendMulti(multi_pend_data,2,0,OS_OPT_PEND_BLOCKING,&err);
初始化等待的多個核心對象
multi_pend_data[0].PendObjPtr=(OS_PEND_OBJ *)&my_sem;
multi_pend_data[1].PendObjPtr=(OS_PEND_OBJ *)&my_q;