Как сохранить значение указателя стека пользователя в переменную из режима IRQ - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь создать простую и небольшую упреждающую ОС для процессора 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 в стек пользователя, но я думаю, что я здесь не прав ...)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Я думаю, что мог бы ответить на аналогичный вопрос здесь: "ARM - доступ к R13 и R14 из режима супервизора"

В вашем случае просто используйте "режим IRQ" вместо "Режим супервизора", но я думаю, что применяется тот же принцип.

Если коротко, если вы переключаетесь из режима IRQ в режим пользователя, это односторонняя ловушка, вы не можете просто переключиться обратно в режим IRQ под управлением программного обеспечения.

Но, манипулируя CPSR и переключаясь в системный режим, вы можете получить r13_usr и затем переключиться обратно в предыдущий режим (в вашем случае, режим IRQ).

0 голосов
/ 25 августа 2011

Какой вариант ARM вы используете?В современных вариантах, таких как Cortex_M3, у вас есть инструкция MRS / MSR .Таким образом, вы можете получить доступ к регистрам MSP и PSP, переместив их в регистр общего назначения.

CMSIS даже определяет __get_MSP () и __get_PSP () как функции C, а также __set [...] дубликаты.

РЕДАКТИРОВАТЬ: Кажется, это работает только в Thumb-2.Извините за шум.

0 голосов
/ 24 августа 2011

Обычно вы настраиваете все это при загрузке, различных регистрах стека, обработчиках и т. Д. Если есть причина перейти в пользовательский режим и выйти из него, вы можете использовать swi из пользовательского режима и заставить обработчик swi делатьчто бы вы ни хотели сделать в пользовательском режиме или переключить задачу на обработчик режима svc или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...