2016-06-02 10 views
0
void save_context(uint8_t index) { 
    context *this_context = contextArray + index; 
    uint8_t *this_stack = this_context->stack; 


    asm volatile("st %0 r0": "r"(this_stack)); 
} 

Ich habe so etwas.Inline-Montage in Avr

!!! Ich möchte die Register r0 r1 r2 ... in meinem Stack [] Array speichern.

Was ich programmieren bin, ist der Kontextwechsel. Der Kontext hat die Struktur wie folgt aus:

typedef struct context_t { 
    uint8_t stack[THREAD_STACK_SIZE]; 
    void *pstack; 
    struct context_t *next; 
}context; 

Mein Problem ist, dass ich nicht in der Lage bin, die c-Variable „this_stack“ Montage Inline passieren. Mein Ziel ist es, alle Register, Stapelzeiger und SREG auf meinem Stapel zu speichern.

Nach dem Kompilieren, es gibt Fehler: Beschreibung Ressourcenpfad Ortstyp

`,' required 5_multitasking  line 754, external location: C:\Users\Jiadong\AppData\Local\Temp\ccDo7xn3.s C/C++ Problem 

ich das avr Inline-Assembler Tutorial nachgeschlagen. Aber ich bekomme nicht viel. Könnte mir jemand helfen?

+0

' "label"' keinen Sinn macht, sollte diese eine Einschränkung sein. Es macht auch keinen Sinn, den Stapelzeiger in einem Array zu speichern. Es könnte sinnvoll sein, den Stack-Pointer mit der Adresse dieses Arrays zu laden, aber das ist nicht der 'save_context'. – Jester

+0

@Jester, wenn Sie die Einschränkungen für LDS betrachten, ist es r, Label. Bitte beachten Sie den Link http://www.atmel.com/webdoc/AVRLibcReferenceManual/inline_asm_1io_ops.html – user3199837

+0

'Label' ist kein GCC-Constraint. Siehe [Handbuch] (https://gcc.gnu.org/onlinedocs/gcc/Constraints.html). – Jester

Antwort

0

"label" macht keinen Sinn, das sollte eine Einschränkung sein. Es macht auch keinen Sinn, den Stapelzeiger in einem Array zu speichern. Es könnte sinnvoll sein, den Stack-Pointer mit der Adresse dieses Arrays zu laden, aber das ist nicht die save_context.

Wie dem auch sei, den Wert von SPL zu erhalten, die ist der Stapelzeiger Sie so etwas tun kann: (. Es gibt eine q Einschränkung aber zumindest meine gcc Version mag es nicht)

asm volatile("in %0, %1": "=r" (*this_stack) : "I" (_SFR_IO_ADDR(SPL))); 

wahre Register zu erhalten, zum Beispiel r26 Sie tun können:

register uint8_t r26_value __asm__("r26"); 
asm volatile("": "=r" (r26_value)); 
+0

gut, this_stack ist ein uint8_t *, nicht uint8_t – user3199837

+0

ja, ich weiß, das Etikett ist nicht die richtige Einschränkung. Aber haben Sie sich den obigen Link angesehen? Wie erklären Sie dieses "Etikett" – user3199837

+0

Nein, ich wollte nicht den Wert von r26 bekommen. Ich möchte alle Registerwerte in this_stack speichern. – user3199837

Verwandte Themen