www.mikrocontroller.net

Forum: Compiler & IDEs Assembler Code in WinAVR einbetten mit Hilfe asm volatile


Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich wolle meinen bestehenden Code "beschleunigen" in dem ich einige 
passagen in Assembler programmier. Da ich auf C an manchen Stellen nicht 
verzichten moechte, wollte ich nur teilweise den code ersetzen.

in der doku fand ich:
asm volatile ("nop");

bzw
static inline void delayloop16 (uint16_t count)
{
    asm volatile ("cp  %A0, __zero_reg__ \n\t"
                  "cpc %B0, __zero_reg__ \n\t"
                  "breq 2f               \n\t"
                  "1:                    \n\t"
                  "sbiw %0,1             \n\t"
                  "brne 1b               \n\t"
                  "2:                    "  
                  : "=w" (count)
            : "0"  (count)
    );                            
}

und dann hab ich mal einfach
while (!(SPSR & (1<<SPIF)));    //wait for SPIF
durch dies ersetzt:
asm volatile ("loop1:       \n\t"
     "sbis spsr,spif  \n\t"
"rjmp loop1     \n\t"
); 

und der Compiler meldet immer folgenden fehler:
C:\DOKUME~1\root\LOKALE~1\Temp/ccQXaaaa.s: Assembler messages:
C:\DOKUME~1\root\LOKALE~1\Temp/ccQXaaaa.s:123: Error: constant value 
required
C:\DOKUME~1\root\LOKALE~1\Temp/ccQXaaaa.s:123: Error: constant value 
required

Hat jemand erfahrung mit In Code Assemlber?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Kaplan wrote:

> ich wolle meinen bestehenden Code "beschleunigen" in dem ich einige
> passagen in Assembler programmier.

Was macht dich glauben, dass du ihn damit "beschleunigen" könntest?
Hast du dir denn den generierten Code erstmal angeguckt?

Ist natürlich besonders lustig, wenn du anschließend Warteschleifen in
Assembler schreibst.  Schneller warten, oder was? :-)

> in der doku fand ich:
>
asm volatile ("nop");

In der Doku solltest du deutlich mehr darüber finden:

http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

> und dann hab ich mal einfach
> while (!(SPSR & (1<<SPIF)));    //wait for SPIF
> durch dies ersetzt:

Hmm, das ist nun ein typischer Fall, bei dem es wohl absolut gar
keinen Sinn hat.  Erstens (siehe oben) verwartest du deine Zeit ja
sowieso nur, zweitens ist der vom Compiler generierte Code wohl durch
nichts zu unterbieten:
.global waitspi
        .type   waitspi, @function
waitspi:
/* prologue: frame size=0 */
/* prologue end (size=0) */
.L3:
        sbis 46-0x20,7
        rjmp .L3
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */

(compiliert für einen ATmega8)

>
> asm volatile ("loop1:       \n\t"
>      "sbis spsr,spif  \n\t"
> "rjmp loop1     \n\t"
> ); 

Erstens würden sich SPSR und SPIF groß schreiben, nicht klein.
Zweitens kennt der Assembler diese Namen einfach nicht -- avr/io.h
löst sie ja für den C-Compiler auf, nicht für den Assembler.  Du
müsstest also den Compiler (der die Umsetzung ja kennt) anweisen, die
entsprechenden Zahlenkonstanten in das inline asm statement
runterzureichen.

Aber siehe oben, viel Aufwand für keinerlei Effekt.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,
ok so ohne background sieht es ziemlich unsinnig aus. zugegeben... Aber 
das ganz sollte zur beschleunigung dienen. Und zwar wartet der 
Mikrocontroller ja auf das SPIF signal. schneller warten heisst hier 
auch schneller von der änderung des signals mitzubekommen und folglich 
kann ich schneller den wert des Registers auslesen.
ich wollte damit nur meine SPI kommunikation zwischen MASTER und SLAVE 
(jeweils ATMEga16) beschleunigen..siehe anderer Thread:
Beitrag "AVR AtMega 16 schnellste SPI realisierung? Daisy Chain..."

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Kaplan wrote:

> Aber
> das ganz sollte zur beschleunigung dienen.

Es hilft eben nur nichts, wenn der compilergenerierte Code bereits
minimal ist.  Da ist nichts mehr dran zu optimieren.

``Never start optimizing before you have profiled it.''

> siehe anderer Thread:

Hmm, ich kann dir aus eigener Erfahrung sagen, dass Microcontroller
ziemlich miserable SPI-Slaves sind.  SPI ist ein Schieberegister und
lässt sich damit am besten mit schieberegisterartiger Hardware
implementieren.  Das Dilemma für einen Software-Slave ist, dass er
keinerlei Möglichkeit hat, dem Master anzuzeigen, ob er schon bereit
ist fortzufahren -- anders als z. B. bei I²C, bei dem der Slave den
Master ,,bremsen'' kann, wenn er noch nicht so weit ist.

Autor: Patrick Kaplan (kaplan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> Das Dilemma für einen Software-Slave ist, dass er
> keinerlei Möglichkeit hat, dem Master anzuzeigen, ob er schon bereit
> ist fortzufahren -- anders als z. B. bei I²C, bei dem der Slave den
> Master ,,bremsen'' kann, wenn er noch nicht so weit ist.

unn das problem hab ich mithilfe eines SHakehands prinzip geloest 
(zusaetzliche leitung von slave zum master um BUSY Status zu vermitteln.
das ganze geht wunderbar. aber wenn ich da oszi anschau dann wundere ich 
mich dass zwischen den einzelnen Byte bloecken noch so viel platz ist. 
und da hab ich mir gedacht, das kann nur am lahmen code liegen... wobei 
die aktivierung von CODE OPTIMIZATION schon einiges gebracht hat... aber 
vielleicht lass ich es auch so und schau ob die datenuebertragung 
reicht. C gefaellt mir sowieso besser ;)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Errm, wenn du natürlich ohne Optimierung baust, brauchst du dich über
nichts zu wundern...  Das hatte ich stillschweigend vorausgesetzt.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine gute Inline ASM Erläuterung findet sich bei den Robotern:
http://www.roboternetz.de/wissen/index.php/Inline-...

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok so langsam klappt das ganze aber wenn ich die Code optimierung von 
WINAVR auf "-03" einstelle, bringt das ganze schon keinen spuerbaren 
vorteil mehr...

anscheinend ist mein C-Code schon einfach genug :)


immerhin kann ich jetzt meine Zeitkriterien nun gut einhalten.


vielen dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.