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));
}
У меня есть что-то вроде этого.
!!! Я хотел бы сохранить регистры r0 r1 r2... в мой массив stack[].
Я программирую переключатель контекста. Контекст имеет такую структуру:
typedef struct context_t {
uint8_t stack[THREAD_STACK_SIZE];
void *pstack;
struct context_t *next;
}context;
Моя проблема в том, что я не могу передать переменную c this_stack во встроенную сборку. Моя цель - хранить все регистры, указатель стека и SREG в моем стеке.
После компиляции выдает ошибку: Описание Путь к ресурсу Расположение Тип
`,' required 5_multitasking line 754, external location: C:\Users\Jiadong\AppData\Local\Temp\ccDo7xn3.s C/C++ Problem
Я посмотрел учебник по встроенной сборке avr. Но я не совсем понимаю. Кто-нибудь может мне помочь?
"label"
не имеет смысла, это должно быть ограничением. Также нет смысла пытаться сохранить указатель стека в массив. Возможно, имеет смысл загрузить указатель стека адресом этого массива, но это неsave_context
. - person Jester   schedule 02.06.2016label
не является ограничением gcc. См. руководство. - person Jester   schedule 02.06.2016asm volatile("lds r26 %0": : "label"(this_stack));
заменено наasm volatile("st %0 r0": "r"(this_stack));
, по-прежнему недействительно. Это входное ограничение. Возможно, вы имели в виду"=m"(*this_stack)
, чтобы компилятор выбрал режим адресации. Передача ему указателя в регистре не говорит ему, что память, на которую указывает, предполагается записанной. - person Peter Cordes   schedule 16.01.2019this_context->stack
является указателемuint8_t*
, который вы хотите изменить, вам нужно взять его адрес, напримерuint8_t **this_stack = &this_context->stack;
. В противном случае вы просто устанавливаете локальную переменную или разыменовываете указатель, загруженный из глобальной структуры. Это может быть то, что вам нужно: godbolt.org/z/_Ra5_M - person Peter Cordes   schedule 16.01.2019