BIOS: RTC相关编码学习记录

146 阅读1分钟
  • 前言
    • 培训期过, 开始给师兄帮倒忙了. 其中一项呢, 就是写一个KHz级别的方波, 通过GP62引脚输出,参照SIOGPIO芯片手册. 其间尝试了两种方法,
      • 1:直接写一个死循环,在循环中用Stall()函数写延时;
      • 2:用定时器,前面绑回调函数,后面SetTimer().
    • 拿示波器一测, 方法二寄了, 波形调不出来. 方法一有时延, 也明显. 这个时延需要计算一下, 大意是去通过RTC计算. 一通查找, 公式大概是算对了, 再理一点RTC相关知识.

(一) RTC定义

    • RTC, 实时计数器(Real Time Clock). 通过RTC计算时间差,其实是获得时间戳, 再做减法.
    • 硬件对应的是BIOS主板上面的纽扣电池, 叫做RTC电池或者CMOS电池. 圆圆的那个有嵌入的卡槽, 小板子上是另一种,是黄色胶带包着的很扁.

  • (二) RTC应用
    • 比如, 我写循环, 用Stall()写延时. 但是Stall()调用等也需要时间, 这就造成了误差. 事实上是MS级别的时延. 我要清晰测得这个误差, 可以获取Stall前后时间戳, 再进行计算. 代码如下:
    Data = IoRead8(0x705);
    while (1)
    {
        IoWrite8(0x705, 0x02 | Data);
        gBS->Stall(250);
        IoWrite8(0x705, 0xEB & Data);
        gBS->Stall(250);
        if (__kbhit(&Key))
        {
            Tsc2 = EfiReadTsc();
            break;
        }
    }
    tarT = (Tsc2 - Tsc1) / 0x18 / (100 * 1000);
    • 0x18出处找不到了.
    • 可在EDK2的TscTimerLib下找到相应startTSC和endTSC.

  • (三) RTC时序
  • 没学通,待补充.