曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 8378|回复: 0
打印 上一主题 下一主题

PC_ElapsedStart() & PC_ElapsedStop()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 01:44:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、PC_ElapsedStart()
功能:配置相关的寄存器并启动 Timer #2
void PC_ElapsedStart(void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif  
    INT8U      data;


    OS_ENTER_CRITICAL();
    data  = (INT8U)inp(0x61);                              /*读0x61端口*/
    data &= 0xFE;                                                /*61H 的第 0 位 D.0 为 计数器 2 的允许信号*/
    outp(0x61, data);                                           /* 送往 61H 端口,禁止 Timer #2 */
  

   /* 0x43 为8254 的配置端口,此处置 8254 Timer 2# 工作在 MODE0 */

    outp(TICK_T0_8254_CWR,  TICK_T0_8254_CTR2_MODE0);    

    outp(TICK_T0_8254_CTR2, 0xFF);
    outp(TICK_T0_8254_CTR2, 0xFF);          /* 装 0xFFFF 到锁存器 */
    data |= 0x01;                                                /*启动 Timer */
    outp(0x61, data);
    OS_EXIT_CRITICAL();
}
二、PC_ElapsedStop()功能:计算
代码:计算逝去的时间
INT16U PC_ElapsedStop(void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif  
    INT8U      data;
    INT8U      low;
    INT8U      high;
    INT16U     cnts;


    OS_ENTER_CRITICAL();
    data  = (INT8U)inp(0x61);                                       /* Disable the timer */
    data &= 0xFE;                   
    outp(0x61, data);  
    outp(TICK_T0_8254_CWR, TICK_T0_8254_CTR2_LATCH); 
  

    low  = inp(TICK_T0_8254_CTR2);        /* 读锁存器 */
    high = inp(TICK_T0_8254_CTR2);

  /*因为 timer #2 是减计数,故用 0xFFFF 减去读取出的锁存器中的值 = 逝去的时间*/
    cnts = (INT16U)0xFFFF - (((INT16U)high << 8) + (INT16U)low);
    OS_EXIT_CRITICAL();

  /* 65536 * (1/1.19318)ms = 54926ms */
    return ((INT16U)((INT32U)cnts * 54926L >> 16) - PC_ElapsedOverhead);

说明:PC_ElapsedStart() 与 PC_ElapsedStop() 函数联合使用,可以测量程序代码的执行时间。在调用PC_ElapsedStart() 或 PC_ElapsedStop()之前,一定要调用PC_ElapsedInit()!这个初始化有什么玄机呢?看代码:

void PC_ElapsedInit(void)
{
    PC_ElapsedOverhead = 0;    /*初始化全局变量 PC_ElapsedOverhead */
    PC_ElapsedStart();                /*开始计数*/
    PC_ElapsedOverhead = PC_ElapsedStop();   /*在给PC_ElapsedOverhead 赋值 */
对 PC_ElapsedInit() 函数的说明:
PC_ElapsedOverhead 这是个全局变量,在经PC_ElapsedInit() 之后值就定下来了。其值表示的是一个时间。这个时间就是 Timer 2# 配置好并开始计数后,接着执行PC_ElapsedStop() 直至 PC_ElapsedStop() 返回时,其间所执行的代码所花的时间!
如一段需测量的程序:
PC_ElapsedStart()
/*.......测量的程序.......*/
PC_ElapsedStop()
如上,总共花去的时间为: PC_ElapsedStart() 中 OS_EXIT_CRITICAL() 的时间 +  需测量的程序的时间+ 包括PC_ElapsedStop()      中 outp(TICK_T0_8254_CWR,TICK_T0_8254_CTR2_LATCH) 之前所有语句的时间。也就是说,在这个总的时间中,去掉“需测量的程序的时间”后的时间也就是PC_ElapsedOverhead 。所以这个测量的时间还是比较精确的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 11:18 , Processed in 0.064014 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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