123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- MODULE TestDMA;
- IMPORT SYSTEM, Trace, Machine, Kernel, Random, DMA, MT := MatrixTools, Timer;
- CONST
- Size = 64 * 256;
- VAR
- g: Random.Generator;
- w: DMA.Writer;
- r: DMA.Reader;
- src, dst: POINTER TO ARRAY Size + 8 OF CHAR;
- (*src, dst: POINTER TO ARRAY Size OF LONGINT;*)
- interm: ARRAY Size OF LONGINT;
- t: Kernel.MilliTimer;
- pOut, pIn: ADDRESS;
- count, burst, i, len, time: LONGINT;
- PROCEDURE Align (address: ADDRESS; align: LONGINT): LONGINT;
- VAR
- BEGIN
- IF align = 8 THEN
- RETURN 8 - address MOD 8
- ELSE
- RETURN 8 - address MOD 8 + align
- END
- END Align;
- BEGIN
- burst := 64;
- pOut := 7F000000H;
- pIn := pOut + 8;
- NEW(g);
- NEW(src);
- NEW(dst);
- DMA.OpenWriter(w, Size, burst, pOut, FALSE, 0);
- DMA.OpenReader(r, Size, burst, pIn, FALSE, 1);
- (*SYSTEM.PUT(MT.AxiBaseAddr0 +1*MT.ChanOffset, 0); (* reset the timer *)
- dmaOut.Update;
- SYSTEM.PUT(MT.AxiBaseAddr0 +1*MT.ChanOffset, 1); (* sample the timer *)
- SYSTEM.GET(MT.AxiBaseAddr0 + 1*MT.ChanOffset+MT.DataOffset, t); (* read timer data*)*)
- FOR i := 0 TO LEN(src) - 1 DO src[i] := CHR(g.Dice(100H)) END;
- (*Kernel.SetTimer(t, 1000);*)
- Timer.Tick;
- w.Bytes(src^, 0, Size);
- (*time := Kernel.Elapsed(t);*)
- (*FOR i := 0 TO Size - 1 BY 4 DO
- interm[i] := ORD(src[i]) + (ORD(src[i + 1])) * 100H + ORD(src[i + 2]) * 10000H + (ORD(src[i + 3])) * 1000000H;
- SYSTEM.PUT(pOut, interm[i])
- END;*)
- (*FOR i := 0 TO Size - 1 BY 4 DO
- len := SYSTEM.GET32(pIn);
- dst[i] := CHR(len MOD 100H);
- dst[i + 1] := CHR((len DIV 100H) MOD 100H);
- dst[i + 2] := CHR((len DIV 10000H) MOD 100H);
- dst[i + 3] := CHR((len DIV 1000000H) MOD 100H)
- END;*)
- r.Bytes(dst^, 0, Size, len);
- Timer.Tock(time);
- TRACE(time);
- len := SYSTEM.GET32(pOut);
- TRACE(len);
- count := 0;
- FOR i := 0 TO Size - 1 DO
- (*Trace.String("elt "); Trace.Int(i, 4);
- Trace.String(" ");
- Trace.Hex(ORD(src[i]), -2);
- Trace.String(" ");
- Trace.Hex(ORD(dst[i]), -2);
- Trace.String(" ");
- Trace.Boolean(src[i] = dst[i]);
- Trace.Ln;*)
- IF src[i] # dst[i] THEN INC(count) END;
- END;
- Trace.String(" => Differences: "); Trace.Int(count, 0); Trace.String("/"); Trace.Int(Size, 0); Trace.Ln
- (*FOR i := 0 TO LEN(src) - 1 DO src[i] := g.Integer() END;
- (*w.Bytes(src^, 0, Size);*)
- FOR i := 0 TO Size - 1 DO
- SYSTEM.PUT32(pOut, src[i])
- END;
- (*r.Bytes(dst^, 0, Size, len);*)
- FOR i := 0 TO Size - 1 DO
- dst[i] := SYSTEM.GET32(pIn);
- END;
- count := 0;
- FOR i := 0 TO Size - 1 DO
- Trace.String("elt "); Trace.Int(i, 4); Trace.Ln;
- Trace.String(" ");
- Trace.Hex(src[i], -8); Trace.Ln;
- Trace.String(" ");
- Trace.Hex(dst[i], -8); Trace.Ln;
- Trace.String(" ");
- Trace.Boolean(src[i] = dst[i]);
- Trace.Ln;
- IF src[i] # dst[i] THEN INC(count) END;
- END;
- Trace.String(" => Differences: "); Trace.Int(count, 0); Trace.String("/"); Trace.Int(Size, 0); Trace.Ln*)
- END TestDMA.
- Compiler.Compile -b=ARM --traceModule=Trace --initLocals
- basel/ARM.A2/ARM.Streams.Mod
- basel/ARM.A2/ARM.Math.Mod
- Random.Mod
- basel/ARM.A2/DMA330.Mod
- Timer.Mod
- basel/ARM.A2/Zynq.DMA.Mod
- Locks.Mod
- Zynq.MatrixTools.Mod
- TestDMA2.Mod
- ~
- StaticLinker.Link --fileName=Test.Bin --displacement=100000H -a
- Initializer Runtime Platform FPE64 ARMRuntime Trace Uart Machine
- Heaps Modules Objects Kernel
- Streams KernelLog
- Math Random Locks
- Timer
- DMA330 DMA
- MatrixTools
- TestDMA
- ~
|