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?
' "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
@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
'Label' ist kein GCC-Constraint. Siehe [Handbuch] (https://gcc.gnu.org/onlinedocs/gcc/Constraints.html). – Jester