2
0
Эх сурвалжийг харах

Some patches -- Coop A2 on RPI works again

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7047 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 жил өмнө
parent
commit
e9bfaa6713

+ 2 - 2
source/Coop.Modules.Mod

@@ -125,7 +125,7 @@ VAR
 	shutdown*: LONGINT;	(** None, Reboot, PowerDown *)
 	trace: BOOLEAN;
 	register: RECORD
-		first, last: Module;
+		first {UNTRACED}, last {UNTRACED}: Module;
 	END;
 	
 	(* global sorted table of all procedures , basically for GC *)
@@ -650,7 +650,7 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	IF register.first = NIL THEN
 		register.first := module;
 	ELSE
-		register.last.next := module;
+		register.last.next := module; (* transitively unsafe access via register.last *)
 	END;
 	register.last := module;
 END Register;

+ 7 - 2
source/FoxSyntaxTree.Mod

@@ -2414,7 +2414,8 @@ TYPE
 		END SetSymbol;
 
 		PROCEDURE NeedsTrace* (): BOOLEAN;
-		BEGIN RETURN symbol.NeedsTrace() & ((left = NIL) OR (left.NeedsTrace()));
+		BEGIN 
+			RETURN symbol.NeedsTrace() & ((left = NIL) OR (left.NeedsTrace()));
 		END NeedsTrace;
 
 	END SymbolDesignator;
@@ -2600,7 +2601,11 @@ TYPE
 		END Accept;
 
 		PROCEDURE NeedsTrace* (): BOOLEAN;
-		BEGIN RETURN left.NeedsTrace() & type.NeedsTrace(); (* for x^: if x is an untraced pointer, the content of x^ is also treated untraced *)
+		BEGIN 
+			(*! semantic of x.y.z := new : if x is untraced then the effect of y.z := new remains untraced! 
+				In other words: difference between y := x.y; y.z := new and x.y.z := new.
+			*)
+			RETURN left.NeedsTrace() & type.NeedsTrace(); (* for x^: if x is an untraced pointer, the content of x^ is also treated untraced *)
 		END NeedsTrace;
 
 	END DereferenceDesignator;

+ 25 - 3
source/RPI.Environment.Mod

@@ -95,12 +95,22 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	END;
 END HandleTimer;
 
-PROCEDURE LED- (status: BOOLEAN);
+PROCEDURE LED- (led: LONGINT; status: BOOLEAN);
 BEGIN {UNCOOPERATIVE, UNCHECKED}
+	IF led = 0 THEN 
 	CPU.MaskIn (CPU.GPFSEL4, {21..23}, {21});
 	IF status THEN CPU.WriteMask (CPU.GPSET1, {15}) ELSE CPU.WriteMask (CPU.GPCLR1, {15}) END;
+	ELSE (* power led *)
+		IF status THEN 
+			CPU.MaskIn (CPU.GPFSEL3, {15..17}, {17});
+		ELSE 
+			CPU.MaskIn (CPU.GPFSEL3, {15..17}, {15});
+		END;
+	END;
 END LED;
 
+
+
 PROCEDURE Shutdown*;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	IF CAS (status, Running, ShuttingDown) # Running THEN RETURN END;
@@ -149,9 +159,21 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	memory := memTag.start + memTag.size - ADDRESS OF KernelEnd;
 END InitMemory;
 
+PROCEDURE Blink-(num, speed: LONGINT);
+VAR i,j: LONGINT;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+	FOR  j:= 1 TO num DO
+		LED (0, TRUE); LED(1, FALSE);
+		FOR i := 0 TO speed*1000000 DO END;
+		LED(0, FALSE); LED(1, TRUE);
+		FOR i := 0 TO speed*1000000 DO END;
+	END;
+END Blink;
+
 PROCEDURE Initialize-;
+VAR i: LONGINT;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
-	SYSTEM.SetActivity (NIL); LED (TRUE);
+	SYSTEM.SetActivity (NIL); 
 	CPU.Initialize; InitTrace; InitMemory;
 	frequency := Timer.GetFrequency () DIV 1000;
 END Initialize;
@@ -159,7 +181,7 @@ END Initialize;
 PROCEDURE Terminate-;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	Interrupts.Terminate;
-	LED (FALSE);
+	LED (0, FALSE);
 END Terminate;
 
 PROCEDURE {NOPAF, INITIAL, FIXED(8000H)} KernelBegin;