pushen und popen (msp430)

Gast #238456
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.
1
typedef struct regs
2
{
3
  uint16_t r4;
4
  uint16_t r5;
5
  uint16_t r6;
6
  uint16_t r7;
7
  uint16_t r8;
8
  uint16_t r9;
9
  uint16_t r10;
10
  uint16_t r11;
11
}regs
12

13
regs* Push(regs *task)
14
{
15
  task->r4  = asm("push  r4");
16
  task->r5  = asm("push  r5");
17
  ....
18
}
19

20
regs* Pop(regs *task)
21
{
22
  asm("pop r4") = task->r4;
23
  asm("pop r5") = task->r5;
24
        ...
25
}
könnt ihr mir dabei helfen?
Moderator Persönliche Seite #238457
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.
Gast #238458
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)...
Gast #238459
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.
Gast #238460
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
Gast #238462
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!
Gast #238463
Lesenswert?

aja... den gcc teil habe ich (glaube ich) geknackt ;-)
1
//save the registers
2
#define OS_Push_GCC()        \
3
  asm volatile (  "push  r4  \n\t"  \
4
          "push  r5  \n\t"  \
5
          "push  r6  \n\t"  \
6
          "push  r7  \n\t"  \
7
          "push  r8  \n\t"  \
8
          "push  r9  \n\t"  \
9
          "push  r10  \n\t"  \
10
          "push  r11  \n\t"  \
11
          "push  r12  \n\t"  \
12
          "push  r13  \n\t"  \
13
          "push  r14  \n\t"  \
14
          "push  r15  \n\t"  \
15
         );
16
// restore the registers
17
#define OS_Pop_GCC()        \
18
  asm volatile (  "pop  r15  \n\t"  \
19
          "pop  r15  \n\t"  \
20
          "pop  r14 \n\t"  \
21
          "pop  r13  \n\t"  \
22
          "pop  r12  \n\t"  \
23
          "pop  r11  \n\t"  \
24
          "pop  r10  \n\t"  \
25
          "pop  r9  \n\t"  \
26
          "pop  r8  \n\t"  \
27
          "pop  r7  \n\t"  \
28
          "pop  r6  \n\t"  \
29
          "pop  r5  \n\t"  \
30
          "pop  r4  \n\t"  \
31
          "reti    \n\t"  \
32
        );
Gast #238466
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.
Gast #238469
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren