Seite 1 von 7

Spin2CPP, FlexSpin, FlexCC, FlexProp (PASM, Spin, BASIC, C)

Verfasst: Do 25. Feb 2016, 17:53
von yeti
----------8<-----{20160225-1753-CET}----->8----------

Eigentlich wollte ich ja den spin2pasm-Branch von spin2cpp ausprobieren, aber irgendwie ist das noch zu heiß...

Status Quo: Ich hab den spin2pasm-Branch kompilieren können... aber Spinkram von interessanter Größe habe ich damit noch nicht nach PASM übersetzt bekommen, es fehlert mich an...

Stattdessen hab ich mal mit nur den Spin->C++-Features davon gespielt...

The source this is, Luke:

Code: Alles auswählen

' mandelbrot-20150214-fds
'
con
  _clkmode = xtal1+pll16x
  _clkfreq = 80_000_000

  xmin=-563714457 ' -2.1
  xmax=187904819  '  0.7

  ymin=-322122547 ' -1.2
  ymax=322122547  '  1.2

  maxiter=24

  MPX=79          ' 0..79
  MPY=24          ' 0..24

  c4=1073741824

obj
  ser : "FullDuplexSerial"

pub main | c,cx,cy,dx,dy,x,y,xn,yn,rsq,iter,px,py

  ser.start(31, 30, 0, 115200)

  dx:=(xmax-xmin)/MPX
  dy:=(ymax-ymin)/MPY

  cy:=ymin
  repeat py from 0 to MPY
    cx:=xmin
    repeat px from 0 to MPX
      x:=0
      y:=0
      rsq:=0
      iter:=0
      repeat while iter=<maxiter and rsq=<c4
        xn:=((x**x-y**y)<<4)+cx
        yn:=((x**y)<<5)+cy
        x:=xn
        y:=yn
        rsq:=(x**x+y**y)<<4
        iter+=1
      cx+=dx
      ser.tx(iter+32)
    cy+=dy
    ser.tx(13)

  waitcnt(_clkfreq+cnt)
  ser.stop
  cogstop(0)
...das ist das Integerarrithmetik-Mandelbrötchen, in dem noch irgendwie ein kleiner Denkfehler im Mitzählen oder der Abbruchbedingung steckt... das Innere der Menge wird schon hinreichend korrekt bestimmt, aber bei den Farben drumrum verdaddelt's sich noch irgendwie...

....aber für den spin2cpp-Test kann es trotzdem gut herhalten...

...und es war einmal ein Makefile:

Code: Alles auswählen

SPINSIM     = /opt/parallax/bin/spinsim
SPIN2CPP    = /opt/spin2cpp/bin/spin2cpp
SPINSTDLIB  = /opt/parallax.spin.src/spin

main.binary: main.spin Makefile
        PATH="/opt/parallax/bin:$PATH" $(SPIN2CPP) -L ../lib -L $(SPINSTDLIB) --binary main.spin

run: main.binary Makefile
        $(SPINSIM) main.binary -b

clean: Makefile
        rm -f main.binary *~
Tun oder nicht tun es du mußt...

Code: Alles auswählen

