Project

General

Profile

Обработка прерываний

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 krufter_multiclet about 11 years ago

Да, всё верно поняли.

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).

    (1-12/12)