реклама на сайте
подробности

 
 
> Выход из handler-mode в cortex-m3
Omnicake
сообщение May 11 2014, 08:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002



Здравствуйте, столкнулся с проблемой. Сделал обработку прерывания на системный таймер Systick, во время обработки прерывания производится изменения битов и в конце грузятся значения регистров LR и SP для другой подзадачи (тем самым реализовано переключение задач), однако при выходе на задачу процессор почему-то остается в handler-mode - то есть по сути не выходит из прерывания. Соответственно на последующие срабатывания прерывания от таймера процессор никак не реагирует. Прочитал, что для корректного переключения режимов, надо в регистр LR заносить специальное значение EXC_RETURN, однако как это сделать если в LR мне одновременно нужно занести и значение для переключения на задачу? Как быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение May 12 2014, 17:56
Сообщение #2


Гуру
******

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



1. PendSv - это просто особое прерывание, приоритет которого можно поставить минимальным, это позволит вам быть уверенным что в него вы попали из задачи а не из другого прерывания. В вашем случае PendSV и Прерывания таймера не различимы, задайте таймеру минимальный приоритет, и будет почти тоже самое. То есть во взрослых системах PendSV вызывается во многих случаях, те только через заданное время после прошлого вызова, у вас же только так.

2.
Цитата
LDR sp, [r1,#24];Загрузил стэк программы
MOVW R2,#0x00d0; в котором по адресу 0x200000d0
MOVT R2,#0x2000; положил число 0xFFFFFFF9
LDR pc, [r2]; Загрузил его в PC


чет я не понимаюsm.gif... Видать я как то непонятно пишу... Попробую еще раз.

если вы находитесь в hendlre режиме, как только вы в счетчик команд запишите 0xFFFFFFF9, обращаю внимание именно в счетчик команд, ни в стэк, ни в память, а именно в него. То процессор запустить процедуру выхода из hendler режима в thread режим (он не перейдет по указанному адресу, а запустить процедуру). В ходе этой процедуры процессор из стэка восстановит значения счетчика команд куда ему надо идти. При этом процессор будет использовать главный стэк в случае если на конце 9, и стэк программ если на конце D.
В стэке к моменту записи магического числа должно лежать правильной последовательности PC, LR, r0-r3, и чего-то там еще, то есть полный набор сохраняемых данных для входа в прерывание.

забудьте про регистр LR - он строго говоря вам не нужен, без вложенных прерываний, и без надобности вернуться в старую задачу он в целом нафиг не сдался...

вам надо подменить указатель стека на стэк той задачи в какую вы идете, в стеке этой задачи должна лежать правильная структура, и записать магическое число. После этого проц сам из указаного стека выберет значение счетчика команд и пойдет по задаче. В следующем прерывании, процессор сам сохранит счетчик команд на каком моменте он остановился. И когда опять дойдет до вызова этой задачи, счетчик команд будет восстановлен из стэка.

То есть в начале работы
вам надо сделать задачи со своими локальными стэками
положить в них структуру которая кладется когда вызовиться прерывание из этой задача, в место где хранится РС положить начало вашей задачи.

далее в прерывании вам надо, сохранять PSP задачи из которой пришли, далее РSP устанавливать на стэк нвоой задачи, и записывать магическое число. Все!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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.   а я вот доки почитал повнимательнее... если говор...   May 11 2014, 14:56
|- - 1113   Цитата(Golikov A. @ May 11 2014, 17:56) а...   May 11 2014, 15:18
- - 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016