搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2016-7-30 22:33:18 | 显示全部楼层 |阅读模式
问题如题。
CPU使用率正常的代码如下
  1. /主函数
  2. int main(void)
  3. {
  4.         OS_ERR err;
  5.         CPU_SR_ALLOC();
  6.        
  7.         delay_init();  //时钟初始化
  8.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
  9.         uart_init(115200);   //串口初始化
  10.         LED_Init();         //LED初始化       
  11.         LCD_Init();                        //LCD初始化       
  12.        
  13.         POINT_COLOR = RED;
  14.         LCD_ShowString(30,10,200,16,16,"ALIENTEK STM32F1");       
  15.         LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-2");
  16.         LCD_ShowString(30,50,200,16,16,"Task Suspend and Resume");
  17.         LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
  18.         LCD_ShowString(30,90,200,16,16,"2015/3/19");
  19.        
  20.         OSInit(&err);                    //初始化UCOSIII
  21.         OS_CRITICAL_ENTER();        //进入临界区                         
  22.         //创建开始任务
  23.         OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块
  24.                                  (CPU_CHAR        * )"start task",                 //任务名字
  25.                  (OS_TASK_PTR )start_task,                         //任务函数
  26.                  (void                * )0,                                        //传递给任务函数的参数
  27.                  (OS_PRIO          )START_TASK_PRIO,     //任务优先级
  28.                  (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址
  29.                  (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位
  30.                  (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小
  31.                  (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
  32.                  (OS_TICK          )0,                                        //当使能时间片轮转时的时间片长度,为0时为默认长度,
  33.                  (void           * )0,                                        //用户补充的存储区
  34.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
  35.                  (OS_ERR         * )&err);                                //存放该函数错误时的返回值
  36.         OS_CRITICAL_EXIT();        //退出临界区         
  37.         OSStart(&err);      //开启UCOSIII
  38. }


  39. //开始任务任务函数
  40. void start_task(void *p_arg)
  41. {
  42.         OS_ERR err;
  43.         CPU_SR_ALLOC();
  44.         p_arg = p_arg;
  45.        
  46.         CPU_Init();
  47. #if OS_CFG_STAT_TASK_EN > 0u
  48.    OSStatTaskCPUUsageInit(&err);          //统计任务               
  49. #endif
  50.        
  51. #ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间
  52.     CPU_IntDisMeasMaxCurReset();       
  53. #endif
  54.        
  55. #if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
  56.          //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
  57.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
  58. #endif
  59.        
  60.         OS_CRITICAL_ENTER();        //进入临界区
  61.         //创建TASK1任务
  62.         OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
  63.                                  (CPU_CHAR        * )"Task1 task",                
  64.                  (OS_TASK_PTR )task1_task,                        
  65.                  (void                * )0,                                       
  66.                  (OS_PRIO          )TASK1_TASK_PRIO,     
  67.                  (CPU_STK   * )&TASK1_TASK_STK[0],       
  68.                  (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
  69.                  (CPU_STK_SIZE)TASK1_STK_SIZE,               
  70.                  (OS_MSG_QTY  )0,                                       
  71.                  (OS_TICK          )0,                                       
  72.                  (void           * )0,                                       
  73.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  74.                  (OS_ERR         * )&err);                               
  75.                                  
  76.         //创建TASK2任务
  77.         OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
  78.                                  (CPU_CHAR        * )"task2 task",                
  79.                  (OS_TASK_PTR )task2_task,                        
  80.                  (void                * )0,                                       
  81.                  (OS_PRIO          )TASK2_TASK_PRIO,            
  82.                  (CPU_STK   * )&TASK2_TASK_STK[0],       
  83.                  (CPU_STK_SIZE)TASK2_STK_SIZE/10,       
  84.                  (CPU_STK_SIZE)TASK2_STK_SIZE,               
  85.                  (OS_MSG_QTY  )0,                                       
  86.                  (OS_TICK          )0,                                       
  87.                  (void           * )0,                               
  88.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  89.                  (OS_ERR         * )&err);       
  90.         OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);
  91.         OS_CRITICAL_EXIT();        //退出临界区
  92. //        OSTaskDel((OS_TCB*)0,&err);        //删除start_task任务自身
  93. }


  94. //task1任务函数
  95. void task1_task(void *p_arg)
  96. {
  97.         u8 task1_num=0;
  98.         OS_ERR err;
  99.         CPU_SR_ALLOC();
  100.         p_arg = p_arg;
  101.        
  102.         POINT_COLOR = BLACK;
  103.         OS_CRITICAL_ENTER();
  104.         LCD_DrawRectangle(5,110,115,314);         //画一个矩形       
  105.         LCD_DrawLine(5,130,115,130);                //画线
  106.         POINT_COLOR = BLUE;
  107.         LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  108.         OS_CRITICAL_EXIT();
  109.         while(1)
  110.         {
  111.                 task1_num++;        //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
  112.                 LED0= ~LED0;
  113.                 printf("任务1已经执行:%d次\r\n",task1_num);
  114.                 if(task1_num==5)
  115.                 {
  116.                         OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
  117.                         printf("任务1挂起了任务2!\r\n");
  118.                 }
  119.                 if(task1_num==10)
  120.                 {
  121.                         OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);        //任务1运行10次后恢复任务2
  122.                         printf("任务1恢复了任务2!\r\n");
  123.                 }
  124.                 printf("%d\r\n",OSStatTaskCPUUsage);
  125.                 LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  126.                 LCD_ShowxNum(86,111,task1_num,3,16,0x80);        //显示任务执行次数
  127.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
  128.                
  129.         }
  130. }

  131. //task2任务函数
  132. void task2_task(void *p_arg)
  133. {
  134.         u8 task2_num=0;
  135.         OS_ERR err;
  136.         CPU_SR_ALLOC();
  137.         p_arg = p_arg;
  138.        
  139.         POINT_COLOR = BLACK;
  140.         OS_CRITICAL_ENTER();
  141.         LCD_DrawRectangle(125,110,234,314); //画一个矩形       
  142.         LCD_DrawLine(125,130,234,130);                //画线
  143.         POINT_COLOR = BLUE;
  144.         LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  145.         OS_CRITICAL_EXIT();
  146.         while(1)
  147.         {
  148.                 task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  149.                 LED1=~LED1;
  150.                 printf("任务2已经执行:%d次\r\n",task2_num);
  151.                 LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数
  152.                 LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  153.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
  154.         }
  155. }
