Я пытаюсь создать простую и небольшую упреждающую ОС для процессора ARM (для экспериментов с архитектурой ARM).
У меня есть TCB
, у которого есть указатель на стек нужного потока, который я обновляю / считываю в моем методе dispatch()
- что-то вроде этого (смешанный C и сборка)
asm("
ldr r5, =oldSP
ldr sp, [r5]
");
myThread->sp = oldSP;
myThread = getNewThread();
newSP = myThread->sp
asm("
ldr r5, =newSP
str sp, [r5]
");
Когда я вызываю это dispatch()
из пользовательского режима (явный вызов), все работает нормально - потоки теряют и получают процессор так, как должны.
Однако я пытаюсь построить упреждающую ОС, поэтому янужен таймер IRQ для вызова диспетчеризации - и это моя проблема - в режиме irq регистр r13_usr скрыт, поэтому я не могу получить к нему доступ.Я также не могу перейти в режим SVC - он там тоже спрятан.
Одно из решений, которое я вижу, - это переключение в режим пользователя (после того, как я ввел способ отправки), обновление / изменение полей sp и переключение обратно в режим irq, чтобы продолжить, где я оставил.Это возможно?
Другое решение состоит в том, чтобы попытаться не входить в режим IRQ снова - мне просто нужно обработать аппаратные вещи (установить надлежащий бит состояния на периферии таймера), вызвать dispatch () (все еще в режиме irq) вкоторый я буду маскировать прерывание по таймеру, переходить в режим пользователя, переключать контекст, снимать маску с прерывания по таймеру и продолжать.Возобновленная нить должна продолжиться там, где она была приостановлена (до входа в IRQ).Это правильно?(Это должно быть правильно, если при прерывании процессор помещает r4-r11 и lr в стек пользователя, но я думаю, что я здесь не прав ...)
Спасибо.