Ma-包 发表于 2016-7-30 22:33:18

CPU使用率用串口打印显示为0

问题如题。
CPU使用率正常的代码如下
/主函数
int main(void)
{
        OS_ERR err;
        CPU_SR_ALLOC();
       
        delay_init();//时钟初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
        uart_init(115200);   //串口初始化
        LED_Init();         //LED初始化       
        LCD_Init();                        //LCD初始化       
       
        POINT_COLOR = RED;
        LCD_ShowString(30,10,200,16,16,"ALIENTEK STM32F1");       
        LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-2");
        LCD_ShowString(30,50,200,16,16,"Task Suspend and Resume");
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,90,200,16,16,"2015/3/19");
       
        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,        //任务堆栈基地址
               (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
}


//开始任务任务函数
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();        //进入临界区
        //创建TASK1任务
        OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
                               (CPU_CHAR        * )"Task1 task",                
               (OS_TASK_PTR )task1_task,                        
               (void                * )0,                                       
               (OS_PRIO          )TASK1_TASK_PRIO,   
               (CPU_STK   * )&TASK1_TASK_STK,       
               (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
               (CPU_STK_SIZE)TASK1_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);                               
                               
        //创建TASK2任务
        OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
                               (CPU_CHAR        * )"task2 task",                
               (OS_TASK_PTR )task2_task,                        
               (void                * )0,                                       
               (OS_PRIO          )TASK2_TASK_PRIO,          
               (CPU_STK   * )&TASK2_TASK_STK,       
               (CPU_STK_SIZE)TASK2_STK_SIZE/10,       
               (CPU_STK_SIZE)TASK2_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);       
        OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);
        OS_CRITICAL_EXIT();        //退出临界区
//        OSTaskDel((OS_TCB*)0,&err);        //删除start_task任务自身
}


//task1任务函数
void task1_task(void *p_arg)
{
        u8 task1_num=0;
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
       
        POINT_COLOR = BLACK;
        OS_CRITICAL_ENTER();
        LCD_DrawRectangle(5,110,115,314);         //画一个矩形       
        LCD_DrawLine(5,130,115,130);                //画线
        POINT_COLOR = BLUE;
        LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
        OS_CRITICAL_EXIT();
        while(1)
        {
                task1_num++;        //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
                LED0= ~LED0;
                printf("任务1已经执行:%d次\r\n",task1_num);
                if(task1_num==5)
                {
                        OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
                        printf("任务1挂起了任务2!\r\n");
                }
                if(task1_num==10)
                {
                        OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);        //任务1运行10次后恢复任务2
                        printf("任务1恢复了任务2!\r\n");
                }
                printf("%d\r\n",OSStatTaskCPUUsage);
                LCD_Fill(6,131,114,313,lcd_discolor); //填充区域
                LCD_ShowxNum(86,111,task1_num,3,16,0x80);        //显示任务执行次数
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
               
        }
}

