TEST16.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. /**************************************************************************/
  2. /* TEST10 - show BIOS clock impact of changing PC timer frequency         */
  3. /*        - eRTOS corrects the bios clock once per second so we don't     */
  4. /*          drift from the real time, even despite timer rate changes     */
  5. /**************************************************************************/
  6. #include <stdio.h>
  7. #include <dos.h>
  8. #include <rtos.h>
  9. long origdiff;
  10. DWORD far *sysclock = 0x46cL;
  11. DWORD bcd_decode( unsigned bcd )
  12. {
  13.     return(  ( bcd & 0x0f) + (( bcd >> 4 ) * 10 ));
  14. }
  15. DWORD read_rtc()
  16. {
  17.     DWORD hours, mins, secs;
  18.     struct REGPACK regs;
  19.     regs.r_ax = 0x200;
  20.     intr( 0x1a, &regs );
  21.     if ( regs.r_flags & 1 )     // error, no RTC
  22.         return( 0 );
  23.     hours = bcd_decode( regs.r_cx >> 8 );
  24.     mins = bcd_decode( regs.r_cx & 255 );
  25.     secs = bcd_decode( regs.r_dx >> 8 );
  26.     cprintf(" %2lu:%02lu:%02lu : ", hours, mins, secs );
  27.     return( (((hours * 60) + mins) * 60 + secs ) * 37287/2048);
  28. }
  29. void watch_diff( void )
  30. {
  31.     DWORD rtc, absdiff;
  32.     long diff;
  33.     int i;
  34.     while ( 1 ) {
  35.         rtc = read_rtc();
  36.         diff = rtc - *sysclock - origdiff;
  37.         absdiff = ( diff > 0 ) ? diff : -diff;
  38.         cprintf(" Difference = %c %li.%li secondsrn",
  39.             (diff > 0) ? ' ' : '-',
  40.             (absdiff * 2048)/37287, ((absdiff % 18) * 10)/18 );
  41.         if ( kbhit() ) exit( 0 );
  42.         rt_sleep( 300 );
  43.     }
  44. }
  45. void try_freq( int freq )
  46. {
  47.     printf("trying frequency : %un", freq );
  48.     rt_timerfreq( freq );
  49.     watch_diff();
  50. }
  51. int main(int argc, char **argv)
  52. {
  53.     rt_init(100);
  54.     puts("The PC BIOS clock used by DOS is normally updated by the 18.2 Hz IRQ 0");
  55.     puts("clock.  This is the same clock eRTOS changes if you use rt_timerfreq.");
  56.     puts("eRTOS uses an algorithm to simulate the 18.2 Hz clock, but it's not perfect.");
  57.     puts("This example shows the difference between the BIOS clock and the CMOS clock");
  58.     origdiff = read_rtc() - *sysclock;
  59.     try_freq( 100 );
  60. }