Seite 1 von 2

heap größe

Verfasst: Do 29. Aug 2013, 22:11
von PIC18F2550
Nach dem mein Programm nach Reset nicht geladen wurde suchte ich nach der Ursache.

Der vorgesehene heap im EEprom war zu klein ( 1F12l ong = 31816 Bytes. :cry:

Also schnell mal umgeschrieben jetzt ist er ( 1F3Eh long = 31988 Bytes). :D

Da hatten eigendlich nur 7 Bytes gefehlt. :LACHEN

Im Anhang mein Loader r56 zum Testen z.B. für PLEXUS

Ergebnis loader geht nicht mit PLEXUS da werden noch ein parr Dinge mehr benötigt

Re: heap größe

Verfasst: Fr 30. Aug 2013, 16:12
von PIC18F2550
Warum den Loder nicht mal in PASM?

Beim Booten verschwindet er in einem COG und wartet
Im letzten long des hRAM's in den unteren 16Bit wird ein Zeiger auf den Namen des zu Ladenden Image übergeben.
In den oberen übergibt der Loder seine COGID( zum Schutz ).
der Zeiger zeigt auf ein Feld von jeweils 3x12 Bytes.
Damit können in einem rutsch Administra, Bellatrix und Regnatix neu geladen werden.

Sind Dateinamen nicht hinterlegt wird auch nichts geladen.

Ran an den Speck. :D

Re: heap größe

Verfasst: Fr 30. Aug 2013, 20:49
von zille9
PIC18F2550 hat geschrieben:Im letzten long des hRAM's in den unteren 16Bit wird ein Zeiger auf den Namen des zu Ladenden Image übergeben.
Übergib doch den (oder die) Dateinamen im E-Ram

Re: heap größe

Verfasst: Fr 30. Aug 2013, 21:49
von PIC18F2550
zille9 hat geschrieben:Übergib doch den (oder die) Dateinamen im E-Ram
Da muß ich noch mehr routinen hineinpacken.
Außerdem Weis ich nicht was alles in den eRAM reinschreibt oder ihn sogar als Transferpuffer verwendet.
Nee das 1 long ist schon das kleinste Übel.

Die Dateinamen werden in den COG-Ram geladen damit steht bis auf einen Long der gesamte hRAM und eRAM zur verfügung.
Ein Programm muß nicht mit Reset oder so ähnichem verlassen werden einfach dem wartenden Loader einen Zeiger geben und weiter gehts.

Beim jetzigen Loader darf das Programm nur so groß sein wie der heap.
Der Speicher nach dem Heap ist dann ein toter bereich, der sich mit jedem Loaderaufruf (ohne Reset) vergrößert.

Re: heap größe

Verfasst: Fr 30. Aug 2013, 23:39
von PIC18F2550

Code: Alles auswählen

CON ' LOADER-KONSTANTEN
_CLKMODE        = XTAL1 + PLL16X
_XINFREQ        = 5_000_000

'signaldefinition regnatix
'#0,     D0,D1,D2,D3,D4,D5,D6,D7                         'datenbus
'#8,     A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10               'adressbus
'#19,    REG_RAM1,REG_RAM2                               'selektionssignale rambank 1 und 2
'#21,    REG_PROP1,REG_PROP2                             'selektionssignale für administra und bellatrix
'#23,    REG_AL                                          'strobesignal für adresslatch
'#24,    HBEAT                                           'front-led
'        BUSCLK                                          'bustakt
'        BUS_WR                                          '/wr - schreibsignal
'        BUS_HS '                                        '/hs - quittungssignal
'prop 1  - administra   (bus_putchar1, bus_getchar1)
'prop 2  - bellatrix    (bus_putchar2, bus_getchar2)
'                            +------------------------- al
'                            |+------------------------ /prop2
'          hbeat   --------+ ||+----------------------- /prop1
'          clk     -------+| |||+---------------------- /ram2
'          /wr     ------+|| ||||+--------------------- /ram1
'          /hs     -----+||| |||||           +--------- a0..a10
'                       |||| |||||           |
'                       |||| |||||-----------+ -------- d0..d7
DB_OFF           = %00000000_00000000_00000000_00000000 'maske: bus inaktiv
'DB_IN           = %00000111_11111111_11111111_00000000 'maske: dbus-eingabe
DB_OUT           = %00000111_11111111_11111111_11111111 'maske: dbus-ausgabe

M1               = %00000000_01011000_00000000_00000000 '/prop1=0, /wr=0, busclk=0  frida
M2               = %00000110_01011000_00000000_00000000 '/prop1=0, /wr=1, busclk=1  frida
M3               = %00000100_01111000_00000000_00000000 '/prop1=1, /wr=1, busclk=0  frida

M4               = %00000000_00000000_00000000_00000000
M5               = %00001000_00000000_00000000_00000000 '/hs=0?

#0,     OPT
        SD_MOUNT
        SD_DIROPEN
        SD_NEXTFILE
        SD_OPEN
        SD_CLOSE
        SD_GETC
        SD_PUTC
        SD_GETBLK
        SD_PUTBLK
        SD_SEEK
        SD_FATTRIB
        SD_VOLNAME
        SD_CHECKMOUNTED
        SD_CHECKOPEN
        SD_CHECKUSED
        SD_CHECKFREE
        SD_NEWFILE
        SD_NEWDIR
        SD_DEL
        SD_RENAME
        SD_CHATTRIB
        SD_CHDIR
        SD_FORMAT
        SD_UNMOUNT
        SD_DMACT
        SD_DMSET
        SD_DMGET
        SD_DMCLR
        SD_DMPUT
        SD_EOF

DAT ' Namen und Ort der zu ladenen Treiber
DATEN
        Byte "PROG1"  ,0,0,0,0,0,0,0, 0  ' Path Regnatix
        Byte "reg.bin"    ,0,0,0,0,0, 0  ' Regnatix

        Byte "PROG1"  ,0,0,0,0,0,0,0, 0  ' Path Bellatrix
        Byte 0,0,0,0,0,0,0,0,0,0,0,0, 0  ' Bellatrix

        Byte "LIB",0,0,0,0,0,0,0,0,0, 0  ' Path Administra
        Byte 0,0,0,0,0,0,0,0,0,0,0,0, 0  ' Administra

PUB main ' BOOT
    waitcnt(clkfreq*2+cnt)                                'kurze pause für slaves
    long[$7FFC]:=0
    cognew(@loader,0)
    long[$7FFC]:=@DATEN

DAT ' Loader
            org     0

'#####################################################################################
'# Warten auf Startfreigabe
'#####################################################################################
loader
            rdlong  STATUS, STATUSADR
            cmp     STATUS, $0
      if_z  jmp     #loader

'#####################################################################################
'# Copy Dateinahmen
'#####################################################################################
            mov     TEMP0,  78                ' Datenblock
            mov     TEMP1,  @PATH1            ' Zeiger auf internen Datenblock
nexta
            rdlong  TEMP1,  STATUS
            add     TEMP1,  $1
            add     STATUS, $1
            djnz    TEMP0,  #nexta

'#####################################################################################
'# Alle anderen COG's Stoppen
'#####################################################################################
            mov     TEMP0,  0                 ' 8 COG's
            cogid   TEMP1                     ' eigene COG- ausschließen
nextb
            cmp     TEMP0,  TEMP1
      if_nz cogstop TEMP0
            djnz    TEMP0,  #nextb

'#####################################################################################
'# Bus init
'#####################################################################################
'  outa[18..8]     := 0          ' adresse a0..a10 auf 0 setzen
'  outa[busclk]    := 0          ' busclk startwert
            andn    outa,   CON00
'  outa[reg_ram1]  := 1          ' ram1 inaktiv
'  outa[reg_ram2]  := 1          ' ram2 inaktiv
'  outa[reg_prop1] := 1          ' prop1 inaktiv
'  outa[reg_prop2] := 1          ' prop2 inaktiv
'  outa[bus_wr]    := 1          ' schreiben inaktiv
            or      outa,   CON01
'  dira := db_in                 ' datenbus auf eingabe schalten  frida
            mov     dira,   DBIN
'  outa[reg_al]    := 1          ' obere adresse in adresslatch übernehmen  frida
            or      outa,   REG_AL
            nop
'  outa[reg_al]    := 0                                                    'frida
            andn    outa,   REG_AL

'#####################################################################################
'# Path1
'#####################################################################################
            call    #spath1

'#####################################################################################
'# Load1
'#####################################################################################

'#####################################################################################
'# Path2
'#####################################################################################
            call    #spath2

'#####################################################################################
'# Load2
'#####################################################################################

'#####################################################################################
'# Path3
'#####################################################################################
            call    #spath3

'#####################################################################################
'# Load3
'#####################################################################################

'#####################################################################################
'# Bus OFF
'#####################################################################################
'  dira := db_off                ' datenbus auf eingabe schalten
            mov     dira,   $0

'#####################################################################################
'# Rücksprung
'#####################################################################################
            jmp     #loader

'#####################################################################################
'# Subroutine: PATH1
'#####################################################################################
spath1
            nop
spath1_ret  ret

'#####################################################################################
'# Subroutine: PATH2
'#####################################################################################
spath2
            nop
spath2_ret  ret

'#####################################################################################
'# Subroutine: PATH3
'#####################################################################################
spath3
            nop
spath3_ret  ret

'#####################################################################################
'# Variabeln und Constanten
'#####################################################################################
STATUSADR   long  $0000_7FFC
STATUS      long  $0000_0000

TEMP0       long  $0000_0000
TEMP1       long  $0000_0000

'                           +------------------------- al
'                           |+------------------------ /prop2
'         hbeat   --------+ ||+----------------------- /prop1
'         clk     -------+| |||+---------------------- /ram2
'         /wr     ------+|| ||||+--------------------- /ram1
'         /hs     -----+||| |||||           +--------- a0..a10
'                      |||| |||||           |
'                      |||| |||||-----------+ -------- d0..d7
CON00       long  %00000010_00000011_11111111_00000000  ' A0-A10 bus_wr busclk
CON01       long  %00000100_00111100_00000000_00000000  ' MEM1/2 PROP1/2 bus_wr
DBIN        long  %00000111_11111111_11111111_00000000
REG_AL      long  %00000000_10000000_00000000_00000000

PATH1       res   13            ' Verzeichnis von wo geladen werden Soll
DATEI1      res   13

PATH2       res   13
DATEI2      res   13

PATH3       res   13
DATEI3      res   13
So ungefähr sollte das beginnen.

Re: heap größe

Verfasst: Sa 31. Aug 2013, 10:43
von zille9
Guter Anfang :DAUMENHOCH . Allerdings ist diese Variante durch den fest vergebenen Dateinamen (in diesem Fall reg.dat) zu unflexibel.
Für Aufrufe aus einem Programm heraus müsste der Dateiname übergeben werden, sonst taugt der Loader nur für den Erststart.
Oder soll die Dateinamenübergabe nach dem gleichen Prinzip funktionieren?

DATEI
Byte "BOOT" ,0,0,0,0,0,0,0,0, 0 ' Path
Byte "xyz.bin" ,0,0,0,0,0, 0 ' Regnatix
Byte 0,0,0,0,0,0,0,0,0,0,0,0, 0 ' Bellatrix
Byte 0,0,0,0,0,0,0,0,0,0,0,0, 0 ' Administra

PUB main ' BOOT
long[$7FFC]:=0
cognew(@loader,0)
long[$7FFC]:=@DATEI

Re: heap größe

Verfasst: Sa 31. Aug 2013, 13:55
von TuxFan
Moin moin!
Mal der Neugier halber, wird das der Lader für Dein Hive-Basic? Der ausgefeilte Code-Ansatz sieht mir ganz danach aus.
Gruß
TuxFan

Re: heap größe

Verfasst: Sa 31. Aug 2013, 17:15
von drohne235
PIC18F2550 hat geschrieben:Warum den Loder nicht mal in PASM?
Nur kurz zu den Überlegungen bzgl. TriOS: Natürlich haben mir auch schon die Finger gejuckt bei dem Gedanken an einen PASM-Loader, aber die Grundidee bei TriOS war für mich persönlich immer, soviel wie möglich in Spin zu programmieren, da das für einen Einsteiger am einfachsten zu verstehen ist. Das soll natürlich niemanden hindern eine Alternative zu programmieren! ;) In der Laderoutine von mental (enthalten in TriOS R56 hive-trios\system\regnatix\m.spin) wird mental schon von einem PASM-Loader geladen und gestartet.

Wenn der PASM-Loader funktioniert, warum nicht gleich einen PASM-Backbone für den Hive?

Re: heap größe

Verfasst: Sa 31. Aug 2013, 18:08
von PIC18F2550
drohne235 hat geschrieben:Wenn der PASM-Loader funktioniert, warum nicht gleich einen PASM-Backbone für den Hive?
Nicht gleich übertreiben es hatt ja noch keiner mal meinen Loader aus 001 getestet.

@TuxFan Nein.

@zille9
Die daten sind frei wählbar.

Meine Vorstellung vom SD-Kartenaufbau:

/BOOT
/LIB
/PROG1
/PROG2
/PROG3

Ich habe mal 005 etwas Aktuallisiert.

Re: heap größe

Verfasst: Sa 31. Aug 2013, 18:46
von zille9
PIC18F2550 hat geschrieben:
drohne235 hat geschrieben:Wenn der PASM-Loader funktioniert, warum nicht gleich einen PASM-Backbone für den Hive?
Nicht gleich übertreiben es hatt ja noch keiner mal meinen Loader aus 001 getestet.

Loader funktioniert bei Plexus nur bis zum Startbildschirm, das eigentliche Programm wird nicht geladen. :SCHREIEN