找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 505|回复: 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;
}


}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表