標(biāo)題: uCOS定時器任務(wù)不執(zhí)行是什么問題 [打印本頁]

作者: sr861126    時間: 2025-2-11 15:08
標(biāo)題: uCOS定時器任務(wù)不執(zhí)行是什么問題
熟悉的指點(diǎn)一下,謝謝!

//任務(wù)優(yōu)先級
#define START_TASK_PRIO                3
//任務(wù)堆棧大小        
#define START_STK_SIZE                 512
//任務(wù)控制塊
OS_TCB StartTaskTCB;
//任務(wù)堆棧        
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務(wù)函數(shù)
void start_task(void *p_arg);


//任務(wù)優(yōu)先級
#define InternalTemperature_TASK_PRIO                4
//任務(wù)堆棧大小        
#define InternalTemperature_STK_SIZE                 128
//任務(wù)控制塊
OS_TCB InternalTemperatureTaskTCB;
//任務(wù)堆棧        
CPU_STK InternalTemperature_TASK_STK[InternalTemperature_STK_SIZE];
void InternalTemperature_Task(void *p_arg);

//任務(wù)優(yōu)先級
#define DHT11_TASK_PRIO                5
//任務(wù)堆棧大小        
#define DHT11_STK_SIZE                 128
//任務(wù)控制塊
OS_TCB DHT11TaskTCB;
//任務(wù)堆棧        
CPU_STK DHT11_TASK_STK[InternalTemperature_STK_SIZE];
void DHT11_Task(void *p_arg);

//任務(wù)優(yōu)先級
#define LED_TASK_PRIO                6
//任務(wù)堆棧大小        
#define LED_STK_SIZE                 128
//任務(wù)控制塊
OS_TCB LEDTaskTCB;
//任務(wù)堆棧        
CPU_STK LED_TASK_STK[LED_STK_SIZE];
void LED_Task(void *p_arg);

//任務(wù)優(yōu)先級
#define TIM1_TASK_PRIO                7
//任務(wù)堆棧大小        
#define TIM1_STK_SIZE                 128
//任務(wù)控制塊
OS_TCB TIMT1askTCB;
//任務(wù)堆棧        
CPU_STK TIM_TASK_STK[TIM1_STK_SIZE];
void TIM_Task(void *p_arg);

OS_TMR tmr1;//定時器1
//OS_TMR tmr2;
void tmr1_callback(void *p_tmr,void *p_arg);//定時器1回調(diào)函數(shù)
//void tmr2_callback(void *p_tmr,void *p_arg);//定時器1回調(diào)函數(shù)



int main(void)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        
        delay_init();       //延時初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
        uart_init(115200);                 //串口初始化為115200
        LED_Init();                                  //初始化與LED連接的硬件接口
         T_Adc_Init();                                  //ADC初始化        
        
        
        OSInit(&err);                //初始化UCOSIII
        OS_CRITICAL_ENTER();//進(jìn)入臨界區(qū)
        
        OSTmrStart(&tmr1, &err); //開啟定時器

    OSTmrStop(&tmr1, OS_OPT_TMR_NONE, 0, &err);  //關(guān)閉定時器
        
        //創(chuàng)建開始任務(wù)1
        OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任務(wù)控制塊
                                 (CPU_CHAR        * )"start task",                 //任務(wù)名字
                 (OS_TASK_PTR )start_task,                         //任務(wù)函數(shù)
                 (void                * )0,                                        //傳遞給任務(wù)函數(shù)的參數(shù)
                 (OS_PRIO          )START_TASK_PRIO,     //任務(wù)優(yōu)先級
                 (CPU_STK   * )&START_TASK_STK[0],        //任務(wù)堆棧基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,        //任務(wù)堆棧深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,                //任務(wù)堆棧大小
                 (OS_MSG_QTY  )0,                                        //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時禁止接收消息
                 (OS_TICK          )0,                                        //當(dāng)使能時間片輪轉(zhuǎn)時的時間片長度,為0時為默認(rèn)長度,
                 (void           * )0,                                        //用戶補(bǔ)充的存儲區(qū)
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
                 (OS_ERR         * )&err);                                //存放該函數(shù)錯誤時的返回值
        
        //創(chuàng)建開始任務(wù)2
        OSTaskCreate((OS_TCB         * )&LEDTaskTCB,                //任務(wù)控制塊
                                 (CPU_CHAR        * )"start task",                 //任務(wù)名字
                 (OS_TASK_PTR )LED_Task,                         //任務(wù)函數(shù)
                 (void                * )0,                                        //傳遞給任務(wù)函數(shù)的參數(shù)
                 (OS_PRIO          )LED_TASK_PRIO,     //任務(wù)優(yōu)先級
                 (CPU_STK   * )&LED_TASK_STK[0],        //任務(wù)堆棧基地址
                 (CPU_STK_SIZE)LED_STK_SIZE/10,        //任務(wù)堆棧深度限位
                 (CPU_STK_SIZE)LED_STK_SIZE,                //任務(wù)堆棧大小
                 (OS_MSG_QTY  )0,                                        //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時禁止接收消息
                 (OS_TICK          )0,                                        //當(dāng)使能時間片輪轉(zhuǎn)時的時間片長度,為0時為默認(rèn)長度,
                 (void           * )0,                                        //用戶補(bǔ)充的存儲區(qū)
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
                 (OS_ERR         * )&err);                                //存放該函數(shù)錯誤時的返回值
                                         
                                                                 
                                                                 
                                                                 
                                                                 
        OS_CRITICAL_EXIT();        //退出臨界區(qū)         
        OSStart(&err);  //開啟UCOSIII
        
                                                                 
                                                                 
                                                                 
                                         
                                                                 
                                                                 while(1);
}

