Subroutine in SPIN von mehreren COGs benutzen

Allgemeine Themen rund um den Propeller Mikrocontroller und Elektronik
Antworten
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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?
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag von kuroneko »

Alle Variablen liegen auf dem Stack des callers. Gibt also keine Probleme wie Du sie beschreibst.
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag von U-Held »

...und die beiden Cogs gehen nicht zufällig gleichzeitig auf den Bus?
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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:
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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?
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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 )
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag 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.
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Subroutine in SPIN von mehreren COGs benutzen

Beitrag von PIC18F2550 »

OK ich werd es erstmal mit der Dopplung weitermachen.
Mal sehen ob der Speicher reicht.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Antworten