$ ls -l
insgesamt 8
-rw-r--r-- 1 yeti yeti 842 Feb 25 17:27 main.spin
-rw-r--r-- 1 yeti yeti 385 Feb 25 17:45 Makefile
$ make
PATH="/opt/parallax/bin:ATH" /opt/spin2cpp/bin/spin2cpp -L /opt/parallax.spin.src/spin --binary main.spin
$ ls -l
insgesamt 40
-rw-r--r-- 1 yeti yeti 11405 Feb 25 17:46 FullDuplexSerial.cpp
-rw-r--r-- 1 yeti yeti   935 Feb 25 17:46 FullDuplexSerial.h
-rwxr-xr-x 1 yeti yeti  6388 Feb 25 17:46 main.binary
-rw-r--r-- 1 yeti yeti  1551 Feb 25 17:46 main.cpp
-rw-r--r-- 1 yeti yeti   778 Feb 25 17:46 main.h
-rw-r--r-- 1 yeti yeti   842 Feb 25 17:27 main.spin
-rw-r--r-- 1 yeti yeti   385 Feb 25 17:45 Makefile
$ make run
/opt/parallax/bin/spinsim main.binary -b
!!!!!!!!!!!!!!!"""""""""""""(&###$('$)*'&%)*####################"""""""""""""""+
!!!!!!!!!!!!!"""""""""$,%)##'1%$%$%%')#######$0'%+$$%'0(%&-$$1%$####$"""""""""""
!!!!!!!!!!!"""""""%$)###$&&)+%%'%)#######$)%%&&$$'&%4&(+,)+3'$$$&%'&####)$""""""
!!!!!!!!!"""""()&##$$$,'$,$$'&#######5%&(/)$$$$)+%%&'1*99/**)(%+$$$%%(####'%$"""
!!!!!!!!""""(##$%-+%%%%%%$#######)+)('%$$$$&%%))&)'/,9999999+'&%%%&($$$/####$$('
!!!!!!!"""#%-+($%$(2$%########&')$$$$$'&%&'-,+)-(+)*/999999..)+('&&&&/&&$&###$&&
!!!!!!""-)&%&&%%$##########$$$$$%.1'%%&+&'+.99908999999999999999/+.9739)%*$####'
!!!!!"$&+$/$##########$$$/)+*'&%%%%,4&&'+-+799999999999999999999999997(&++$$####
!!!!"6+%#######')$$$)%&(,,**-+''(-*('((/259999999999999999999999999994,)4-&$%###
!!!!+###9'(&(($$&)(*%*0*20922+89-7,)),*99999999999999999999999999999999+''*$&'##
!!!!#,%'&&)$$$*(%%%%+''++.7999999999902999999999999999999999999999999999'%0$,'-#
!!!#'$$$$$$%'**&**)).24.69999999999999999999999999999999999999999999999'(%)$$%&#
!!!69999999999999999999999999999999999999999999999999999999999999992++'&(%*$$(%#
!!!#'$$$$$$%'**&**)).24.69999999999999999999999999999999999999999999999'(%)$$%&#
!!!!#,%'&&)$$$,(%%%%1''++.7999999999902999999999999999999999999999999998'%-$+')#
!!!!9###+'(&(($$&)(+%*/*30926+69-7,)),*99999999999999999999999999999998+''-$&'##
!!!!"+*%#######')$$$)%&(,1**-+''(4*('((0259999999999999999999999999994,)47&$%###
!!!!!"$&*$+$##########$$$/)0)'&%%%%+*&&'+-+799999999999999999999999999(&/5$$####
!!!!!!"",)&%&&%%$##########$$$$$%+,'%%&6&'+.99908999999999999999/+.9939)%*$####'
!!!!!!!"""#%+3($%$()$%########&'*$$$$$'&%&'/,+)0(+)*/999999..)+('&&&&/&&$&###$&&
!!!!!!!!""""(##$%,+%%%%%%$#######)+)('%$$$$&%%))&)'2,9999999+'&%%%&($$$.####$$('
!!!!!!!!!"""""*)&##$$$)'$+$$'&#######6%&(,,$$$$),%%&'-*99/**)(%*$$$%%(####'%$"""
!!!!!!!!!!!"""""""%$,###$&&-.%%'%)#######$)%%&&$$'&%.&(+,)+/'$$$&%'&####*$""""""
!!!!!!!!!!!!!"""""""""$*%)##'*%$%$%%')#######$2'%5$$%'0(%&0$$)%$####$"""""""""""
!!!!!!!!!!!!!!!"""""""""""""(&###$('$+*'&%)0####################""""""""""""""")
$ _
Na? Wie ist das?
Von Spin zu Binary ohne "offiziellen" Spin-Compiler...
Nebenbei zeigt's beim Lauf via spinsim mit "-b" Option auch noch wie spinsim die serielle Ausgabe auf Pin 30/31 "versteht" und ins Terminal leitet...

Ist doch hübsch, oder?

...und eiiines Taaages wird auch die Spin->PASM-Übersetung mich nimmer anzicken...

Re: spin2cpp

Verfasst: Do 25. Feb 2016, 18:27
von BorgKönig
assimlilieren es du musst ;)

also... mal zum verständnis für die unimatrix: du schreibst spin code und schubst das durch ein gcc gewusel, damit am ende ein binärer code entsteht, den der hive dann ausführen kann...? und für das ganze muss auch noch ein pinguin her halten...? heist der pinguin debian, oder doch eher ubuntu?

auf jedem sieht das interessant aus :) ik glaub, mein hive sollte auch wieder was tun... der steht nen bissl sinnlos herum....

Re: spin2cpp

Verfasst: Do 25. Feb 2016, 18:53
von yeti
BorgKönig hat geschrieben:assimlilieren es du musst ;)

also... mal zum verständnis für die unimatrix: du schreibst spin code und schubst das durch ein gcc gewusel, damit am ende ein binärer code entsteht,
Spin->C++ mittels spin2cpp, danach C++->ASM->Binär mit PropGCC und spinsim simuliert dann einen Propeller, sodaß zum Test das Ausgraben eines Echtpropellers aus meinen Microcontrollersedimenten unterlassen werden kann.
BorgKönig hat geschrieben:den der hive dann ausführen kann...?
Von Hive war da nirgendwo die Rede.
BorgKönig hat geschrieben:und für das ganze muss auch noch ein pinguin her halten...? heist der pinguin debian, oder doch eher ubuntu?
Für mich nur das Original! :-P
BorgKönig hat geschrieben:auf jedem sieht das interessant aus :) ik glaub, mein hive sollte auch wieder was tun... der steht nen bissl sinnlos herum....
Meiner ooch... die Single-Propeller-Boards fasse ich öfter mal an, wenn spinsim nicht ausreicht. Ich finde spinsim für die kleine Propellerei zwischendurch sehr angenehm. Solange es nur um 'nen nackischen Prop geht, tut's das ganz gut...

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 08:04
von yeti
----------8<-----{20160226-0804-CET}----->8--------

Gib mir ein "ÖÖÖöööh???"!

Code: Alles auswählen

$ cat main1.spin 
pub main | a,b,c
 a:=123
 b:=456
 c:=a+b
$ /opt/spin2cpp/bin/spin2cpp --asm main1.spin 
$ cat main1.pasm 
DAT
        org     0
main
main_ret
        ret

$ _
ÖÖÖöööh???
...ist der jetzt schlau und erkennt die im Weiteren nimmer benutzte Variable "c" und optimiert die somit insgesamt überflüssige Berechnung weg?

Gib mir ein "AAAaaah!!!"!

Code: Alles auswählen

$ cat main2.spin 
pub main
 qnd(987,654)

pub qnd(b,c)
  return a+b

$ /opt/spin2cpp/bin/spin2cpp --asm main2.spin 
$ cat main2.pasm 
DAT
        org     0
main
        mov     qnd_b_, imm_987_
        mov     qnd_c_, imm_654_
        call    #qnd
main_ret
        ret

qnd
        add     qnd_a_, qnd_b_
        mov     result_, qnd_a_
qnd_ret
        ret

imm_654_
        long    654
imm_987_
        long    987
qnd_a_
        long    0
qnd_b_
        long    0
qnd_c_
        long    0
result_
        long    0
$ _
AAAaaah!!!
Wir werden wohl doch noch Freunde!
\o/

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 09:00
von PIC18F2550
Hi yeti,

Was macht er aus Arrays von Variabeln wo nur die erste als @Var übergeben wird?

Löscht er die nachfolgenden einfach weg? Oder behält er den Speicherplatz der ansonsten benötigten Variabeln bei.

Beispiel aus FullDuplexSerial.spin.

Code: Alles auswählen