//task2任务函数
void task2_task(void *p_arg)
{
        u8 task2_num=0;
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
       
        POINT_COLOR = BLACK;
        OS_CRITICAL_ENTER();
        LCD_DrawRectangle(125,110,234,314); //画一个矩形       
        LCD_DrawLine(125,130,234,130);                //画线
        POINT_COLOR = BLUE;
        LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
        OS_CRITICAL_EXIT();
        while(1)
        {
                task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
                LED1=~LED1;
                printf("任务2已经执行:%d次\r\n",task2_num);
                LCD_ShowxNum(206,111,task2_num,3,16,0x80);//显示任务执行次数
                LCD_Fill(126,131,233,313,lcd_discolor); //填充区域
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}

类似地,在下面这段代码中显示异常,一直显示为0。请问是为什么?
int main(void)
{       
        OS_ERR err;
        CPU_SR_ALLOC();
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();                 //延时函数初始化          
        uart_init(500000);               //串口初始化为
        usmart_dev.init(72);                //初始化USMART
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        MPU_Init();                                        //初始化MPU6050
        TIM3_Int_Init(999,7199);//10Khz的计数频率,计数到1000为100ms
        TIM5_Int_Init(4999,7199);
        WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
       
        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,//堆栈基地址
                                  (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          
}

//开始任务
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();//进入临界区
        //创建TASK1任务
        OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
                               (CPU_CHAR        * )"Task1 task",                
               (OS_TASK_PTR )task1_task,                        
               (void                * )0,                                       
               (OS_PRIO          )TASK1_TASK_PRIO,   
               (CPU_STK   * )&TASK1_TASK_STK,       
               (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
               (CPU_STK_SIZE)TASK1_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);
        //创建TASK2任务
        OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
                               (CPU_CHAR        * )"task2 task",                
               (OS_TASK_PTR )task2_task,                        
               (void                * )0,                                       
               (OS_PRIO          )TASK2_TASK_PRIO,          
               (CPU_STK   * )&TASK2_TASK_STK,       
               (CPU_STK_SIZE)TASK2_STK_SIZE/10,       
               (CPU_STK_SIZE)TASK2_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);
        //创建WWDG任务
        OSTaskCreate((OS_TCB         * )&WWDGTaskTCB,               
                               (CPU_CHAR        * )"WWDG task",                
               (OS_TASK_PTR )wwdg_task,                        
               (void                * )0,                                       
               (OS_PRIO          )WWDG_TASK_PRIO,          
               (CPU_STK   * )&WWDG_TASK_STK,       
               (CPU_STK_SIZE)WWDG_TASK_SIZE/10,       
               (CPU_STK_SIZE)WWDG_TASK_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);
        OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);        //挂起开始任务
        OS_CRITICAL_EXIT();//退出临界区
//        OSTaskDel((OS_TCB*)0,&err);// 删除start任务自身
}

//wwdg任务函数
void wwdg_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg=p_arg;
        while(1)
        {
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}

//task1任务函数
void task1_task(void *p_arg)
{
        u8 t=0, report=1;                        //默认开启上报
        u8 k1=0, k2=0;
        u8 key;
        short aacx_filter;

        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg=p_arg;
       
        while(mpu_dmp_init())
        {
                printf("系统初始化中...\r\n");
        }
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                {
                        report=!report;
                }
                if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
                {
                        Kalman_filter();
                        aacx_filter= Amplitude_limit(9000,-7000,aacx);
                        gyroz_filter=Amplitude_limit(1000,0,gyroz);
                        aacx_filter=Sliding_average_x(aacx_filter);
                        gyroz_filter=Sliding_average_zgry(gyroz_filter);
                        x=aacx_filter;        z_G=gyroz_filter;
                        if(k1==3) k1=0;                if(k2==3) k2=0;
                        min=Min_value(aacx_filter);
                        max=Max_value(gyroz_filter);
//                        usart1_report_imu(aacx_filter,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
                        if((t%10)==0)
                        {
                                t=0;
                                LED0=!LED0;//LED闪烁
                        }
                }
                t++;
                printf("%d\r\n",OSStatTaskCPUUsage);
                OSTaskSuspend((OS_TCB*)&Task1_TaskTCB,&err);//将Task1挂起       
                OSTimeDlyHMSM(0,0,0,1,OS_OPT_TIME_HMSM_STRICT,&err); //延时1ms
        }        
}

void task2_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
       
        while(1)
        {
                Moni();
                if(allow_nod==1)
                {
                        allow_nod=0;
                        nod();
                }
                OSTaskResume((OS_TCB*)&Task1_TaskTCB,&err);//恢复Task1
        }
       
}

Ma-包 发表于 2016-7-31 09:01:03

第一段代码串口打印部分在第128行,第二段在160行。
当局者迷,不知道哪里出错了,希望朋友们指点迷津。

Ma-包 发表于 2016-7-31 10:42:52

知道了,是优先级的问题
页: [1]
查看完整版本: CPU使用率用串口打印显示为0