|
Пара вопросов по архитектуре |
|
|
|
May 6 2008, 07:45
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(InsolentS @ May 6 2008, 04:14)  1) Как из супервизора обратиться к пользовательским CPSR и SP? Вот тут приводил пример. Вроде работает. http://electronix.ru/forum/index.php?showtopic=43839
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
May 6 2008, 11:24
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Rst7 @ May 6 2008, 14:51)  Если не ошибаюсь, то метод получения USP в режиме супервизора таков Код SUB SP,SP,#4 MOV R1,SP STMIA R1,{R13}^ LDMFD SP!,{R0} А так нельзя? Код STMFD SP!,{R13}^ LDMFD SP!,{R0}
|
|
|
|
|
May 6 2008, 11:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(KRS @ May 6 2008, 15:24)  А так нельзя? Код STMFD SP!,{R13}^ LDMFD SP!,{R0} Нельзя: Во-первых, нельзя модифицировать базовый регистр при работе с пользовательским банком. Во-вторых, нельзя в следующей за тем инструкции пользоваться банкируемым регистром. Можно так: Код stmdb sp, {sp}^ mov r0, r0 ldmdb sp, {r0} Но лучше так: Код sub sp, sp, #0x04 stmia sp, {sp}^ nop ldmia sp!, {r0}
|
|
|
|
|
May 6 2008, 12:00
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата А так нельзя? Пробовать надо. Для начала, надо внимательно читать документацию. Номер раз - Цитата Base register mode: For the purpose of address calculation, the base register is read from the current processor mode registers, not the User mode registers. Значит, годится STMxx SP,{R13}^ Но, имеем два - Цитата Banked registers: This instruction must not be followed by an instruction which accesses banked registers (a following NOP is a good way to ensure this). И три - нельзя writeback SP сделать Значит, финальный вариант должен выглядеть так - Код SUB SP,SP,#4 STMEA SP,{R13}^ NOP LDMFD SP!,{R0} Цитата Ещё небольшой вопрос - как современные оси, например, RTX отслеживают переполнение стека у пользовательской задачи без MMU? За всех не отвечу, Nucleos при сборке с контролем стека банально внутри каждой ОСовской функции проверяет, не вышел ли стек за границу. Все. Полумера конечно, но бывает спасает.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 9 2008, 06:42
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(Rst7 @ May 6 2008, 18:00)  Значит, финальный вариант должен выглядеть так - Код SUB SP,SP,#4 STMEA SP,{R13}^ NOP LDMFD SP!,{R0} Если честно, не совсем понял как работает этот код  . Не могли бы Вы прокомментировать? Можно ли таким же макером достать пользовательский LR ?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
May 9 2008, 15:38
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(InsolentS @ May 9 2008, 10:42)  Если честно, не совсем понял как работает этот код  . Не могли бы Вы прокомментировать? Можно ли таким же макером достать пользовательский LR ? используется команда STM для сохранения списка регистров в память и LDM для чтения списка регистров из памяти (память выделяется в стеке, но моможно использовать и статически выделенную область), плюс используются некоторые особенности ее работы о которых лучше почитать в ARM architecture reference manual. Конечно можно таким образом и LR достать, а проще сразу все необходимые регистры за один раз Код SUB SP, SP, #8 STMIA SP, {R13,R14} NOP LDMFD SP!,{R0,R1}
|
|
|
|
|
May 9 2008, 19:31
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата STMIA SP, {R13,R14} забыли ^ Код STMIA SP, {R13,R14}^ Без нее будут регистры супервизора, в ней самая соль.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 12 2008, 10:12
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Если прерывание возникает во время команды безусловного перехода ( B ), в LR сохраняется адрес следующей команды Не волнуйтесь. Костыль там уже вставлен на уровне ядра  В LRirq сохраняется именно адрес комманды на который происходит переход, точнее, +4. Хотя точно сейчас посмотрю даташит. Да. Все правильно. Вот так надо возвращаться и из IRQ, и из FIQ. Код SUBS PC, R14, #4
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 12 2008, 10:14
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(InsolentS @ May 12 2008, 12:45)  Есть ещё одна проблема, не стал создавать новую ветку. Если прерывание возникает во время команды безусловного перехода ( B ), в LR сохраняется адрес следующей команды, а не той куда указывает B, т.е. прерывание как бы возникает по середине команды перехода, когда она уже загрузилась в конвейер, но ещё не выполнилась. Чувствую что надо поставить NOP чтобы прогнать конвейер, но не пойму где, посоветуйте пожалуйста как решить проблему эту  Либо компилятор вставит сам нужные команды, либо Вы вручную вставляете что-то типа Код @ Adjust and save LR_irq to IRQ stack sub lr, lr, #4 stmdb sp!, {r0, r1, lr} @ Save IRQ mode registers ........... @ Restore adjusted LR_irq from IRQ stack directly in the PC ldmia sp!, {r0, r1, pc}^ @ Restore IRQ mode registers Компиляторы имеют спец-средства для определения обработчика прерывания.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|