Forums » Программное обеспечение »
Обработка прерываний
Added by trott about 11 years ago
В примерах есть один пример обработки системного таймера. на ее основе я сделал обработку таймера GPTIM0
возникло несколько вопросов:
1) в Manual_soft.pdf стр 27 сказано что запись регистров происходит по завершении текущего параграфа. это, скорее всего не относится к PSW шестой бит которого управляет порядком чтения-записи.
Почему я имею разницу в порядке заполнения регистров
setl #IHOOKADDR,P1 ... setl #MSKR, @1?
кроме того пришлось разводить операции записи по разным параграфам.
2) почему в параграфе P1: если я переставлю 3 строчки с
getl #flag2 subl @1, 1 setl #flag2, @1 getl 0x0000001F ; ? почему не работает здесь однократный режим работы? ; перезагрузка таймера wrl @1, TIM0_CR getl #flag je @1, Ledoff jne @2, Ledon
на
getl 0x0000001F ; ? почему не работает здесь однократный режим работы? ; перезагрузка таймера wrl @1, TIM0_CR getl #flag je @1, Ledoff jne @2, Ledon getl #flag2 subl @1, 1 setl #flag2, @1
то не получаю мигания светодиодов.
3) Какое значение регистра IRETADDR в каждой строке, где он использован
timer_my.asm (1.91 KB) timer_my.asm | программа обработки таймера GPTIM0 | ||
Makefile (237 Bytes) Makefile |
Replies (12)
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
trott wrote:
В примерах есть один пример обработки системного таймера. на ее основе я сделал обработку таймера GPTIM0
возникло несколько вопросов:
1) в Manual_soft.pdf стр 27 сказано что запись регистров происходит по завершении текущего параграфа. это, скорее всего не относится к PSW шестой бит которого управляет порядком чтения-записи.
Почему я имею разницу в порядке заполнения регистров
[...]?
кроме того пришлось разводить операции записи по разным параграфам.
А как вы увидели разницу в порядке заполнения регистров?
Если в параграфе вы записали в регистры значения, то по complete они одновременно запишутся.
2) почему в параграфе P1: если я переставлю 3 строчки с
[...]на
[...]
то не получаю мигания светодиодов.
В принципе обе версии кода ничем не отличаются, проверю почему не работает.
3) Какое значение регистра IRETADDR в каждой строке, где он использован
IRETADDR имеет значение метки параграфа на который необходимо вернуться из прерывания.
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
Посмотрел код в приложенном файле всё стало понятно. Вы прерывания по GPTIM используете, а это таймер периферии. Прерывания работают только от системного таймера, прерывания от периферии в первой версии процессора использовать нельзя. Если рассмотреть глубже, то прерывания отображаются в регистре прерываний только 2 такта. Вам повезло, что сработал первый вариант и вы успели уйти на обработчик прерывания. В документации на процессор про прерывания в конце должно быть пояснение. В процессорах P2 и R1 эта проблема устранена. В процессоре P1 можно использовать прерывания только методом опроса регистров периферии там, где это возможно.
RE: Обработка прерываний - Added by trott about 11 years ago
уточните, пожалуйста, прерывания от ШИМ я тоже использовать не смогу в этой версии процессора?
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
В P1 не сможете, только в следующих версиях.
RE: Обработка прерываний - Added by trott about 11 years ago
А как вы увидели разницу в порядке заполнения регистров?
Если в параграфе вы записали в регистры значения, то по complete они одновременно запишутся.
разницу в порядке заполнения регистров я смог увидеть поставив запись регистов в разные параграфы.
например, если я соединяю вместе код параграфов timer:, initTimer:, StartTimer0: светодиоды перестают мигать.
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
Если в параграфе вы записали в регистры значения, то по complete они одновременно запишутся. Тут я подразумевал Роны, индексные регистры, системные регистры. Записи в память которые были внутри параграфа могут произойти в произвольном порядке, так что где это нужно необходимо разносить записи на разные параграфы.
RE: Обработка прерываний - Added by trott about 11 years ago
Хочу чтобы вы пояснили порядок записи в память вместе с описанием работы 6 бита регистра PSW
Записи в память которые были внутри параграфа могут произойти в произвольном порядке, так что где это нужно необходимо разносить записи на разные параграфы.
как я понял, 6 бит регистра PSW влияет внутри параграфа на порядок записи в память, а не в регистры. И установленный 6 бит PSW будет означать что команды записи в память выполнятся после всех команд чтения из памяти, но при этом между собой операции записи в память могут произойти в произвольном порядке.
RE: Обработка прерываний - Added by mouse about 11 years ago
Есть ещё такой вопрос про прерывания. Что происходит с контекстом (содержимым коммутатора) в момент срабатывания прерывания? Происходит ли мгновенный переход на обработку параграфа с прерыванием, сохраняя при этом контекст, или прерывание обрабатывается по завершению текущего параграфа? Что происходит при "свободной" работе отедльных клеток, которые не ждут окончания параграфа в момент обработки прерывания?
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
Прерывания для двух случаев:
1) не было команд записи - прерывания произойдут сразу и после прерывания мы выполняем параграф заново
2) были команды записи - прерывания пройдут по зав параграфа, т.е. по complete
Откатывается всегда последний параграф.
RE: Обработка прерываний - Added by mouse about 11 years ago
Т.е. в теории, я могу написать длинный параграф с записью где-то вначале, т.о. выполнение прерывания отложится влоть до микросекунд + потери на выполнении сначала параграфа?
Как быть со "свободно бегающими" клетками, которые выполняют разные параграфы? Какие именно клетки уйдут на обработку прерывания, с какого именно параграфа начнётся выполнение заново, если есть запись в обоих параграфах или только в одном из? Интересно это не только в теоретическом разрезе, но и как это сейчас (и будет в P2) работать на практике?
RE: Обработка прерываний - Added by krufter_multiclet about 11 years ago
Если в параграфе в котором не было операций записи произошло прерывание, то команды выбранные в буферы клеток будут удалены и выборка остальных команд параграфа будет остановлена. Все предыдущие команды других параграфов будут выполнены, поскольку они находятся в буферах клеток. Т.е. прерывание для клеток это как обычный параграф с командами, которые размещаются в буферах клеток, после окончания прерывания мы возвращаемся обратно в программу и выполняем параграф на котором остановились. Команды каждого параграфа уходят в клетки как написано тут http://multiclet.com/community/projects/examples/wiki/%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B
В процессорах P2, R1 прерывания будут обрабатываться аналогичным образом, только в процессоре R1 будет возможность реконфигурации и на прерывания мы будем уходить одной, двумя, тремя или четырьмя клетками, в зависимости от текущей конфигурации для заданного участка кода, и команды параграфа будут уходить в буфера клеток как и в P1, только количество таких буферов будет от 1 до 4(у каждой группы клеток будут свои регистры, в том числе и PSW).