Seite 1 von 1

Warmstartflag

Verfasst: So 13. Dez 2015, 00:12
von PIC18F2550
Hallo

ich habe mich heute mal etwas mit dem Warmstartflag befasst.

Es scheint ja im Prinzip zu funktionieren aber mir ist der Wirk­me­cha­nis­mus etwas unklar.

Zum erkennen ob ein Kalt/Warmstart erfolgt findet im eRAM statt.

Bei einem Reset Hart-/Software seitig bleibt dieser aber unverändert da der Inhalt der Zelle nicht verändert wird

Der einzige Speicherbereich der nach einem Hart-/Software seitigen Reset sicher wieder hergestellt wird ist der DAT Bereich.

Funktionsprinzip:

Code: Alles auswählen

DAT ' Am Anfang des Programmcodes von regnatix
  MAGIC byte $FF

PUB main | a
  a := ini

PRI ini : wflag
  if byte[@MAGIC]>7
    'kaltstart
    ram_wrlong(sysmod,SYSVAR,RAMEND)                    'Zeiger auf letzte freie Speicherzelle setzen
    ram_wrlong(sysmod,0,RAMBAS)                         'Zeiger auf erste freie Speicherzelle setzen
    ram_wrbyte(sysmod,0,RAMDRV)                         'Ramdrive ist abgeschaltet
    ram_wrbyte(sysmod,0,TIB2)                           'tib-puffer mit leerstrin belegen
    wflag := 0
  else
    'warmstart
    wflag := 1
  byte[@MAGIC] := cogid

Der DAT Bereich sollte in allen Programmen vorkommen.
Auch wenn er für das jeweilige Programm nicht gebraucht wird.

Code: Alles auswählen

DAT ' Am Anfang des Programmcodes von regnatix
  MAGIC byte $FF

PUB main
  byte[@MAGIC] := cogid

Re: Warmstartflag

Verfasst: So 13. Dez 2015, 19:06
von drohne235
Hmm, bin gerade etwas ratlos: Bezieht sich das auf Hive/TriOS-Code? Weil in meiner reg-ios.spin steht da was ganz anderes... :?: :roll:

Re: Warmstartflag

Verfasst: So 13. Dez 2015, 21:32
von PIC18F2550
Nee drohne235 bei dir steht das so nicht drin.
Das ist nur ein Programmversuch um den Mechanismus zu Verstehen und zu vereinfachen.

Im regnatix Flash steht das:

Code: Alles auswählen

CON
'system
LOADERPTR       = $0FFFFB                               'eram-adresse mit pointer auf loader-register
MAGIC           = $0FFFFA                               'Warmstartflag

VAR
' achtung: reihenfolge der folgenden zwei variablen nicht ändern!
  byte  lflag                                           'flag zur steuerung des loaders
  byte  lname[16]                                       'stringpuffer für dateinamen

PUB main | spinbin,i                                    'loader: hauptroutine
{{main - loader: hauptroutine}}
  bus_init                                              'bus initialisieren
  wr_long(@lflag,LOADERPTR)                             'zeiger auf loader-register setzen
' ----------------------------------------------------- REGIME
  waitcnt(cnt + clkfreq)                                'kurze pause für slaves
  spinbin := load(@sysname)                             'start-bin laden
  bus_off                                               'bus deaktivieren
  run(spinbin)                                          'sys-objekt ausführen
' ----------------------------------------------------- LOADER
  repeat                                                'kommandoschleife
    repeat until lflag <> 0                             'warte das flag gesetzt ist
    lflag := 0                                         
    repeat i from 1 to 7                                'cog 1..7 anhalten
      cogstop(i)
    bus_init                                            'objekt laden und ausführen
    spinbin := load(@lname)
    bus_off
    run(spinbin)

DAT
sysname           byte "reg.sys", 0                         'name der systemdatei

Was mich wundert das gerade hier die MAGIC Adresse nicht angesprochen wird.
Hier müsste doch eigentlich ein Wert unterschiedlich von 235 für Kaltstart eingetragen werden.

Re: Warmstartflag

Verfasst: Mo 14. Dez 2015, 08:29
von drohne235
Magic unterscheidet, ob der externe RAM nach dem Einschalten leer ist, also ungültige Werte enthält, oder nach einem Reset von Regnatix (oder aller drei Props) noch Daten enthält. Wenn ein Kaltstart vorliegt, wird der eRAM inklusive RAM Disk vom ersten Programm durch den Aufruf von ios.start initialisiert. Im Normalfall ist das regime, welches als reg.sys durch den Loader gestartet wird, kann aber auch ein anderes Programm sein.

In regflash.spin wird nur der Loader gestartet (und evtl. PropForth). Der Loaders wird dabei aber nur bei einem Neustart/Reset von Regnatix aus dem Flash geladen und muss dann auch (unabhängig vom Inhalt des eRAM) reg.sys erstmal starten, um danach auf Kommandos von den Programmen im Heap zu warten. Im Prinzip könnte man im Loader vielleicht (wenn ich gerade nichts übersehe) auch den eRAM + RAM Disk in Abhängigkeit von Magic initialisieren, aber meine Idee war es halt, den Loader selbst so klein wie möglich zu halten, um so viel wie möglich nutzbaren Heap für Programme zu besitzen.

Re: Warmstartflag

Verfasst: Mo 14. Dez 2015, 13:26
von PIC18F2550
:oops: drohne235 Du hast natürlich Recht. Ich bin wieder mal falsch abgebogen.

Das Warmstartflag besagt ja nur ob sich Daten im eRAM befinden könnten die bei einen Neustart nicht Überschrieben werden dürfen.

Ausgelöst wurde der Gedanke das es keine Abfrage beim Neustart gibt ob die Daten Überschrieben/gesichert werden sollen.

Die Erkenntnis hatte ich heute Früh auf der Fahrt zur Arbeit.

Die Sache mit dem nutzbaren Heap für Programme ist schon ein wichtiger Punkt bei den 32k hRAM.