OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 978|回复: 5

UCOSII 统计任务

[复制链接]

  离线 

34

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-25
在线时间
1 小时
发表于 2014-5-16 09:56:52 | 显示全部楼层 |阅读模式
5金钱
要计算当前CUP利用率,是不是就使能OS_TASK_STAT_EN就可以了,并不要单独建立一个任务去执行OSTaskStat(),是这样吗?参看战舰例程,没有找到哪里执行了OSTaskStat()!

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]//开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; u8 err; pdata = pdata; msg_key=OSMboxCreate((void*)0); //创建消息邮箱 q_msg=OSQCreate(&MsgGrp[0],256); //创建消息队列 flags_key=OSFlagCreate(0,&err); //创建信号量集 OSStatInit(); //初始化统计任务.这里会延时1秒钟左右 OS_ENTER_CRITICAL(); //进入临界区(无法被中 ...
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117144
金钱
117144
注册时间
2010-12-1
在线时间
898 小时
发表于 2014-5-16 09:56:53 | 显示全部楼层
[C] 纯文本查看 复制代码
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
	u8 err;	    	    
	pdata = pdata; 	
	msg_key=OSMboxCreate((void*)0);		//创建消息邮箱
	q_msg=OSQCreate(&MsgGrp[0],256);	//创建消息队列
 	flags_key=OSFlagCreate(0,&err); 	//创建信号量集		  
	  
	OSStatInit();					//初始化统计任务.这里会延时1秒钟左右	
 	OS_ENTER_CRITICAL();			//进入临界区(无法被中断打断)    
 	OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);						   
 	OSTaskCreate(touch_task,(void *)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);	 				   
 	OSTaskCreate(qmsgshow_task,(void *)0,(OS_STK*)&QMSGSHOW_TASK_STK[QMSGSHOW_STK_SIZE-1],QMSGSHOW_TASK_PRIO);	 				   
 	OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);	 				   
 	OSTaskCreate(flags_task,(void *)0,(OS_STK*)&FLAGS_TASK_STK[FLAGS_STK_SIZE-1],FLAGS_TASK_PRIO);	 				   
 	OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);	 				   
 	OSTaskSuspend(START_TASK_PRIO);	//挂起起始任务.
	OS_EXIT_CRITICAL();				//退出临界区(可以被中断打断)
}
[C] 纯文本查看 复制代码
OSStatInit();					//初始化统计任务.这里会延时1秒钟左右	

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

9

主题

1178

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3692
金钱
3692
注册时间
2013-3-8
在线时间
460 小时
发表于 2014-5-21 22:18:50 | 显示全部楼层
是的。在程序里直接调用
回复

使用道具 举报

  离线 

8

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2017-7-6
在线时间
78 小时
发表于 2017-11-2 17:37:51 | 显示全部楼层
我看别人在博客里面写UCOSIII不是每秒调用一次void  OS_StatTask (void  *p_arg)吗?但是我找不到在哪调用它了,连带着统计任务的控制块OSStatTaskTCB也没有POST信号量,那它咋调用的列
回复

使用道具 举报

  离线 

8

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2017-7-6
在线时间
78 小时
发表于 2017-11-2 17:53:47 | 显示全部楼层
[C] 纯文本查看 复制代码
void  OS_StatTask (void  *p_arg)
{
#if OS_CFG_DBG_EN > 0u
#if OS_CFG_TASK_PROFILE_EN > 0u
    OS_CPU_USAGE usage;
    OS_CYCLES    cycles_total;
    OS_CYCLES    cycles_div;
    OS_CYCLES    cycles_mult;
    OS_CYCLES    cycles_max;
#endif
    OS_TCB      *p_tcb;
#endif
    OS_TICK      ctr_max;
    OS_TICK      ctr_mult;
    OS_TICK      ctr_div;
    OS_ERR       err;
    OS_TICK      dly;
    CPU_TS       ts_start;
    CPU_TS       ts_end;
    CPU_SR_ALLOC();



    (void)&p_arg;                                           /* Prevent compiler warning for not using 'p_arg'         */
    while (OSStatTaskRdy != DEF_TRUE) {
        OSTimeDly(2u * OSCfg_StatTaskRate_Hz,               /* Wait until statistic task is ready                     */
                  OS_OPT_TIME_DLY,
                  &err);
    }
    OSStatReset(&err);                                      /* Reset statistics                                       */

    dly = (OS_TICK)0;                                       /* Compute statistic task sleep delay                     */
    if (OSCfg_TickRate_Hz > OSCfg_StatTaskRate_Hz) {
        dly = (OS_TICK)(OSCfg_TickRate_Hz / OSCfg_StatTaskRate_Hz);
    }
    if (dly == (OS_TICK)0) {
        dly =  (OS_TICK)(OSCfg_TickRate_Hz / (OS_RATE_HZ)10);
    }

    while (DEF_ON) {
        ts_start        = OS_TS_GET();
#ifdef  CPU_CFG_INT_DIS_MEAS_EN
        OSIntDisTimeMax = CPU_IntDisMeasMaxGet();
#endif

        CPU_CRITICAL_ENTER();                               /* ----------------- OVERALL CPU USAGE ------------------ */
        OSStatTaskCtrRun   = OSStatTaskCtr;                 /* Obtain the of the stat counter for the past .1 second  */
        OSStatTaskCtr      = (OS_TICK)0;                    /* Reset the stat counter for the next .1 second          */
        CPU_CRITICAL_EXIT();



大家注意源码的倒数第三行注释,这给我感觉就是每秒都会调用一次,然后算出任务的CPU利用率,然后再把OSStatTaskCtr清零,我说的对吗,但我着实没找到在哪里每秒把该任务调用了一次。
回复

使用道具 举报

  离线 

8

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2017-7-6
在线时间
78 小时
发表于 2017-11-2 17:58:32 | 显示全部楼层
我刚说错了,应该是0.1S调用一次,所以分母的OSStatTaskCtrMax就是0.1S的OSStatTaskCtr计数值,也能够解释的通。
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-20 21:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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