Seite 1 von 1

Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Do 17. Dez 2015, 13:22
von PIC18F2550
Hallo,

Ich habe einige Subroutinen die ich von mehreren COGs nutzen will.

Code: Alles auswählen

PUB mysub(var1) : erg | var2
' Muster ohne Sinn'
  var2 := var1 * 1000
  erg := var1 / var 2
Was passiert mit den Variabeln var1, erg und var2 wenn zwei GOGs gleichzeitig auf die Routine zugreifen?

Ich vermute das deren Inhalt von beiden COGs überschrieben wird.
Und gibt es dafür eine Lösung?

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Do 17. Dez 2015, 17:14
von kuroneko
Alle Variablen liegen auf dem Stack des callers. Gibt also keine Probleme wie Du sie beschreibst.

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Do 17. Dez 2015, 17:23
von PIC18F2550
Also wenn jeder COG alle locale Variabeln seinen seinen eigenen Stack legt habe ich mir umsonnst den Kopf darüber zerbrochen.

Da brauch ich mich nur noch um die I/O und den hRAM kümmern.

Danke kuroneko.

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Di 5. Jan 2016, 20:47
von PIC18F2550
Ich grüble gerade über die PrintStr Routine von dem GUIDemo Programm.

Auf diese routine greifen zwei GOGs im SPIN Modus darauf zu.
Beide ausgaben arbeiten allein ohne Probleme.
Nur wenn beide auf die Ausgabe zugreifen kommt Müll raus.

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 08:08
von U-Held
...und die beiden Cogs gehen nicht zufällig gleichzeitig auf den Bus?

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 10:02
von PIC18F2550
Nein es handelt sich nicht um IO Funktionen es sind Ausgaben auf dem Bildschirm innerhalb von Bellatrix.

Ein COG (SPIN) arbeitet mit den BUS der andere nicht.

Einmal soll eine über den Bus übertragene Zahl ausgegeben werden und der andere COG gibt in der Statusleiste die Mausposition aus.

Beide greifen auf die interne "PRI PrintStr(x,y,pntr)" zu.

Dupliziere ich diese Routine in "PRI PrintStr1(x,y,pntr)" und "PRI PrintStr2(x,y,pntr)" gibt es keine Probleme.( Die zugehörigen Unterroutinen mussten auch dupliziert werden)

Nun da der Speicher schon rapiede verbraucht wurde, suche ich nach einer einfachen Lösung.

Ich dachte schon mal daran die werte "x,y,pntr" in ein Array zu laden was mit der cogid indiziert wird.
In der Routine "PRI PrintStr" wollte ich dann mit lockset/lockclr arbeiten und nach der freigabe die Werte aus dem Array holen um diese abzuarbeiten.

Leider bin ich mit der lock.. Sache nicht klargekommen. :cry:

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 13:35
von kuroneko
PIC18F2550 hat geschrieben:Dupliziere ich diese Routine in "PRI PrintStr1(x,y,pntr)" und "PRI PrintStr2(x,y,pntr)" gibt es keine Probleme.( Die zugehörigen Unterroutinen mussten auch dupliziert werden)
im Original ist PrintStr eine Leaf-Funktion. Von welchen Unterroutinen sprichst Du?

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 14:23
von PIC18F2550
Ja Ok kuroneko Du hast recht, das mit den Unterroutinen gehört genauer zur Vorbereitung.
Ich habe aber auch versuche mit string("A") anstelle von decf( idx , 2 ) gemacht mit dem selben sporatischen Fehler.

Code: Alles auswählen

PUB main ...
    '----------------------------------------------------------------------
    'user application code goes here or after the ProcessUI call (but still
    'within the REPEAT loop!).
    '----------------------------------------------------------------------
    idx := GetMouseXY
    PrintStr( vga_rows-1, 15, decf( idx >> 8,  2 ), 0 )
    PrintStr( vga_rows-1, 20, decf( idx & $FF, 2 ), 0 )

Code: Alles auswählen

PUB COG2 ...
  ...
    PrintStr( vga_rows-1, 34, decf( FreeCog ,  2 ), 0 )
  ...
PUB decf...
PUB clrstr...
Pub decstr...

Code: Alles auswählen

PUB PrintStr( prRow, prCol, strPtr, inv ) | strLen, vgaIdx
'this places text anywhere on the screen and can overwrite UI elements
'
' prRow  = row
' prCol  = column
' strPtr = pointer to null terminated string
' inv    = 0 for normal   1 for inverted video

  if ( prRow < VGAROWS ) AND ( prCol < VGACOLS )
    strLen := strsize( strPtr )
    vgaIdx := prRow * VGACOLS + prCol
    bytemove( @scrn.byte[vgaIdx], strPtr, strLen )

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 17:57
von kuroneko
decf sieht verdaechtig danach aus, dass es einen internen Buffer zurueckgibt. Wenn das nicht serialisiert ist, dann gibt's eben Muell. Die Originalvariante nutzt nur lokale Variablen. Den einzigen Aerger den Du damit kriegen kannst sind ueberlagerte Ausgaben (e.g. y same, x = 4 und x = 5) oder wenn Du ans Bildschirmende kommst (max x, max y) weil da der String nicht begrenzt wird.

Re: Subroutine in SPIN von mehreren COGs benutzen

Verfasst: Mi 6. Jan 2016, 22:11
von PIC18F2550
OK ich werd es erstmal mit der Dopplung weitermachen.
Mal sehen ob der Speicher reicht.