曲径通幽论坛

标题: PC_ElapsedStart() & PC_ElapsedStop() [打印本页]

作者: beyes    时间: 2009-4-14 01:44
标题: PC_ElapsedStart() & PC_ElapsedStop()
一、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 。所以这个测量的时间还是比较精确的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2