[/VAR

  'Global variable declarations

  long  cog           'cog flag/id

  '9 longs, MUST be contiguous
  long  rx_head                 
  long  rx_tail
  long  tx_head
  long  tx_tail
  long  rx_pin
  long  tx_pin
  long  rxtx_mode
  long  bit_ticks
  long  buffer_ptr
....

PUB Start(rxPin, txPin, mode, baudrate) : okay
  longfill(@rx_head, 0, 4)                              'zero out the buffer pointers
  longmove(@rx_pin, @rxpin, 3)                          'copy the start parameters to this objects pin variables
....
Das Problem ist das der Aufruf der originalen Variabelnplätze mit anderen Variabelnnahmen oder lokalen Bezeichnungen erfolgen kann.

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 11:18
von yeti
----------8<-----{20160226-1118-CET}----->8----------

Ich seh da kein Array!
:-P

...aber ich denk, ich kappier was Du meinst...

Code: Alles auswählen

$ cat main3.spin 
var
  long  somevar

  '9 longs, meant to be contiguous
  long  othervar0
  long  othervar1
  long  othervar2
  long  othervar3
  long  othervar4
  long  othervar5
  long  othervar6
  long  othervar7
  long  othervar8

pub main
  othervar4:=othervar4
  othervar6:=othervar2

  othervar0:=othervar8
  othervar2:=othervar6
$ /opt/spin2cpp/bin/spin2cpp --asm main3.spin 
$ cat main3.pasm 
DAT
        org     0
main
        mov     othervar6, othervar2
        mov     othervar0, othervar8
        mov     othervar2, othervar6
main_ret
        ret

othervar0
        long    0
othervar2
        long    0
othervar4
        long    0
othervar6
        long    0
othervar8
        long    0
$ _
"somevar", sowie die nicht benutzten "othervar$X" sind wegoptimiert und die Überlebenden hat er in der Reihenfolge ihrer Definition angelegt.

Ich kommentiere diese Art der Arraybildung mal demonstrativ nicht!

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 14:31
von PIC18F2550
Treffer versenkt. :)

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 18:55
von yeti
PIC18F2550 hat geschrieben:Treffer versenkt. :)
Ich find's suuuper! ;-D

Sich auf die relative Lage im Speicher eigentlich voneinander unabhängiger Variablen zu verlassen, war mir schon immer unheimlich.

Die Anweisung im Quelltext, daß ein gewisser Bereich von Variablen gefälligst in Anzahl, Typen und Reihenfolge nicht verändert werden soll, ist nur ein Kommentar in einer(!) menschlichen Sprache und ganz schnell Opfer für's nicht verstanden oder ignoriert Werden. Insbesondere dem Compiler ist sie Wurst...

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 23:13
von PIC18F2550
Es gibt noch mehr versteckte Arrays.

Code: Alles auswählen

SUB array1(a,b,c)
  subroutine1(@a)
oder

Code: Alles auswählen

SUB array2 | a,b,c
  subroutine2(@a)
Das rührt daher das die Programmierer lieber mit Klarnahmen als mit Pointern arbeiten.

Ich weiss nicht ob das hilft.

Code: Alles auswählen

SUB array1(a,b,c)
  b := b
  c := c
  subroutine1(@a)
Wenn der compiler den Quatsch nicht durch Optimierung entfernt sollte alles stimmen.

Re: spin2cpp

Verfasst: Fr 26. Feb 2016, 23:38
von yeti
Das Mandelbrötchen benutzt "FullDuplexSerial" erfolgreich. Die Spin->C++-Übersetzung hat also diese Übergabe in "FullDuplexSerial" nicht geshreddert...

Übersetzung nach C statt C++ per "--ccode"-Option fehlert in "FullDuplexSerial", aber da seh ich keinen Zusammenhang zu den Parameterblöcken...

...und das "--asm"-Jedöns ist eh noch ganz heiße Ware...

Das muß definitiv nochn bissl auf die Weide,,,

Wir haben Propeller... wir haben gelernt zu warten...