package test.CR16C; import javax.realtime.AperiodicParameters; import javax.realtime.Clock; import javax.realtime.PeriodicParameters; import javax.realtime.PriorityParameters; import javax.realtime.RelativeTime; import javax.safetycritical.AperiodicEventHandler; import javax.safetycritical.Launcher; import javax.safetycritical.Mission; import javax.safetycritical.MissionSequencer; import javax.safetycritical.PeriodicEventHandler; import javax.safetycritical.Safelet; import javax.safetycritical.StorageParameters; import javax.scj.util.Const; import javax.scj.util.Priorities; public class TestSCJPrioritySchedule2 { private static int testCount; static { testCount = 0; } private static class MyPeriodicEvh extends PeriodicEventHandler { int n; AperiodicEventHandler aevh; int count = 0; protected MyPeriodicEvh(PriorityParameters priority, PeriodicParameters periodic, long memSize, int n, AperiodicEventHandler aevh) { super(priority, periodic, new StorageParameters(memSize, new long[] { 256 }, 0, 0, 0)); this.n = n; this.aevh = aevh; } public void handleAsyncEvent() { count++; for (int i = 0; i < n; i++) { new Integer(count); } if (count % 4 == 3 && n == 2) aevh.release(); } } private static class MyAperiodicEvh extends AperiodicEventHandler { int n; MissionSequencer<MyMission> missSeq; int count = 0; public MyAperiodicEvh(PriorityParameters priority, AperiodicParameters release, long memSize, int n, MissionSequencer<MyMission> missSeq) { super(priority, release, new StorageParameters(memSize, new long[] { 256 }, 0, 0, 0)); this.n = n; this.missSeq = missSeq; } public void handleAsyncEvent() { count++; for (int i = 0; i < n; i++) { new Integer(count); } testCount++; missSeq.requestSequenceTermination(); } } private static class MyMission extends Mission { @SuppressWarnings("rawtypes") MissionSequencer missSeq; @SuppressWarnings("rawtypes") public MyMission(MissionSequencer missSeq) { this.missSeq = missSeq; } public void initialize() { @SuppressWarnings("unchecked") AperiodicEventHandler aevh = new MyAperiodicEvh( new PriorityParameters(Priorities.PR98), new AperiodicParameters(new RelativeTime(50, 0, Clock.getRealtimeClock()), null), 64, 1, missSeq); aevh.register(); PeriodicEventHandler pevh1 = new MyPeriodicEvh( new PriorityParameters(Priorities.PR97), new PeriodicParameters(new RelativeTime(Clock .getRealtimeClock()), // start new RelativeTime(100, 0, Clock.getRealtimeClock())), // period 64, // size of private mem 2, aevh); // used in pevh.handleAsyncEvent pevh1.register(); } public long missionMemorySize() { /* Not used right now ??? */ return 0; } } private static class MyApp implements Safelet<MyMission> { public MissionSequencer<MyMission> getSequencer() { // devices.Console.println(" ** MyApp.getSequencer"); return new MySequencer(); } public long immortalMemorySize() { return Const.IMMORTAL_MEM; } private class MySequencer extends MissionSequencer<MyMission> { private MyMission mission; MySequencer() { super( new PriorityParameters(Priorities.PR95), new StorageParameters(3072, new long[] { 768 }, 0, 0, 0)); // mission mission = new MyMission(this); } public MyMission getNextMission() { if (mission.terminationPending()) { // devices.Console.println("\nMySeq.getNextMission:null; missionTerminate:" // + mission.terminationPending() + "\n"); return null; } else { // devices.Console.println("\nMySeq.getNextMission:" + // mission + "\n"); return mission; } } } @Override public void initializeApplication() { // TODO Auto-generated method stub } } /** * Compiling for the PC: * * gcc -Wall -pedantic -g -Os -DPC64 -DPRINTFSUPPORT -DJAVA_STACK_SIZE=768 * -DJAVA_HEAP_SIZE=18432 classes.c icecapvm.c print.c methodinterpreter.c * methods.c gc.c natives_allOS.c natives_i86.c rom_heap.c * allocation_point.c rom_access.c x86_64_interrupt.s native_scj.c -lpthread * -lrt * * @param args */ public static void main(String[] args) { Const.IMMORTAL_MEM = 6 * 1024; Const.PRIVATE_MEM = 0; /* Only used by idle process */ Const.IDLE_PROCESS_STACK_SIZE = 128; // 128; Const.PRIORITY_SCHEDULER_STACK_SIZE = 256; // 256; Const.OVERALL_BACKING_STORE = 13 * 1024; // devices.Console.writer = new CR16ConsoleWriter(); devices.Console.println("\n********** main.begin ******************"); // executes in heap memory new Launcher(new MyApp(), 1); devices.Console.println("********* main.end ************************"); if (testCount == 1) { devices.Console.println("SUCCESS"); } else { devices.Console.println("FAILURE"); } while (true) { ; } } }