Я пытаюсь написать переключатель контекста в обработчике прерываний таймера. В настоящее время коммутатор контекста может переключаться между контекстами команды (кооператив). В обработчик прерываний, я пытался:ARM v6 Переключатель контекста IRQ
- Сохранить текущий счетчик программы как место старого поток должен держать выполнение
- Переключитесь в режим SVC на самом деле выполнить переключение контекста
- переключатель обратно в режим IRQ и изменить регистр связи, чтобы быть сохранены PC от нового потока
- Возврат из обработчика IRQ в ссылке IRQ регистр
Я считаю, что могу сделать первые два правильно, но мне было интересно: как я могу переключиться в режим прерывания или, по крайней мере, изменить SVC R13 и R15 из обработчика прерываний?
Я использую процессор ARM v6; Большое спасибо за помощь!
Edit: здесь в основном то, что мой переключатель:
void interrupt_yield() {
unsigned int old_mode;
__asm__("mrs %0, cpsr" : "=r" (old_mode));
__asm__("msr cpsr_c, %0" : : "r" (MODE_SVC));
PUSH_ALL; // Macro for push {r0-r12, lr}
__asm__("mov %0, sp" : "=r"(sp));
manager->threads[manager->current_thread].sp = sp;
unsigned nt = (manager->current_thread + 1) % manager->thread_counter;
if (CURRENT_THREAD.status == ACTIVE) {
CURRENT_THREAD.status = INACTIVE;
}
manager->current_thread = nt;
CURRENT_THREAD.status = ACTIVE;
SET_SP(CURRENT_THREAD.sp);
POP_ALL;
__asm__("msr cpsr, %0" : : "r" (old_mode));
}
void timer_vector() { // This is called by assembly in interrupt mode
armtimer_clear_interrupt(); // clear timer interrupt
interrupt_yield(); // Calls above function
}
Цель состоит в том, чтобы изменить IRQ ссылку регистра для возврата к новой функции. Однако я не могу вернуться в режим прерывания, чтобы сделать это.
1 еще править: я никогда не переключаю регистр ссылок IRQ; Я понимаю это, но я даже не переключаюсь в режим IRQ, так что это более поздняя проблема для исправления.
Можете ли вы поделиться тем, что вы сделали/пытались до сих пор? Это поможет ответить на ваш вопрос. – PhilDulac
Зачем вам нужно переключиться на обработчик SVC для переключения контекста? У него нет больше привилегий. – Dric512
@ Dric512 Я хочу сделать это в режиме SVC, чтобы изменить указатель стека режима SVC, а не IRQ. Я не могу просто переключиться в режим SVC и перейти в регистр ссылок, потому что, когда происходит прерывание, я хочу сохранить r15 из работающего потока и переключиться на хранимый программный счетчик. –