DMAProgramWriterTest.Mod 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. MODULE Test; (** AUTHOR "Timothée Martiel"; PURPOSE "DMA Automatic tests. Require FIFO on PL."; *)
  2. IMPORT Trace, Machine, Kernel, KernelLog, Strings, Random, PsConfig, AcAxisIo, DMA330ProgramWriter;
  3. CONST
  4. Busy = -1;
  5. Passed = 0;
  6. Failed = 1;
  7. Error = 2;
  8. Timeout = 3;
  9. MaxTests = 128;
  10. TYPE
  11. Test = PROCEDURE (param: ANY): BOOLEAN;
  12. Trigger = OBJECT
  13. VAR
  14. timer: Kernel.Timer;
  15. timeout: LONGINT;
  16. status *: LONGINT;
  17. PROCEDURE & InitTrigger;
  18. BEGIN
  19. NEW(timer)
  20. END InitTrigger;
  21. PROCEDURE Start * (timeout: LONGINT);
  22. BEGIN {EXCLUSIVE}
  23. SELF.timeout := timeout;
  24. status := Busy
  25. END Start;
  26. PROCEDURE SetStatus * (status: LONGINT);
  27. BEGIN {EXCLUSIVE}
  28. SELF.status := status
  29. END SetStatus;
  30. PROCEDURE Trigger * (): LONGINT;
  31. BEGIN {EXCLUSIVE}
  32. AWAIT(status # Busy);
  33. RETURN status
  34. END Trigger;
  35. BEGIN {ACTIVE}
  36. LOOP
  37. BEGIN {EXCLUSIVE} AWAIT(status = Busy) END;
  38. IF timeout # 0 THEN
  39. timer.Sleep(timeout);
  40. BEGIN {EXCLUSIVE} status := Timeout END
  41. ELSE
  42. BEGIN {EXCLUSIVE} AWAIT(status # Busy) END
  43. END
  44. END
  45. END Trigger;
  46. Tester = OBJECT (Trigger)
  47. VAR
  48. test: LONGINT;
  49. PROCEDURE Execute;
  50. BEGIN
  51. FOR test := 0 TO testNb - 1 DO ExecuteTest(30000) END
  52. END Execute;
  53. PROCEDURE ExecuteTest(timeout: LONGINT);
  54. BEGIN
  55. KernelLog.String("========== Begin test "); KernelLog.String(names[test]); KernelLog.String(" =========="); KernelLog.Ln;
  56. (*Start(timeout);*)
  57. results[test] := Trigger();
  58. ResetPl;
  59. KernelLog.String("########### End test "); KernelLog.String(names[test]); KernelLog.String(" ###########"); KernelLog.Ln
  60. END ExecuteTest;
  61. PROCEDURE DoTest;
  62. BEGIN
  63. IF tests[test](params[test]) THEN
  64. SetStatus(Passed)
  65. ELSE
  66. SetStatus(Failed)
  67. END
  68. FINALLY
  69. SetStatus(Error)
  70. END DoTest;
  71. BEGIN {ACTIVE}
  72. LOOP
  73. BEGIN {EXCLUSIVE} AWAIT(status = Busy) END;
  74. DoTest
  75. END
  76. END Tester;
  77. Notifier = OBJECT
  78. VAR
  79. params: ANY;
  80. count, result: LONGINT;
  81. PROCEDURE Await(param: ANY): LONGINT;
  82. BEGIN {EXCLUSIVE}
  83. AWAIT((count = 1)); (* & ((param = NIL) OR (param = params)));*)
  84. (*TRACE('notified', count);*)
  85. DEC(count);
  86. RETURN result
  87. END Await;
  88. PROCEDURE Notify (status: LONGINT; param: ANY);
  89. BEGIN {EXCLUSIVE}
  90. result := status;
  91. params := param;
  92. INC(count)
  93. (*;TRACE('notifying', count)*)
  94. END Notify;
  95. (*BEGIN {ACTIVE}
  96. BEGIN {EXCLUSIVE} done := TRUE END;
  97. LOOP
  98. BEGIN {EXCLUSIVE} AWAIT(~done) END;
  99. LOOP
  100. TRACE(output.ready, input.available)
  101. END
  102. END*)
  103. END Notifier;
  104. ChannelId = POINTER TO RECORD channel: LONGINT END;
  105. MemToMemParams = POINTER TO MemToMemDesc;
  106. MemToMemDesc = RECORD
  107. size, alignment: LONGINT;
  108. END;
  109. VAR
  110. tests: ARRAY MaxTests OF Test;
  111. params: ARRAY MaxTests OF ANY;
  112. names: ARRAY MaxTests, 128 OF CHAR;
  113. results: ARRAY MaxTests OF LONGINT;
  114. testNb: LONGINT;
  115. notifier: Notifier;
  116. rng: Random.Generator;
  117. parameter: MemToMemParams;
  118. output: AcAxisIo.Output;
  119. input: AcAxisIo.Input;
  120. freq: HUGEINT;
  121. res: LONGINT;
  122. PROCEDURE Execute *;
  123. VAR
  124. tester: Tester;
  125. i, len, total, passed, failed, errors, test: LONGINT;
  126. BEGIN
  127. (* display width *)
  128. len := 80;
  129. KernelLog.String("Executing DMA tests...");
  130. KernelLog.Ln;
  131. NEW(tester);
  132. tester.Execute;
  133. KernelLog.String("done");
  134. KernelLog.Ln;
  135. KernelLog.String("Results:");
  136. KernelLog.Ln;
  137. FOR test := 0 TO testNb - 1 DO
  138. INC(total);
  139. KernelLog.String(" ");
  140. KernelLog.String(names[test]);
  141. FOR i := 8 + 7 TO len - Strings.Length(names[test]) - 1 DO
  142. KernelLog.Char(' ')
  143. END;
  144. CASE results[test] OF
  145. Passed:
  146. INC(passed);
  147. KernelLog.String(" Passed")
  148. |Failed:
  149. INC(failed);
  150. KernelLog.String(" Failed")
  151. |Error:
  152. INC(errors);
  153. KernelLog.String(" Error")
  154. |Timeout:
  155. INC(errors);
  156. KernelLog.String ("Timeout")
  157. END;
  158. KernelLog.Ln;
  159. END;
  160. KernelLog.Ln;
  161. KernelLog.String("Summary:"); KernelLog.Ln;
  162. KernelLog.String(" total: "); KernelLog.Int(total, 0); KernelLog.Ln;
  163. KernelLog.String(" passed: "); KernelLog.Int(passed, 0); KernelLog.Char('/'); KernelLog.Int(total, 0); KernelLog.Ln;
  164. KernelLog.String(" failed: "); KernelLog.Int(failed, 0); KernelLog.Char('/'); KernelLog.Int(total, 0); KernelLog.Ln;
  165. KernelLog.String(" error: "); KernelLog.Int(errors, 0); KernelLog.Char('/'); KernelLog.Int(total, 0); KernelLog.Ln
  166. END Execute;
  167. PROCEDURE AddTest * (test: PROCEDURE (param: ANY): BOOLEAN; param: ANY; CONST name: ARRAY OF CHAR);
  168. BEGIN
  169. tests[testNb] := test;
  170. params[testNb] := param;
  171. COPY(name, names[testNb]);
  172. INC(testNb)
  173. END AddTest;
  174. PROCEDURE CheckMemToMem (CONST src: ARRAY OF CHAR; srcOfs: LONGINT; CONST dst: ARRAY OF CHAR; dstOfs, len: LONGINT): BOOLEAN;
  175. VAR
  176. i: LONGINT;
  177. result: BOOLEAN;
  178. BEGIN
  179. result := TRUE;
  180. FOR i := 0 TO dstOfs - 1 DO
  181. IF dst[i] # 0X THEN KernelLog.String("Overflow at "); KernelLog.Int(i, 0); KernelLog.Ln; result := FALSE END
  182. END;
  183. FOR i := 0 TO len - 1 DO
  184. IF dst[dstOfs + i] # src[srcOfs + i] THEN KernelLog.String("Mismatch at "); KernelLog.Int(i, 0); KernelLog.Ln; result := FALSE END
  185. END;
  186. FOR i := dstOfs + len TO LEN(dst) - 1 DO
  187. IF dst[i] # 0X THEN KernelLog.String("Overflow at "); KernelLog.Int(i, 0); KernelLog.Ln; result := FALSE END
  188. END;
  189. RETURN result
  190. END CheckMemToMem;
  191. PROCEDURE TestHeapToHeap (param: ANY): BOOLEAN;
  192. VAR
  193. tstart, tstop: HUGEINT;
  194. program: DMA330ProgramWriter.Program;
  195. txParams: MemToMemParams;
  196. src, dst: POINTER TO ARRAY OF CHAR;
  197. srcOfs, dstOfs: ADDRESS;
  198. i, status: LONGINT;
  199. BEGIN
  200. txParams := param(MemToMemParams);
  201. NEW(src, 2 * txParams.size + 2 * 8 (*txParams.alignment*));
  202. NEW(dst, 2 * txParams.size + 2 * 8 (*txParams.alignment*));
  203. srcOfs := (*txParams.alignment*)8 - ADDRESSOF(src[txParams.size DIV 2]) MOD (*txParams.alignment*) 8 + txParams.alignment;
  204. dstOfs := (*txParams.alignment*)8 - ADDRESSOF(dst[txParams.size DIV 2]) MOD (*txParams.alignment*) 8;
  205. FOR i := 0 TO LEN(src) - 1 DO
  206. src[i] := CHR(rng.Dice(100H))
  207. END;
  208. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  209. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  210. DMA330ProgramWriter.InitProgram(program);
  211. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(src[srcOfs]), txParams.size, 0, ADDRESSOF(dst[dstOfs]), txParams.size, 0, txParams.size, status) THEN
  212. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  213. RETURN FALSE
  214. END;
  215. IF ~DMA330ProgramWriter.BindToChannel(program, 1, status) THEN
  216. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  217. RETURN FALSE
  218. END;
  219. tstart := Machine.GetTimer();
  220. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  221. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  222. RETURN FALSE
  223. END;
  224. status := notifier.Await(NIL);
  225. tstop := Machine.GetTimer();
  226. IF status # DMA330ProgramWriter.Ok THEN
  227. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  228. RETURN FALSE
  229. END;
  230. Machine.InvalidateDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  231. KernelLog.String("Total transfer time = "); KernelLog.Int(tstop - tstart, 0); KernelLog.Ln;
  232. RETURN CheckMemToMem(src^, srcOfs, dst^, dstOfs, txParams.size)
  233. END TestHeapToHeap;
  234. PROCEDURE TestStackToStack (param: ANY): BOOLEAN;
  235. CONST
  236. MaxTxSize = 4096;
  237. MaxAlign = 4096;
  238. VAR
  239. program: DMA330ProgramWriter.Program;
  240. txParams: MemToMemParams;
  241. src, dst: ARRAY MaxTxSize + MaxAlign OF CHAR;
  242. srcOfs, dstOfs: ADDRESS;
  243. i, status: LONGINT;
  244. BEGIN
  245. txParams := param(MemToMemParams);
  246. srcOfs := txParams.alignment - ADDRESSOF(src[0]) MOD txParams.alignment;
  247. dstOfs := txParams.alignment - ADDRESSOF(dst[0]) MOD txParams.alignment;
  248. FOR i := 0 TO LEN(src) - 1 DO
  249. src[i] := CHR(rng.Dice(100H))
  250. END;
  251. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  252. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  253. DMA330ProgramWriter.InitProgram(program);
  254. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(src[srcOfs]), txParams.size, 0, ADDRESSOF(dst[dstOfs]), txParams.size, 0, txParams.size, status) THEN
  255. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  256. RETURN FALSE
  257. END;
  258. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  259. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  260. RETURN FALSE
  261. END;
  262. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  263. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  264. RETURN FALSE
  265. END;
  266. status := notifier.Await(NIL);
  267. IF status # DMA330ProgramWriter.Ok THEN
  268. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  269. RETURN FALSE
  270. END;
  271. Machine.InvalidateDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  272. RETURN CheckMemToMem(src, srcOfs, dst, dstOfs, txParams.size)
  273. END TestStackToStack;
  274. PROCEDURE TestHeapSimultaneous (param: ANY): BOOLEAN;
  275. VAR
  276. program1, program2: DMA330ProgramWriter.Program;
  277. channel1, channel2: ChannelId;
  278. txParams: MemToMemParams;
  279. src1, src2, dst1, dst2: POINTER TO ARRAY OF CHAR;
  280. srcOfs1, srcOfs2, dstOfs1, dstOfs2: ADDRESS;
  281. i, status: LONGINT;
  282. BEGIN
  283. txParams := param(MemToMemParams);
  284. NEW(src1, txParams.size + txParams.alignment);
  285. NEW(dst1, txParams.size + txParams.alignment);
  286. NEW(src2, txParams.size + txParams.alignment);
  287. NEW(dst2, txParams.size + txParams.alignment);
  288. NEW(channel1);
  289. NEW(channel2);
  290. channel1.channel := 0;
  291. channel2.channel := 1;
  292. srcOfs1 := txParams.alignment - ADDRESSOF(src1[0]) MOD txParams.alignment;
  293. dstOfs1 := txParams.alignment - ADDRESSOF(dst1[0]) MOD txParams.alignment;
  294. srcOfs2 := txParams.alignment - ADDRESSOF(src2[0]) MOD txParams.alignment;
  295. dstOfs2 := txParams.alignment - ADDRESSOF(dst2[0]) MOD txParams.alignment;
  296. FOR i := 0 TO LEN(src1) - 1 DO
  297. src1[i] := CHR(rng.Dice(100H))
  298. END;
  299. FOR i := 0 TO LEN(src2) - 1 DO
  300. src2[i] := CHR(rng.Dice(100H))
  301. END;
  302. Machine.FlushDCacheRange(ADDRESSOF(src1[0]), LEN(src1));
  303. Machine.FlushDCacheRange(ADDRESSOF(dst1[0]), LEN(dst1));
  304. Machine.FlushDCacheRange(ADDRESSOF(src2[0]), LEN(src2));
  305. Machine.FlushDCacheRange(ADDRESSOF(dst2[0]), LEN(dst2));
  306. DMA330ProgramWriter.InitProgram(program1);
  307. IF ~DMA330ProgramWriter.SetBurstParameters(program1, 16, 4, status) THEN
  308. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  309. RETURN FALSE
  310. END;
  311. IF ~DMA330ProgramWriter.Generate(program1, ADDRESSOF(src1[srcOfs1]), txParams.size, 0, ADDRESSOF(dst1[dstOfs1]), txParams.size, 0, txParams.size, status) THEN
  312. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  313. RETURN FALSE
  314. END;
  315. IF ~DMA330ProgramWriter.BindToChannel(program1, channel1.channel, status) THEN
  316. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  317. RETURN FALSE
  318. END;
  319. DMA330ProgramWriter.InitProgram(program2);
  320. IF ~DMA330ProgramWriter.SetBurstParameters(program2, 16, 4, status) THEN
  321. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  322. RETURN FALSE
  323. END;
  324. IF ~DMA330ProgramWriter.Generate(program2, ADDRESSOF(src2[srcOfs2]), txParams.size, 0, ADDRESSOF(dst2[dstOfs2]), txParams.size, 0, txParams.size, status) THEN
  325. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  326. RETURN FALSE
  327. END;
  328. IF ~DMA330ProgramWriter.BindToChannel(program2, channel2.channel, status) THEN
  329. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  330. RETURN FALSE
  331. END;
  332. IF ~DMA330ProgramWriter.Execute(program1, notifier.Notify, channel1, status) THEN
  333. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  334. RETURN FALSE
  335. END;
  336. IF ~DMA330ProgramWriter.Execute(program2, notifier.Notify, channel2, status) THEN
  337. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  338. RETURN FALSE
  339. END;
  340. status := notifier.Await(NIL);
  341. IF status # DMA330ProgramWriter.Ok THEN
  342. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  343. RETURN FALSE
  344. END;
  345. status := notifier.Await(NIL);
  346. IF status # DMA330ProgramWriter.Ok THEN
  347. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  348. RETURN FALSE
  349. END;
  350. Machine.InvalidateDCacheRange(ADDRESSOF(dst1[0]), LEN(dst1));
  351. Machine.InvalidateDCacheRange(ADDRESSOF(dst2[0]), LEN(dst2));
  352. RETURN CheckMemToMem(src1^, srcOfs1, dst1^, dstOfs1, txParams.size) & CheckMemToMem(src2^, srcOfs2, dst2^, dstOfs2, txParams.size)
  353. END TestHeapSimultaneous;
  354. PROCEDURE TestPlFifoSequential (param: ANY): BOOLEAN;
  355. VAR
  356. program: DMA330ProgramWriter.Program;
  357. txParams: MemToMemParams;
  358. src, dst: POINTER TO ARRAY OF CHAR;
  359. srcOfs, dstOfs: ADDRESS;
  360. i, status: LONGINT;
  361. BEGIN
  362. txParams := param(MemToMemParams);
  363. NEW(src, txParams.size + txParams.alignment);
  364. NEW(dst, txParams.size + txParams.alignment);
  365. srcOfs := txParams.alignment - ADDRESSOF(src[0]) MOD txParams.alignment;
  366. dstOfs := txParams.alignment - ADDRESSOF(dst[0]) MOD txParams.alignment;
  367. FOR i := 0 TO LEN(src) - 1 DO
  368. src[i] := CHR(rng.Dice(100H))
  369. END;
  370. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  371. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  372. DMA330ProgramWriter.InitProgram(program);
  373. IF ~DMA330ProgramWriter.SetBurstParameters(program, 16, 4, status) THEN
  374. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  375. RETURN FALSE
  376. END;
  377. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(src[srcOfs]), txParams.size, 0, ADDRESSOF(output.data), 0, 0, txParams.size, status) THEN
  378. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  379. RETURN FALSE
  380. END;
  381. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  382. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  383. RETURN FALSE
  384. END;
  385. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  386. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  387. RETURN FALSE
  388. END;
  389. status := notifier.Await(NIL);
  390. IF status # DMA330ProgramWriter.Ok THEN
  391. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  392. RETURN FALSE
  393. END;
  394. DMA330ProgramWriter.InitProgram(program);
  395. IF ~DMA330ProgramWriter.SetBurstParameters(program, 16, 4, status) THEN
  396. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  397. RETURN FALSE
  398. END;
  399. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(input.data), 0, 0, ADDRESSOF(dst[dstOfs]), txParams.size, 0, txParams.size, status) THEN
  400. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  401. RETURN FALSE
  402. END;
  403. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  404. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  405. RETURN FALSE
  406. END;
  407. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  408. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  409. RETURN FALSE
  410. END;
  411. status := notifier.Await(NIL);
  412. IF status # DMA330ProgramWriter.Ok THEN
  413. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  414. RETURN FALSE
  415. END;
  416. Machine.InvalidateDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  417. RETURN CheckMemToMem(src^, srcOfs, dst^, dstOfs, txParams.size)
  418. END TestPlFifoSequential;
  419. PROCEDURE TestPlFifoSimultaneous (param: ANY): BOOLEAN;
  420. VAR
  421. tstart, tstop: HUGEINT;
  422. programWr, programRd: DMA330ProgramWriter.Program;
  423. channelWr, channelRd: ChannelId;
  424. txParams: MemToMemParams;
  425. src, dst: POINTER TO ARRAY OF CHAR;
  426. srcOfs, dstOfs: ADDRESS;
  427. i, status: LONGINT;
  428. BEGIN
  429. txParams := param(MemToMemParams);
  430. NEW(src, txParams.size + txParams.alignment);
  431. NEW(dst, txParams.size + txParams.alignment);
  432. NEW(channelWr);
  433. NEW(channelRd);
  434. channelWr.channel := 0;
  435. channelRd.channel := 1;
  436. srcOfs := txParams.alignment - ADDRESSOF(src[0]) MOD txParams.alignment;
  437. dstOfs := txParams.alignment - ADDRESSOF(dst[0]) MOD txParams.alignment;
  438. FOR i := 0 TO LEN(src) - 1 DO
  439. src[i] := CHR(rng.Dice(100H))
  440. END;
  441. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  442. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  443. DMA330ProgramWriter.InitProgram(programWr);
  444. IF ~DMA330ProgramWriter.SetBurstParameters(programWr, 4, 4, status) THEN
  445. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  446. RETURN FALSE
  447. END;
  448. IF ~DMA330ProgramWriter.Generate(programWr, ADDRESSOF(src[srcOfs]), txParams.size, 0, ADDRESSOF(output.data), 0, 0, txParams.size, status) THEN
  449. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  450. RETURN FALSE
  451. END;
  452. IF ~DMA330ProgramWriter.BindToChannel(programWr, 0, status) THEN
  453. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  454. RETURN FALSE
  455. END;
  456. DMA330ProgramWriter.InitProgram(programRd);
  457. IF ~DMA330ProgramWriter.SetBurstParameters(programRd, 4, 4, status) THEN
  458. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  459. RETURN FALSE
  460. END;
  461. IF ~DMA330ProgramWriter.Generate(programRd, ADDRESSOF(input.data), 0, 0, ADDRESSOF(dst[dstOfs]), txParams.size, 0, txParams.size, status) THEN
  462. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  463. RETURN FALSE
  464. END;
  465. IF ~DMA330ProgramWriter.BindToChannel(programRd, 1, status) THEN
  466. KernelLog.String("Error binding DMA program to channel 1: "); KernelLog.Int(status, 0); KernelLog.Ln;
  467. RETURN FALSE
  468. END;
  469. IF ~DMA330ProgramWriter.Execute(programWr, notifier.Notify, channelWr, status) THEN
  470. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  471. RETURN FALSE
  472. END;
  473. tstart := Machine.GetTimer();
  474. IF ~DMA330ProgramWriter.Execute(programRd, notifier.Notify, channelRd, status) THEN
  475. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  476. RETURN FALSE
  477. END;
  478. status := notifier.Await(NIL);
  479. IF status # DMA330ProgramWriter.Ok THEN
  480. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  481. RETURN FALSE
  482. END;
  483. status := notifier.Await(NIL);
  484. tstop := Machine.GetTimer();
  485. IF status # DMA330ProgramWriter.Ok THEN
  486. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  487. RETURN FALSE
  488. END;
  489. KernelLog.String("Read time = "); KernelLog.Int(tstop - tstart, 0); KernelLog.Ln;
  490. Machine.InvalidateDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  491. RETURN CheckMemToMem(src^, srcOfs, dst^, dstOfs, txParams.size)
  492. END TestPlFifoSimultaneous;
  493. PROCEDURE TestPlFifoFill (ignore: ANY): BOOLEAN;
  494. CONST
  495. size = 16 * 1024;
  496. alignment = 8;
  497. VAR
  498. program: DMA330ProgramWriter.Program;
  499. src: POINTER TO ARRAY OF CHAR;
  500. srcOfs: ADDRESS;
  501. i, status: LONGINT;
  502. BEGIN
  503. NEW(src, size + alignment);
  504. srcOfs := alignment - ADDRESSOF(src[0]) MOD alignment;
  505. FOR i := 0 TO size - 1 DO
  506. src[i] := CHR(rng.Dice(100H))
  507. END;
  508. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  509. DMA330ProgramWriter.InitProgram(program);
  510. IF ~DMA330ProgramWriter.SetBurstParameters(program, 16, 4, status) THEN
  511. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  512. RETURN FALSE
  513. END;
  514. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(src[srcOfs]), size, 0, ADDRESSOF(output.data), 0, 0, size, status) THEN
  515. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  516. RETURN FALSE
  517. END;
  518. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  519. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  520. RETURN FALSE
  521. END;
  522. FOR i := 1 TO 8 DO
  523. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  524. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  525. RETURN FALSE
  526. END;
  527. status := notifier.Await(NIL);
  528. IF status # DMA330ProgramWriter.Ok THEN
  529. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  530. RETURN FALSE
  531. END
  532. END;
  533. output.data := 1234ABCDH;
  534. RETURN ~output.ready & input.available
  535. END TestPlFifoFill;
  536. PROCEDURE TestPlFifoEmpty (param: ANY): BOOLEAN;
  537. CONST
  538. size = 16 * 1024;
  539. alignment = 8;
  540. VAR
  541. program: DMA330ProgramWriter.Program;
  542. dst: POINTER TO ARRAY OF CHAR;
  543. dstOfs: ADDRESS;
  544. i, status: LONGINT;
  545. BEGIN
  546. NEW(dst, size + alignment);
  547. dstOfs := alignment - ADDRESSOF(dst[0]) MOD alignment;
  548. FOR i := 0 TO 32 * 1024 DO
  549. output.data := i + 1
  550. END;
  551. ASSERT(~output.ready & input.available);
  552. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  553. DMA330ProgramWriter.InitProgram(program);
  554. IF ~DMA330ProgramWriter.SetBurstParameters(program, 16, 4, status) THEN
  555. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  556. RETURN FALSE
  557. END;
  558. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(input.data), 0, 0, ADDRESSOF(dst[dstOfs]), size, 0, size, status) THEN
  559. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  560. RETURN FALSE
  561. END;
  562. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  563. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  564. RETURN FALSE
  565. END;
  566. FOR i := 1 TO 8 DO
  567. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  568. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  569. RETURN FALSE
  570. END;
  571. status := notifier.Await(NIL);
  572. IF status # DMA330ProgramWriter.Ok THEN
  573. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  574. RETURN FALSE
  575. END
  576. END;
  577. i := input.data;
  578. RETURN ~input.available & output.ready
  579. END TestPlFifoEmpty;
  580. PROCEDURE TestTimeFifoEmpty (ignored: ANY): BOOLEAN;
  581. CONST
  582. size = 4 * 32 * 1024;
  583. alignment = 8;
  584. VAR
  585. tstart, tstop: HUGEINT;
  586. program: DMA330ProgramWriter.Program;
  587. dst: POINTER TO ARRAY OF CHAR;
  588. dstOfs: ADDRESS;
  589. i, status: LONGINT;
  590. BEGIN
  591. NEW(dst, size + alignment);
  592. dstOfs := alignment - ADDRESSOF(dst[0]) MOD alignment;
  593. FOR i := 1 TO 32 * 1024 DO
  594. output.data := i + 1
  595. END;
  596. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  597. DMA330ProgramWriter.InitProgram(program);
  598. IF ~DMA330ProgramWriter.SetBurstParameters(program, 16, 4, status) THEN
  599. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  600. RETURN FALSE
  601. END;
  602. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(input.data), 0, 0, ADDRESSOF(dst[dstOfs]), size, 0, size, status) THEN
  603. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  604. RETURN FALSE
  605. END;
  606. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  607. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  608. RETURN FALSE
  609. END;
  610. tstart := Machine.GetTimer();
  611. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  612. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  613. RETURN FALSE
  614. END;
  615. status := notifier.Await(NIL);
  616. tstop := Machine.GetTimer();
  617. IF status # DMA330ProgramWriter.Ok THEN
  618. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  619. RETURN FALSE
  620. END;
  621. KernelLog.String("Total transfer time = "); KernelLog.Int(tstop - tstart, 0); KernelLog.String("; Accepted limit = "); KernelLog.Int(100 * 32 * 1024 * 333000000 DIV freq DIV 80, 0); KernelLog.Ln;
  622. RETURN tstop - tstart <= 100 * 32 * 1024 * 333000000 DIV freq DIV 80 (* Test pass for performance >= 80% of max theoretical *)
  623. END TestTimeFifoEmpty;
  624. PROCEDURE InitPl;
  625. VAR
  626. res: LONGINT;
  627. BEGIN
  628. freq := PsConfig.GetPllClockFrequency(PsConfig.IoPll,res);
  629. Trace.String("IO PLL frequency is "); Trace.Int(freq,0); Trace.StringLn(" Hz");
  630. Trace.String("Initial FPGA clock 0 frequency is "); Trace.Int(PsConfig.GetPlClockFrequency(0,res),0); Trace.StringLn(" Hz");
  631. ASSERT(PsConfig.SetPlResets({0,1,2,3},res));
  632. IF PsConfig.SetPlClock(0,PsConfig.IoPll,9,1,res) THEN
  633. Trace.String("FPGA clock 0 frequency has been changed to "); Trace.Int(PsConfig.GetPlClockFrequency(0,res),0); Trace.StringLn(" Hz");
  634. ELSE Trace.String("Error while setting FPGA clock 0 frequency, res="); Trace.Int(res,0); Trace.Ln;
  635. END;
  636. output := AcAxisIo.GetOutput(0,0);
  637. input := AcAxisIo.GetInput(0,0);
  638. ResetPl
  639. END InitPl;
  640. PROCEDURE ResetPl;
  641. VAR
  642. t: HUGEINT;
  643. res: LONGINT;
  644. BEGIN
  645. (* Reset PL *)
  646. ASSERT(PsConfig.SetPlResets({0,1,2,3},res));
  647. t := Kernel.GetTicks();
  648. WHILE Kernel.GetTicks() - t < 1 DO END;
  649. ASSERT(PsConfig.SetPlResets({},res));
  650. END ResetPl;
  651. PROCEDURE CpuTest (ignored: ANY): BOOLEAN;
  652. VAR k: LONGINT;
  653. BEGIN
  654. FOR k := 1 TO 32768+1 DO
  655. output.data := k;
  656. END;
  657. IF output.ready OR ~input.available THEN
  658. RETURN FALSE
  659. END;
  660. FOR k := 1 TO 32768+1 DO
  661. IF input.data # k THEN RETURN FALSE END
  662. END;
  663. RETURN TRUE
  664. END CpuTest;
  665. PROCEDURE TimeoutTest (ignored: ANY): BOOLEAN;
  666. VAR
  667. t: Kernel.MilliTimer;
  668. BEGIN
  669. Kernel.SetTimer(t, 60000);
  670. REPEAT UNTIL Kernel.Expired(t);
  671. RETURN TRUE
  672. END TimeoutTest;
  673. BEGIN
  674. (*AddTest(TimeoutTest, NIL, "Timeout test");*)
  675. (* Tests: Heap -> Heap, aligned *)
  676. (*NEW(parameter); parameter.size := 1024; parameter.alignment := 1;
  677. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 1, 1kB");
  678. NEW(parameter); parameter.size := 1024; parameter.alignment := 3;
  679. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 3, 1kB");
  680. NEW(parameter); parameter.size := 1024; parameter.alignment := 5;
  681. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 5, 1kB");
  682. NEW(parameter); parameter.size := 1024; parameter.alignment := 7;
  683. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 7, 1kB");
  684. NEW(parameter); parameter.size := 1024; parameter.alignment := 2;
  685. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 2, 1kB");
  686. NEW(parameter); parameter.size := 1024; parameter.alignment := 4;
  687. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 4, 1kB");
  688. NEW(parameter); parameter.size := 1024; parameter.alignment := 6;
  689. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap MOD 6, 1kB");
  690. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 1kB");
  691. NEW(parameter); parameter.size := 2048; parameter.alignment := 8;
  692. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 2kB");
  693. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 2kB");
  694. NEW(parameter); parameter.size := 3072; parameter.alignment := 8;
  695. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 3kB");
  696. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 3kB");
  697. NEW(parameter); parameter.size := 4096; parameter.alignment := 8;
  698. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 4kB");
  699. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 4kB");
  700. NEW(parameter); parameter.size := 512; parameter.alignment := 8;
  701. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 512B");
  702. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 512B");
  703. NEW(parameter); parameter.size := 1536; parameter.alignment := 8;
  704. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 1.5kB");
  705. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 1.5kB");
  706. NEW(parameter); parameter.size := 2560; parameter.alignment := 8;
  707. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 2.5kB");
  708. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 2.5kB");
  709. NEW(parameter); parameter.size := 3584; parameter.alignment := 8;
  710. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 3.5kB");
  711. AddTest(TestStackToStack, parameter, "Stack Aligned -> Stack Aligned, 3.5kB");
  712. NEW(parameter); parameter.size := 32 * 1024; parameter.alignment := 8;
  713. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 32kB");
  714. NEW(parameter); parameter.size := 64 * 1024; parameter.alignment := 8;
  715. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 64kB");
  716. AddTest(TestHeapSimultaneous, parameter, "Heap Aligned -> Heap Aligned, 2 times, 64kB");
  717. NEW(parameter); parameter.size := 4 * 1024 * 1024; parameter.alignment := 8;
  718. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 4MB");
  719. NEW(parameter); parameter.size := 16 * 1024 * 1024; parameter.alignment := 8;
  720. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 16MB");
  721. NEW(parameter); parameter.size := (32 * 1024 + 1) * 4; parameter.alignment := 8;
  722. AddTest(TestHeapToHeap, parameter, "Heap Aligned -> Heap Aligned, 32k + 1W");*)
  723. (* Fifo tests *)
  724. (*AddTest(CpuTest, NIL, "Fill and empty PL Fifo with CPU");*)
  725. (*AddTest(TestPlFifoFill, NIL, "Fill PL FIFO");
  726. AddTest(TestPlFifoEmpty, NIL, "Empty PL FIFO");
  727. (*NEW(parameter); parameter.size := 1024; parameter.alignment := 1;
  728. AddTest(TestPlFifoSequential, parameter, "Heap over PL FIFO, sequential, 1kB");*)
  729. NEW(parameter); parameter.size := 4 * 1024; parameter.alignment := 8;
  730. AddTest(TestPlFifoSequential, parameter, "Heap over PL FIFO, sequential, 4kB");
  731. NEW(parameter); parameter.size := 8 * 1024; parameter.alignment := 8;
  732. AddTest(TestPlFifoSequential, parameter, "Heap over PL FIFO, sequential, 8kB");
  733. NEW(parameter); parameter.size := 32 * 1024; parameter.alignment := 8;
  734. AddTest(TestPlFifoSequential, parameter, "Heap over PL FIFO, sequential, 32kB");
  735. NEW(parameter); parameter.size := 4 * 32 * 1024; parameter.alignment := 8;
  736. AddTest(TestPlFifoSequential, parameter, "Heap over PL FIFO, sequential, 4 * 32kB");
  737. NEW(parameter); parameter.size := 1024; parameter.alignment := 8;
  738. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 1kB");
  739. NEW(parameter); parameter.size := 4 * 1024; parameter.alignment := 8;
  740. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 4kB");
  741. NEW(parameter); parameter.size := 32 * 1024; parameter.alignment := 8;
  742. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 32kB");
  743. NEW(parameter); parameter.size := 64 * 1024; parameter.alignment := 8;
  744. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 64kB");
  745. NEW(parameter); parameter.size := 32 * 4 * 1024; parameter.alignment := 8;
  746. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 32kW");
  747. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 32kW, take 2");
  748. NEW(parameter); parameter.size := 1 * 1024 * 1024; parameter.alignment := 8;
  749. AddTest(TestPlFifoSimultaneous, parameter, "Heap over PL FIFO, simultaneous, 1MB");*)
  750. (*AddTest(TestTimeFifoEmpty, NIL, "FIFO Empty time");*)
  751. InitPl;
  752. (*NEW(notifier);
  753. NEW(rng)*)
  754. IF TestPlFifoEmpty(NIL) THEN END;
  755. END Test.
  756. FSTools.CreateFile -c -r Replacements.tmp
  757. BootConfig.CpuNb = 1;
  758. ~
  759. Release.Build -b -f=ARM.Release.Tool -o="--traceModule=Trace --noInitLocals" --only="Kernel" ZynqA2 ~
  760. Release.Build -b -f=ARM.Release.Tool -o="--traceModule=Trace --replacements=Replacements.tmp --noInitLocals" --only="Kernel" ZynqA2 ~
  761. Release.Build -b -f=ARM.Release.Tool -o="--traceModule=Trace" --only="System Random UsbCore Shell" ZynqA2 ~
  762. Release.Build -l -f=ARM.Release.Tool --only="Kernel System Random UsbCore Shell" ZynqA2 ~
  763. SystemTools.DoCommands
  764. Compiler.Compile -b=ARM --mergeSections
  765. Zynq.PsConfig.Mod
  766. TestFifo/Zynq.AcAxisIo.Mod
  767. DMA330.Mod
  768. DMA330ProgramWriter.Mod
  769. DMAProgramWriterTest.Mod
  770. ~
  771. StaticLinker.Link --fileName=Test.Bin --displacement=100000H -a
  772. Runtime Initializer Platform FPE64 ARMRuntime Trace BootConfig Uart Machine Heaps Modules Objects
  773. Kernel KernelLog Plugins Streams Pipes Commands Reals Clock Dates Strings Files Disks Reflection
  774. TrapWriters Traps Locks Options Timer Shell ShellController Math Random DMA330 DMA330ProgramWriter PsConfig AcAxisIo Test
  775. ~
  776. ~
  777. StaticLinker.Link --fileName=Test.Bin --displacement=100000H -a
  778. Runtime Initializer Platform FPE64 ARMRuntime Trace BootConfig Uart Machine Heaps Modules Objects
  779. Kernel KernelLog Plugins Streams Pipes Commands Reals Clock Dates Strings Files Disks Reflection
  780. TrapWriters Traps Locks Options Timer Shell Math Random DMA330 DMA330ProgramWriter PsConfig AcAxisIo Test Test2
  781. ~
  782. setsource TFTP 10.3.34.145
  783. load TestFifo.bin fpga
  784. load Test.Bin memory 100000H
  785. start 100000H
  786. setsource TFTP 10.3.34.145
  787. load Test.Bin memory 100000H
  788. start 100000H