复制代码


类似地,在下面这段代码中显示异常,一直显示为0。请问是为什么?
  1. int main(void)
  2. {         
  3.         OS_ERR err;
  4.         CPU_SR_ALLOC();
  5.          
  6.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  7.         delay_init();                     //延时函数初始化          
  8.         uart_init(500000);                 //串口初始化为
  9.         usmart_dev.init(72);                //初始化USMART
  10.         LED_Init();                                          //初始化与LED连接的硬件接口
  11.         KEY_Init();                                        //初始化按键
  12.         MPU_Init();                                        //初始化MPU6050
  13.         TIM3_Int_Init(999,7199);//10Khz的计数频率,计数到1000为100ms
  14.         TIM5_Int_Init(4999,7199);
  15.         WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
  16.        
  17.         OSInit(&err);  //初始化UCOSIII
  18.         OS_CRITICAL_ENTER();  //进入临界区
  19.         //创建开始任务
  20.         OSTaskCreate ((OS_TCB       *)&StartTaskTCB,
  21.                   (CPU_CHAR     *)"start task",
  22.                   (OS_TASK_PTR   )start_task,
  23.                   (void         *)0,
  24.                   (OS_PRIO       )START_TASK_PRIO,  //优先级
  25.                   (CPU_STK      *)&START_TASK_STK[0],  //堆栈基地址
  26.                                   (CPU_STK_SIZE  )START_STK_SIZE/10,  //堆栈深度限位
  27.                                   (CPU_STK_SIZE  )START_STK_SIZE,
  28.                                   (OS_MSG_QTY    )0,  //任务背部消息队列能够接收的最大消息数目,为0时禁止接收消息
  29.                                   (OS_TICK       )0,  //当使能时间片轮转时的时间片长度,为0时为默认长度
  30.                                   (void         *)0,
  31.                                   (OS_OPT        )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,  //任务选项
  32.                                   (OS_ERR       *)&err);
  33.         OS_CRITICAL_EXIT();        //退出临界区         
  34.         OSStart(&err);      //开启UCOSIII          
  35. }

  36. //开始任务
  37. void start_task(void *p_arg)
  38. {
  39.         OS_ERR err;
  40.         CPU_SR_ALLOC();
  41.         p_arg=p_arg;
  42.        
  43.         CPU_Init();
  44. #if OS_CFG_STAT_TASK_EN > 0u
  45.    OSStatTaskCPUUsageInit(&err);          //统计任务               
  46. #endif
  47.        
  48. #ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间
  49.     CPU_IntDisMeasMaxCurReset();       
  50. #endif
  51.        
  52. #if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
  53.          //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
  54.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
  55. #endif
  56.        
  57.         OS_CRITICAL_ENTER();  //进入临界区
  58.         //创建TASK1任务
  59.         OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
  60.                                  (CPU_CHAR        * )"Task1 task",                
  61.                  (OS_TASK_PTR )task1_task,                        
  62.                  (void                * )0,                                       
  63.                  (OS_PRIO          )TASK1_TASK_PRIO,     
  64.                  (CPU_STK   * )&TASK1_TASK_STK[0],       
  65.                  (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
  66.                  (CPU_STK_SIZE)TASK1_STK_SIZE,               
  67.                  (OS_MSG_QTY  )0,                                       
  68.                  (OS_TICK          )0,                                       
  69.                  (void           * )0,                                       
  70.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  71.                  (OS_ERR         * )&err);
  72.         //创建TASK2任务
  73.         OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
  74.                                  (CPU_CHAR        * )"task2 task",                
  75.                  (OS_TASK_PTR )task2_task,                        
  76.                  (void                * )0,                                       
  77.                  (OS_PRIO          )TASK2_TASK_PRIO,            
  78.                  (CPU_STK   * )&TASK2_TASK_STK[0],       
  79.                  (CPU_STK_SIZE)TASK2_STK_SIZE/10,       
  80.                  (CPU_STK_SIZE)TASK2_STK_SIZE,               
  81.                  (OS_MSG_QTY  )0,                                       
  82.                  (OS_TICK          )0,                                       
  83.                  (void           * )0,                               
  84.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  85.                  (OS_ERR         * )&err);
  86.         //创建WWDG任务
  87.         OSTaskCreate((OS_TCB         * )&WWDGTaskTCB,               
  88.                                  (CPU_CHAR        * )"WWDG task",                
  89.                  (OS_TASK_PTR )wwdg_task,                        
  90.                  (void                * )0,                                       
  91.                  (OS_PRIO          )WWDG_TASK_PRIO,            
  92.                  (CPU_STK   * )&WWDG_TASK_STK[0],       
  93.                  (CPU_STK_SIZE)WWDG_TASK_SIZE/10,       
  94.                  (CPU_STK_SIZE)WWDG_TASK_SIZE,               
  95.                  (OS_MSG_QTY  )0,                                       
  96.                  (OS_TICK          )0,                                       
  97.                  (void           * )0,                               
  98.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  99.                  (OS_ERR         * )&err);
  100.         OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);        //挂起开始任务
  101.         OS_CRITICAL_EXIT();  //退出临界区
  102. //        OSTaskDel((OS_TCB*)0,&err);  // 删除start任务自身
  103. }

  104. //wwdg任务函数
  105. void wwdg_task(void *p_arg)
  106. {
  107.         OS_ERR err;
  108.         CPU_SR_ALLOC();
  109.         p_arg=p_arg;
  110.         while(1)
  111.         {
  112.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
  113.         }
  114. }

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

  122.         OS_ERR err;
  123.         CPU_SR_ALLOC();
  124.         p_arg=p_arg;
  125.        
  126.         while(mpu_dmp_init())
  127.         {
  128.                 printf("系统初始化中...\r\n");
  129.         }
  130.         while(1)
  131.         {
  132.                 key=KEY_Scan(0);
  133.                 if(key==KEY0_PRES)
  134.                 {
  135.                         report=!report;
  136.                 }
  137.                 if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  138.                 {
  139.                         Kalman_filter();
  140.                         aacx_filter= Amplitude_limit(9000,-7000,aacx);
  141.                         gyroz_filter=Amplitude_limit(1000,0,gyroz);
  142.                         aacx_filter=Sliding_average_x(aacx_filter);
  143.                         gyroz_filter=Sliding_average_zgry(gyroz_filter);
  144.                         x[k1++]=aacx_filter;        z_G[k2++]=gyroz_filter;
  145.                         if(k1==3) k1=0;                if(k2==3) k2=0;
  146.                         min=Min_value(aacx_filter);
  147.                         max=Max_value(gyroz_filter);
  148. //                        usart1_report_imu(aacx_filter,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  149.                         if((t%10)==0)
  150.                         {
  151.                                 t=0;
  152.                                 LED0=!LED0;//LED闪烁
  153.                         }
  154.                 }
  155.                 t++;
  156.                 printf("%d\r\n",OSStatTaskCPUUsage);
  157.                 OSTaskSuspend((OS_TCB*)&Task1_TaskTCB,&err);  //将Task1挂起       
  158.                 OSTimeDlyHMSM(0,0,0,1,OS_OPT_TIME_HMSM_STRICT,&err); //延时1ms
  159.         }        
  160. }

  161. void task2_task(void *p_arg)
  162. {
  163.         OS_ERR err;
  164.         CPU_SR_ALLOC();
  165.         p_arg = p_arg;
  166.        
  167.         while(1)
  168.         {
  169.                 Moni();
  170.                 if(allow_nod==1)
  171.                 {
  172.                         allow_nod=0;
  173.                         nod();
  174.                 }
  175.                 OSTaskResume((OS_TCB*)&Task1_TaskTCB,&err);  //恢复Task1
  176.         }
  177.        
  178. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2016-7-31 09:01:03 | 显示全部楼层
第一段代码串口打印部分在第128行,第二段在160行。
当局者迷,不知道哪里出错了,希望朋友们指点迷津。

出0入0汤圆

 楼主| 发表于 2016-7-31 10:42:52 | 显示全部楼层
知道了,是优先级的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 04:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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