123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- MODULE GlobalTimer;
- IMPORT Platform, SYSTEM, Bit, KernelUtils, Trace;
- CONST
- COMPAUTOINC = 3;
- IRQENABLE = 2;
- COMPENABLE = 1;
- TIMERENABLE = 0;
-
- VAR
- PROCEDURE EnableTimer*();
- VAR
- reg : SET;
- BEGIN
- SYSTEM.PUT32( Platform.GlobalTimerCounterRegister0, 0 );
- SYSTEM.PUT32( Platform.GlobalTimerCounterRegister1, 0 );
- SYSTEM.GET( Platform.GlobalTimerControlRegister, reg );
- reg := reg + { TIMERENABLE };
- SYSTEM.PUT( Platform.GlobalTimerControlRegister, reg );
- END EnableTimer;
- PROCEDURE DisableTimer*();
- VAR
- reg : SET;
- BEGIN
- SYSTEM.GET( Platform.GlobalTimerControlRegister, reg );
- reg := reg - { TIMERENABLE };
- SYSTEM.PUT( Platform.GlobalTimerControlRegister, reg );
- END DisableTimer;
- PROCEDURE ShowTimer*();
- CONST
- COFF = 22;
-
- VAR
- sreg : SET;
- reg : LONGINT;
- BEGIN
- Trace.Ln;
- Trace.Ln;
- Trace.StringLn("*** Global Timer Configuration ***");
- Trace.Ln;
- Trace.Ln;
-
- (* load the timer control register *)
- SYSTEM.GET( Platform.GlobalTimerControlRegister, sreg );
-
- (* show the boolean flags of the timer *)
- Trace.StringA("Timer Enabled", COFF, TRUE );
- IF ( TIMERENABLE IN sreg ) THEN
- Trace.StringLn("TRUE");
- ELSE
- Trace.StringLn("FALSE");
- END;
- Trace.StringA("Compare Enabled", COFF, TRUE );
- IF ( COMPENABLE IN sreg ) THEN
- Trace.StringLn("TRUE");
- ELSE
- Trace.StringLn("FALSE");
- END;
- Trace.StringA("IRQ Enabled", COFF, TRUE );
- IF ( IRQENABLE IN sreg ) THEN
- Trace.StringLn("TRUE");
- ELSE
- Trace.StringLn("FALSE");
- END;
-
- Trace.StringA("Auto Inc Enabled", COFF, TRUE );
- IF ( COMPAUTOINC IN sreg ) THEN
- Trace.StringLn("TRUE");
- ELSE
- Trace.StringLn("FALSE");
- END;
-
-
- (* extract the divider used for the counter *)
- reg := KernelUtils.GetSetAsInteger( sreg );
- reg := reg DIV 100H;
- reg := Bit.AND( reg, 0FFH );
- Trace.StringA("Timer Prescaler", COFF, TRUE );
- Trace.Int( reg, 3 ); Trace.Ln;
- END ShowTimer;
- PROCEDURE GetTimerValue( VAR upper, lower : LONGINT );
- VAR
- high, low : LONGINT;
- tmp : LONGINT;
- running : BOOLEAN;
- BEGIN
- high := 0;
- running := TRUE;
- SYSTEM.GET( Platform.GlobalTimerCounterRegister1, high );
-
- WHILE ( running ) DO
- SYSTEM.GET( Platform.GlobalTimerCounterRegister0, low );
- SYSTEM.GET( Platform.GlobalTimerCounterRegister1, tmp );
- IF ( tmp = high ) THEN
- running := FALSE;
- ELSE
- high := tmp;
- END;
- END;
-
- (* assign the values and exit *)
- upper := high;
- lower := low;
-
- END GetTimerValue;
- PROCEDURE GetTimerLowValue*() : LONGINT;
- VAR
- high, low : LONGINT;
- BEGIN
- GetTimerValue( high, low );
- RETURN low;
- END GetTimerLowValue;
- PROCEDURE GetTime*(): HUGEINT;
- TYPE
- Hugeint = ARRAY 2 OF LONGINT;
- VAR
- time: HUGEINT;
- BEGIN
- GetTimerValue(SYSTEM.VAL(Hugeint, time)[1], SYSTEM.VAL(Hugeint, time)[0]);
- RETURN time
- END GetTime;
- PROCEDURE ShowValue*();
- VAR
- high, low : LONGINT;
- BEGIN
- GetTimerValue( high, low );
- Trace.Ln;
- Trace.StringLn("Timer Values");
- Trace.Int( high, 8 ); Trace.Ln;
- Trace.Int( low, 8 ); Trace.Ln;
- Trace.Ln;
- END ShowValue;
- BEGIN
- END GlobalTimer.
- GlobalTimer.ShowValue
- GlobalTimer.ShowTimer
|