OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2058|回复: 2

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

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-7-28
在线时间
25 小时
发表于 2016-7-31 08:57:36 | 显示全部楼层 |阅读模式
问题如题。在例程中修改发现可行,主要代码如下
[mw_shl_code=applescript,true]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[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
}


//开始任务任务函数
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[0],       
                 (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[0],       
                 (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[task1_num%14]); //填充区域
                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[13-task2_num%14]); //填充区域
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}[/mw_shl_code]

但是在另一个程序中CPU使用率经串口打印,显示为0主要代码如下
[mw_shl_code=applescript,true] 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[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          
}

//开始任务
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[0],       
                 (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[0],       
                 (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[0],       
                 (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[k1++]=aacx_filter;        z_G[k2++]=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
        }
       
}[/mw_shl_code]

请问这是为什么?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-7-28
在线时间
25 小时
 楼主| 发表于 2016-7-31 09:02:34 | 显示全部楼层
第一段代码串口打印部分在127行,第二段在160行
当局者迷,望大神指点迷津
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-7-28
在线时间
25 小时
 楼主| 发表于 2016-7-31 10:48:12 | 显示全部楼层
知道了,是优先级的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 20:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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