//開始任務(wù)函數(shù)
void start_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;

        CPU_Init();
               
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);          //統(tǒng)計任務(wù)               
#endif
        
#ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了測量中斷關(guān)閉時間
    CPU_IntDisMeasMaxCurReset();        
#endif
        
#if        OS_CFG_SCHED_ROUND_ROBIN_EN  //當(dāng)使用時間片輪轉(zhuǎn)的時候
         //使能時間片輪轉(zhuǎn)調(diào)度功能,時間片長度為1個系統(tǒng)時鐘節(jié)拍,既1*5=5ms
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif               
        
        OS_CRITICAL_ENTER();        //進(jìn)入臨界區(qū)
        //create InternalTemperature Task
        OSTaskCreate((OS_TCB         * )&InternalTemperatureTaskTCB,               
                                 (CPU_CHAR        * )"InternalTemperature task",                 
                 (OS_TASK_PTR )InternalTemperature_Task,                        
                 (void                * )0,                                       
                 (OS_PRIO          )InternalTemperature_TASK_PRIO,     
                 (CPU_STK   * )&InternalTemperature_TASK_STK[0],        
                 (CPU_STK_SIZE)InternalTemperature_STK_SIZE/10,        
                 (CPU_STK_SIZE)InternalTemperature_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                       
                 (void           * )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR         * )&err);                        

        OSTaskCreate((OS_TCB         * )&DHT11TaskTCB,               
                                 (CPU_CHAR        * )"DHT11 task",                 
                 (OS_TASK_PTR )DHT11_Task,                        
                 (void                * )0,                                       
                 (OS_PRIO          )DHT11_TASK_PRIO,     
                 (CPU_STK   * )&DHT11_TASK_STK[0],        
                 (CPU_STK_SIZE)DHT11_STK_SIZE/10,        
                 (CPU_STK_SIZE)DHT11_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                       
                 (void           * )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR         * )&err);                                                                                 
                                 
OSTaskCreate((OS_TCB         * )&LEDTaskTCB,               
                                 (CPU_CHAR        * )"LED task",                 
                 (OS_TASK_PTR )LED_Task,                        
                 (void                * )0,                                       
                 (OS_PRIO          )LED_TASK_PRIO,     
                 (CPU_STK   * )&LED_TASK_STK[0],        
                 (CPU_STK_SIZE)LED_STK_SIZE/10,        
                 (CPU_STK_SIZE)LED_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                       
                 (void           * )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR         * )&err);        
                                                                 
//創(chuàng)建定時器1
                                                                 
                                         
                OSTmrCreate((OS_TMR         * )&tmr1,                //任務(wù)控制塊
                                         (CPU_CHAR        * )"tmr1",                 //任務(wù)名字

                                                                 (OS_TICK  )20,                         //20*10=200ms

                 (OS_TICK  )100,                                        //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時禁止接收消息

                 (OS_OPT      )OS_OPT_TMR_PERIODIC, //任務(wù)選項(xiàng)
                 (OS_TMR_CALLBACK_PTR)tmr1_callback,
                                                                 (void *)0,
                                                                 (OS_ERR         * )&err);                                //存放該函數(shù)錯誤時的返回值                                                                 
        

OS_CRITICAL_EXIT();        //退出臨界區(qū)         

}


/**************************************************************
任務(wù)函數(shù)區(qū)
優(yōu)先級:4                                                                CPU溫度
優(yōu)先級:5                                                                DHT11環(huán)境溫度

**************************************************************/
//CPU溫度                                                                        優(yōu)先級:4
void InternalTemperature_Task(void *p_arg)
{
        OS_ERR err;
        p_arg = p_arg;
        while(1)
        {
                short temp;
               
                temp=Get_Temprate();        //得到溫度值
                if(temp<0)
                {
                        temp=-temp;               
                }

                printf("temp is %d \r\n",temp);
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時500ms
        }
}

//DHT11環(huán)境溫度                                                        優(yōu)先級:5
void DHT11_Task(void *p_arg)
{
        OS_ERR err;
        u8 temperature;              
        u8 humidity;
        p_arg = p_arg;
                 
        while(1)
        {
               
                DHT11_Read_Data(&temperature,&humidity);        //讀取溫濕度值
                printf("temp is %d, humidity is %d \r\n",temperature,humidity);
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時500ms
        }
}

// 定時器回調(diào)函數(shù)
void tmr1_callback(void *P_tmr,void *p_arg)
{
    // 定時器到期時執(zhí)行的操作
//    printf("Timer expired!\n");
u8 sakl;
        sakl++;
while(1)
{
LED0=~ LED0;
}


}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1