|
一、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 。所以这个测量的时间还是比较精确的。 |
|