天天看點

UCOS學習筆記

變量定義

//任務優先級
#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;
           
下一篇: ucos 學習