|
|
 |
Ответов
|
May 11 2014, 14:56
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
а я вот доки почитал повнимательнее...
если говорить про конртекс м3 значение счетчика команд для возврата из прерывания храниться в СТЕКЕ! И восстанавливается во время процедуры выхода из прерывания. в LR сохраняется режим из которого мы попали в прерывание
команда загрузки LR в PC - это не задание адреса выхода, это кодовая команда запуска процедуры выхода. и в зависимости от кода что лежит в LR, будет из разных мест восстановлен контекст задачи... то есть другими словами выйти из прерывания можно явно загрузив в PC коды 0xFFFFFFF1, 0xFFFFFFF9, 0xFFFFFFFD.
если загрузим код ....1, то контекст будет восстановлен из MSP, и выйдем мы в hedlre режим если загрузим код ....9, то контекст будет восстановлен из MSP, но выйдем в thread режим, и дальше будет использоваться как указатель стэка MSP если код ....D? то как в 9, только PSP.
другими словами понимая задачу ТС, надо делать вот как.
1. Задачи надо запустить с использованием PSP, по умолчанию после ресета все работают на MSP. 2. Во время возникновения прерывания таймера для смены задачи, вам надо сохранить значение PSP, при этом поскольку вы в прерывании у вас используется MSP, в него и сохраняйте PSP прерванной задачи. 3. задать новое значение в PSP для новой задачи 4. записать в PC значение 0xFFFFFFFD, это запустить выход из прерывания с использованием PSP, при этом поскольку вы его подменили на PSP новой задачи, выйдете вы в новую задачу.
Важный момент это создание контекста задачи первый раз, я себе это вижу так. Каждая задача добавляется таким образом 1. Вы переводите работу задачи на PSP, сохраняете в ее стэк все ее локальные переменные, 2. вызываете прерывание смены задачи, или ждете таймера, первый вход в прерывание смены задачи сохранит контекст, и в задачу можно будет попадать по переключению. До первого перехода в прерывание в задачу попасть нельзя, она должна быть запущена явна.
|
|
|
|
|
May 11 2014, 15:18
|
Знающий
   
Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658

|
Цитата(Golikov A. @ May 11 2014, 17:56)  а я вот доки почитал повнимательнее...
в LR сохраняется режим из которого мы попали в прерывание не так. вот оригинал: Цитата The processor performs a vector fetch that reads the exception handler start address from the vector table. When stacking is complete, the processor starts executing the exception handler. At the same time, the processor writes an EXC_RETURN value to the LR. This indicates which stack pointer corresponds to the stack frame and what operation mode the processor was in before the entry occurred. таким образом в начале выполнения эксепшена в LR ничего кроме "волшебного значения" нет и никогда не будет не зависимо ни от чего. Цитата(Golikov A. @ May 11 2014, 17:56)  До первого перехода в прерывание в задачу попасть нельзя, она должна быть запущена явна. нет - стэк этой задачи не будет изолирован от стэка ядра. надо просто в стэке задачи установить сохранённый PC как адрес main`а этой задачи.
|
|
|
|
Сообщений в этой теме
Omnicake Выход из handler-mode в cortex-m3 May 11 2014, 08:01 1113 разве режим - Handler или Thread - каким-либо обра... May 11 2014, 08:08 Omnicake Как мне казалось, handler-mode включается при обра... May 11 2014, 08:19 1113 приведите код настройки таймера и код обработчика May 11 2014, 08:30 Omnicake Инициализация таймера
Код AREA HEAP, CODE, READONL... May 11 2014, 08:48 1113 инициализация и обработчик - правильные. но для пе... May 11 2014, 08:58 Omnicake Не помогло, на задаче он все также в handler-mode ... May 11 2014, 09:05 1113 предлагаю вам отладиться без переключения контекст... May 11 2014, 09:13 Omnicake Забыл кстати упомянуть, что компилируется все это ... May 11 2014, 09:15 1113 Цитата(Omnicake @ May 11 2014, 12:15) Заб... May 11 2014, 09:17 Omnicake Попробовал убрать загрузку указателя стэка - ничег... May 11 2014, 10:22 1113 а вы уверены, что таймер считает, а не находится в... May 11 2014, 10:28 Omnicake Таймер точно работает и генерирует прерывания, для... May 11 2014, 10:31 1113 Цитата(Omnicake @ May 11 2014, 13:31) Тай... May 11 2014, 11:00 Omnicake Оно и происходит внутри прерывания, ведь scheduler... May 11 2014, 11:41 1113 имхо это не влияет. у вас оно равно 0 потому что п... May 11 2014, 11:50 Golikov A. А правильно я понимаю что LR служит для того чтобы... May 11 2014, 13:42 1113 Цитата(Golikov A. @ May 11 2014, 16:42) А... May 11 2014, 14:16 Golikov A. ЦитатаThis indicates which stack pointer correspon... May 11 2014, 16:03 1113 Цитата(Golikov A. @ May 11 2014, 19:03) С... May 11 2014, 16:10 Golikov A. вот и я о том же думаю...
но с другой стороны он ... May 11 2014, 16:50 Omnicake Перепробовал вчера такие варианты:
1) Запись в LR ... May 12 2014, 02:32 Golikov A. ЦитатаЗапись в LR или PC значения EXC_RETURN уводи... May 12 2014, 04:47 Omnicake Да, находился в Handler mode. Под "простым вы... May 12 2014, 05:03 Omnicake Цитатанадо попробовать
1. войти в прерывание,
2.... May 12 2014, 12:29 Сергей Борщ Цитата(Omnicake @ May 12 2014, 15:29) И у... May 12 2014, 13:54 Omnicake Используется MSP, число там лежит точно, так как в... May 12 2014, 14:16 adnega Цитата(Omnicake @ May 12 2014, 18:16) Исп... May 12 2014, 15:44 Сергей Борщ Цитата(Omnicake @ May 12 2014, 17:16) в с... May 13 2014, 06:34 Omnicake Видимо действительно у меня нет понимания. Я решаю... May 12 2014, 16:17 adnega Цитата(Omnicake @ May 12 2014, 20:17) Вид... May 12 2014, 17:03 1113 Цитата(Omnicake @ May 12 2014, 19:17) Про... May 12 2014, 17:59 Golikov A. 1. PendSv - это просто особое прерывание, приорите... May 12 2014, 17:56 Omnicake Цитатавам надо сделать задачи со своими локальными... May 13 2014, 02:10 Golikov A. обращаемся к первоисточнику
http://infocenter.arm... May 13 2014, 04:44 Omnicake 1. Ну у меня и отображается активным MSP все это в... May 13 2014, 05:34 Omnicake ЦитатаВ LR заносится магическое число. Если вы наб... May 13 2014, 06:37 Сергей Борщ Цитата(Omnicake @ May 13 2014, 09:37) он ... May 13 2014, 07:43 Omnicake Видимо это Keil uVision и делает: после того как я... May 13 2014, 08:11 Сергей Борщ Цитата(Omnicake @ May 13 2014, 11:11) Одн... May 13 2014, 11:47 1113 Omnicake, ваше желание разобраться похвально, но т... May 13 2014, 08:17 Omnicake Хорошо. Спасибо. May 13 2014, 08:26 Omnicake Починил, правда, для меня, это шаманством осталось... May 13 2014, 12:53
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|