您的位置:首页 > 其它

OS_TaskStat 函数

2011-06-19 23:43 1501 查看
]//统计任务
//描述:uCOS-II有一个提供运行时间统计的任务。这个任务叫做OSTaskStat(),如果用户将系统定义常
//     数OS_TASK_STAT_EN(见文件OS_CFG.H)设为1,这个任务就会建立。一旦得到了允许,OSTaskStat()
//     每秒钟运行一次(见文件OS_CORE.C)计算当前的CPU利用率。换句话说,OSTaskStat()告诉用户
//	   应用程序使用了多少CPU时间,用百分比表示,这个值放在一个有符号8位整数OSCPUUsage中,精读
//	   度是1个百分点。)
//     如果用户应用程序打算使用统计任务,用户必须在初始化时建立一个唯一的任务,在这个任务中
//	   调用OSStatInit()(见文件OS_CORE.C)。换句话说,在调用系统启动函数OSStat()之前,用户初
//	   始代码必须先建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立
//	   应用程序中的其他任务
//
//                                         OSIdleCtr
//                OSCPUUsage = 100 * (1 - ------------)     (units are in %)
//                                        OSIdleCtrMax
//
//注意:1) uCOS-II已经将空闲任务的优先级设为最低,即OS_LOWEST_PRIO。统计任务的优先级设为次
//        低,OS_LOWEST_PRIO-1.
//	   2) 因为用户的应用程序必须先建立一个起始任务TaskStart()。在使用统计任务前,用户必须首
//	      先调用的是uCOS-II中的系统初始化函数OSInit().
//     3) 在创建统计任务之前,为了保持系统达到稳定状态,需要延迟5秒钟,你必须至少延时2秒钟
//	      以设定最大空闲计数值
#if OS_TASK_STAT_EN > 0							//允许生产OS_TaskStat()函数
void  OS_TaskStat (void *pdata)					//统计任务(指向一个数据结构)
{
#if OS_CRITICAL_METHOD == 3                      //中断函数被设定为模式3
    OS_CPU_SR  cpu_sr;
#endif    
    INT32U     run;								//定义一个运算变量
    INT32U     max;
    INT8S      usage;							//定义一个使用变量

    pdata = pdata;                               //数据结构指针等于本身,防止编译器不能编译
    while (OSStatRdy == FALSE) {				 //判断统计任务就绪标志OSStatRdy设为"假"
        OSTimeDly(2 * OS_TICKS_PER_SEC);         //延时2秒钟,等待统计任务做好准备
    }
    max = OSIdleCtrMax / 100L;
    for (;;) {									 //无限循环
        OS_ENTER_CRITICAL();					 //关闭中断
        OSIdleCtrRun = OSIdleCtr;                //获得当前的空闲计数值
        run          = OSIdleCtr;				 //并保存到运算变量中,以便运算
        OSIdleCtr    = 0L;                       //空闲计数器OSIdleCtr被清零
        OS_EXIT_CRITICAL();						 //打开中断
        if (max > 0L) {							 //如果最大空闲计数值>0
            usage = (INT8S)(100L - run / max);   //求CPU利用率
            if (usage >= 0) {                    //不能是负的百分值
                OSCPUUsage = usage;			     //如果是正的值,保存它
            } else {
                OSCPUUsage = 0;					 //如果是负值,设为0
            }
        } else {								 //如果最大空闲计数值不>0
            OSCPUUsage = 0;						 //如果是负值,设为0
            max        = OSIdleCtrMax / 100L;
        }
        OSTaskStatHook();                        //调用钩子函数,可添加自己的代码
        OSTimeDly(OS_TICKS_PER_SEC);             //调用延迟函数OSTimeDly()将自身延时1个时钟节拍以停止自身的运行
    }
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: