久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 482|回復: 0
打印 上一主題 下一主題
收起左側

uCOS定時器任務不執行是什么問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:302293 發表于 2025-2-11 15:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
熟悉的指點一下,謝謝!

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


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

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

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

//任務優先級
#define TIM1_TASK_PRIO                7
//任務堆棧大小        
#define TIM1_STK_SIZE                 128
//任務控制塊
OS_TCB TIMT1askTCB;
//任務堆棧        
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回調函數
//void tmr2_callback(void *p_tmr,void *p_arg);//定時器1回調函數



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

    OSTmrStop(&tmr1, OS_OPT_TMR_NONE, 0, &err);  //關閉定時器
        
        //創建開始任務1
        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);                                //存放該函數錯誤時的返回值
        
        //創建開始任務2
        OSTaskCreate((OS_TCB         * )&LEDTaskTCB,                //任務控制塊
                                 (CPU_CHAR        * )"start 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,                                        //任務內部消息隊列能夠接收的最大消息數目,為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
        
                                                                 
                                                                 
                                                                 
                                         
                                                                 
                                                                 while(1);
}

//開始任務函數
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);          //統計任務               
#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_CRITICAL_ENTER();        //進入臨界區
        //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);        
                                                                 
//創建定時器1
                                                                 
                                         
                OSTmrCreate((OS_TMR         * )&tmr1,                //任務控制塊
                                         (CPU_CHAR        * )"tmr1",                 //任務名字

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

                 (OS_TICK  )100,                                        //任務內部消息隊列能夠接收的最大消息數目,為0時禁止接收消息

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

OS_CRITICAL_EXIT();        //退出臨界區         

}


/**************************************************************
任務函數區
優先級:4                                                                CPU溫度
優先級:5                                                                DHT11環境溫度

**************************************************************/
//CPU溫度                                                                        優先級: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環境溫度                                                        優先級: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
        }
}

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


}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91麻豆精品国产91久久久久久 | 成年人在线观看 | 国产欧美精品一区二区三区 | 国内精品视频 | 四虎永久免费影院 | 欧美一区二区三区在线观看 | 91麻豆精品国产91久久久久久久久 | 在线免费黄色小视频 | 亚洲欧美日韩系列 | www久久国产 | 亚洲国产精品久久久久 | 国产免费一二三区 | 欧美国产日韩在线观看 | 午夜视频一区二区三区 | 国产精品久久久久久久久久久久久久 | 亚洲视频在线看 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 手机在线不卡av | 午夜欧美a级理论片915影院 | 国产日韩一区 | 国产在线一区二区三区 | 欧美成人精品一区二区男人看 | 欧美 日韩 视频 | 国产精品久久久久久久久久久久 | 欧美日韩在线观看视频 | 黄 色 毛片免费 | 欧美精品第三页 | 国产成人a亚洲精品 | 亚洲福利网站 | 能看的av | 三级成人片 | 日韩av在线一区二区三区 | 国产激情在线 | www视频在线观看 | 国产成人99久久亚洲综合精品 | 五月婷婷中文 | 精品一区二区av | 国产亚洲精品久久久久久豆腐 | 毛片高清 | 国产成人精品区一区二区不卡 | 中文字幕免费在线 |