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

 
 
> real time timer - прерывание по переполнению
srm
сообщение May 25 2010, 15:42
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 144
Регистрация: 27-12-09
Из: Пермь
Пользователь №: 54 501



Не нашёл как установить обработчик прерывания по переполнению для таймера реального времени. Нужно ведь как-то так:
Код
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, ???, m_interrupt_priority, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (void(*)())interrupt_handler);

А я не знаю какой у него ID..
Go to the top of the page
 
+Quote Post
4 страниц V  « < 2 3 4  
Start new topic
Ответов (45 - 51)
aaarrr
сообщение Jun 26 2010, 08:41
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Jun 26 2010, 11:01) *
Ну я так посмотрел - в регистры IVR и FVR заносятся те же значения, что с модификаторами _irq, что без них. Т.е. адреса перехода не меняются. И работает все так же.

Нет, не так же. На входе в прерывание это действительно не скажется, зато на выходе - еще как.

Цитата(Nikitoc @ Jun 26 2010, 11:01) *
Почему то происходит именно быстрое прерывание, но не всегда, примерно в 90% случаев. А если не происходит быстрое то и обычное тоже не происходит.

Посмотрел код.

В стартапе IRQ и FIQ уже были включены:
Код
;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR


А вот и разгадка возникновения FIQ:
Код
   pAIC->AIC_IECR = AT91C_ID_SYS;

Должно быть 1 << AT91C_ID_SYS.

Ну и до кучи:
Код
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x80000000;

CODR - это регистр только для записи, поэтому правильно так:
Код
AT91C_BASE_PIO->PIO_CODR = 0x80000000;

Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 26 2010, 12:31
Сообщение #47


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата
Нет, не так же. На входе в прерывание это действительно не скажется, зато на выходе - еще как.

Ага понял. Наверное этот модификатор добавляет в п/п команды сохранения и восстановления контекста?
Цитата
В стартапе IRQ и FIQ уже были включены:
Код
     ;Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR

Пожалуйста, объясните мне эту строчку. Не могу никак понять что за регистр такой CPSR_c (и как изменить его содержимое, чтобы запретить FIQ) и адрес #Mode_USR?

Цитата
А вот и разгадка возникновения FIQ:
Код
   pAIC->AIC_IECR = AT91C_ID_SYS;

Должно быть 1 << AT91C_ID_SYS.

Да (звучат фанфары)!!! Скорее всего это оно! Такая мелочь, аж обидно. Вместо IRQ разрешаю FIQ.

Цитата
Ну и до кучи:
Код
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x80000000;

CODR - это регистр только для записи, поэтому правильно так:
Код
AT91C_BASE_PIO->PIO_CODR = 0x80000000;

Ага. На эту ошибку Вы мне уже когда-то указывали. Все равно где-то опять проскакивает.
В общем, огромное Вам спасибо, aaarrr, благодаря Вам пришлось достаточно глубоко вникать в прерывания rolleyes.gif ну и программка скорее всего теперь будет работать как планировалось. Правда раньше понедельника я это не смогу узнать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 26 2010, 13:15
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Jun 26 2010, 16:31) *
Ага понял. Наверное этот модификатор добавляет в п/п команды сохранения и восстановления контекста?

И модифицирует адрес возврата.

Цитата(Nikitoc @ Jun 26 2010, 16:31) *
Пожалуйста, объясните мне эту строчку. Не могу никак понять что за регистр такой CPSR_c (и как изменить его содержимое, чтобы запретить FIQ) и адрес #Mode_USR?

CPSR - регистр, _c - указатель модифицируемого поля (Control bits: I, F, T, M[4:0]). Mode_USR - это не адрес, а константа, задающая режим процессора.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 26 2010, 17:02
Сообщение #49


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(aaarrr @ Jun 26 2010, 16:15) *
CPSR - регистр, _c - указатель модифицируемого поля (Control bits: I, F, T, M[4:0]). Mode_USR - это не адрес, а константа, задающая режим процессора.

Ну теперь вообще все ясно (так глядишь и ассемблер выучу smile.gif)
Кстати, Вы в этой теме раньше писали:
Цитата
Еще обратите внимание, что что флаги RTT сбрасываются через 2 периода SCLK (~61us) после чтения статусного регистра. Поэтому попасть в прерывание просто, а вот выйти из него - не очень sad.gif

Как это обрабатывать? Разве флаги прерывания не сбрасываются (при наличии модификатора _irq) при выходе из п/п обработки?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 26 2010, 17:16
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Jun 26 2010, 21:02) *
Как это обрабатывать? Разве флаги прерывания не сбрасываются (при наличии модификатора _irq) при выходе из п/п обработки?

У ядра нет флагов прерывания, только входной сигнал. Если он в активном уровне и бит I регистра CPSR сброшен, процессор переходит на вектор IRQ. Сигнал формируется AIC'ом на основании состояния входных сигналов от периферии, масок источников и состояния логики приоритетов. Сбрасывать там что-то можно только если источник настроен на работу по фронту (тут еще можно написать несколько абзацев, чем чревата такая настройка). Но в любом случае необходимо также выполнить сброс источника в периферийном устройстве. В случае RTT, который тактируется от SCLK, он занимает несколько больше времени, чем хотелось бы. Если прерывание используется для побудки процессора (т.е. не слишком часто), можно просто подождать сброса флагов в самой процедуре прерывания, попутно, возможно, занявшись чем-нибудь полезным.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 26 2010, 17:57
Сообщение #51


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Ясно. Спасибо большое.
Go to the top of the page
 
+Quote Post
srm
сообщение Aug 1 2010, 08:07
Сообщение #52


Частый гость
**

Группа: Участник
Сообщений: 144
Регистрация: 27-12-09
Из: Пермь
Пользователь №: 54 501



В общем, глюк так и не удалось исправить. Периодически повторяется, если движения робота тактировать от RTT. Вот мой робот. В моменты времени 2:06, 2:16, 2:34 видны глюки (лапы уходят в стороны).

Сообщение отредактировал srm - Aug 1 2010, 08:08
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 03:36
Рейтинг@Mail.ru


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