www.mikrocontroller.net

Forum: Compiler & IDEs pushen und popen (msp430)


Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo liebe asm-freunde.

ich hab ein problem.
ich brauche 2 funktionen!!!
diese sollen für den gcc und den iar compiller geschrieben werden.
es sollen einfach register in eine struktur bzw zurück geschrieben
werden. aber es geht nicht :-( mag wohl daran liegen, das ich kein asm
mensch bin.
typedef struct regs
{
  uint16_t r4;
  uint16_t r5;
  uint16_t r6;
  uint16_t r7;
  uint16_t r8;
  uint16_t r9;
  uint16_t r10;
  uint16_t r11;
}regs

regs* Push(regs *task)
{
  task->r4  = asm("push  r4");
  task->r5  = asm("push  r5");
  ....
}

regs* Pop(regs *task)
{
  asm("pop r4") = task->r4;
  asm("pop r5") = task->r5;
        ...
}

könnt ihr mir dabei helfen?

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

Bewertung
0 lesenswert
nicht lesenswert
Register in eine Struktur?  Was willst du denn damit tun?

Für den GCC könntest du dir wahrscheinlich mit inline asm was
zimmern, der Inline-Assembler des IAR ist aber zu blöd, auf
irgendwas anderes als globale Symbole zuzugreifen, d.h. all die
vielen schönen Paramterübergaben mitsamt den constraints, die
GCC's Inline-Assembler beherrscht, sucht man dort vergeblich.

Das Beste ist es aber vermutlich, gleich alles in Assembler zu
zimmern.

Aber mit Registern arbeiten und dann portabel sein wollen?  Das
verstehe ich nicht.  Zwischen beiden Compilern ist doch praktisch
alles, was die Register angeht, grundverschieden realisiert.

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das da ziemlich viel unterschied besteht ist doch garkeine frage! aber
wenn man sich schön strikt an ansi-c hält ( iar wirbt nunmal damit das
sie iso/ansi konform sind), dann kann man durchaus portabel schreiben!
(nur z.b. solche sachen wie inline asm sind extrem verschieden!)

falls es interessiert, es soll eine art scheduler für den msp430
werden. es sind eigentlich verkettete listen (einfacher ansi code). nur
um diese zu füllen brauche ich compilerabhängigen code (eben das pushen
und popen)...

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
asm ist eine Directive und kann damit weder einen Wert einlesen noch
zurückgeben.

Wenn Du in Assembler auf Variablen (SRAM-Adressen) zugreifen willst,
mußt Du das über Load (LD)* oder Store (ST)* Befehle tun.

Push, Pop greifen immer nur auf den Stack zu.


Peter


* wie die beim MSP430 heißen weiß ich nicht.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"...wenn man sich schön strikt an ansi-c hält..."

Assembler und ANSI-C schließen sich gegenseitig aus !!!

Es geht nur entweder oder !


Was versprichst Du Dir überhaupt vom Einsatz von Assembler ?

Ich würde überhaupt auch nur jenem zu Assembler unter C raten, der
schonmal mindestens ein funktionierendes Programm komplett in Assembler
geschrieben hat und auch ein Compiler Listing versteht.


Peter

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was versprichst Du Dir überhaupt vom Einsatz von Assembler ?

Da KoF von einem Scheduler sprach, hört sich das sehr nach einem RTOS
an ;-).

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau... ein rtos soll es werden.
(jetzt bitte nicht davon reden, warum man das rad neu erfinden soll /
es schon eine halbe mil. von ihnen gibt.)

ich mache es, um es gemacht zu haben/um daraus zu lernen. mir ist schon
klar, das es eine unzahl von ihnen gibt, doch das interessiert mich aus
eben diesen gründen nicht!

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aja... den gcc teil habe ich (glaube ich) geknackt ;-)
//save the registers
#define OS_Push_GCC()        \
  asm volatile (  "push  r4  \n\t"  \
          "push  r5  \n\t"  \
          "push  r6  \n\t"  \
          "push  r7  \n\t"  \
          "push  r8  \n\t"  \
          "push  r9  \n\t"  \
          "push  r10  \n\t"  \
          "push  r11  \n\t"  \
          "push  r12  \n\t"  \
          "push  r13  \n\t"  \
          "push  r14  \n\t"  \
          "push  r15  \n\t"  \
         );
// restore the registers
#define OS_Pop_GCC()        \
  asm volatile (  "pop  r15  \n\t"  \
          "pop  r15  \n\t"  \
          "pop  r14 \n\t"  \
          "pop  r13  \n\t"  \
          "pop  r12  \n\t"  \
          "pop  r11  \n\t"  \
          "pop  r10  \n\t"  \
          "pop  r9  \n\t"  \
          "pop  r8  \n\t"  \
          "pop  r7  \n\t"  \
          "pop  r6  \n\t"  \
          "pop  r5  \n\t"  \
          "pop  r4  \n\t"  \
          "reti    \n\t"  \
        );

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn du das in einzelne Zeilen aufteilst, statt einen großen
Klumpen zu nehmen, sollte das auch der IAR können.  Kann sein,
dass er kein volatile in Zusammenhang mit asm versteht, kann
auch sein, dass du unbedingt _asm oder __asm_ schreiben
musst, ich hab' das Manual gerade nicht hier.

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
iar, wie auch mspgcc verwenden zur erkennung beide asm("<todo>") als
syntax. aber wie das mit der aufteilung von mehreren befehlen jetzt im
iar aussieht, darum kümmere ich mich jetzt ;-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Assembler und ANSI-C schließen sich gegenseitig aus !!!

Eigentlich nicht. asm ist sogar ein Schlüsselwort in ANSI/ISO-C.
Natürlich ist die Syntax dort nicht definiert und damit das Programm
auch nicht portabel.

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

Bewertung
0 lesenswert
nicht lesenswert
> asm ist sogar ein Schlüsselwort in ANSI/ISO-C.

Ich wollte mich gerade wundern...  Aber dem ist natürlich nicht
ganz so.

asm ist unter "J.5 Common extensions" aufgeführt.  Damit ist es
ganz deutlich kein Bestandteil des Standards.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, aber es wird zumindest erwähnt ;-)
Hab's wohl mit C++ verwechselt. Dort ist es so wie ich sagte.
Mea culpa

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
arg... mistmadiger iar...
kann mir jemand sagen, wie ich das vom gcc auf iar portieren soll???
__asm__ __volatile__("mov.w SP, %0" : "=r" (CurrentTask->stack));
...
__asm__ __volatile__("mov.w %0, SP" : : "m" (CurrentTask->stack));

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

Bewertung
0 lesenswert
nicht lesenswert
Knick es.  Wie ich dir eingangs schon schrob, der Inline-Assembler
des IAR ist saublöd, verglichen mit dem des GCC.

Schreib den ganzen Krempel lieber als separates Assemblerfile.

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.