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();
}
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);
void PC_ElapsedInit(void) { PC_ElapsedOverhead = 0; /*初始化全局变量 PC_ElapsedOverhead */ PC_ElapsedStart(); /*开始计数*/ PC_ElapsedOverhead = PC_ElapsedStop(); /*在给PC_ElapsedOverhead 赋值 */ } |
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |