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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> real time timer - прерывание по переполнению
Nikitoc
сообщение Jun 25 2010, 11:22
Сообщение #31


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 13:38) *
Разрешаются сбросом бита I регистра CPSR процессора. Из-под 'C' обычно предусматривается доступ в виде intrinsic-функций типа __enable_inerttupts(), или чего-то подобного - смотрите хелп своего компилятора.

Спасибо большое совсем забыл про эту особенность армов. Сделал в стартапе небольшую вставочку (в самом начале):
Код
                MRS        R0, CPSR        ; enable_irq
                BIC     R0,R0, #0x00000080; enable_irq
                MSR     CPSR_c, R0        ; enable_irq

И битик I в регистре CPSR сбросился rolleyes.gif . Но прерывания все равно не работают. Более того, после инициализации RTT, ожидая прерывания, я остановил RUN отладчика (ядро) и процессор находился в стартапе в RESET_HANDLER и выходить оттудова не собирался... Я вообще в ступор впал...

P.S. У меня подозрение закралось, что прерывание происходит на RESET_HANDLER. Но почему? Может где-то нужно переопределить вектора прерывания IRQ? Но я ведь в стартапе это сделал...

Сообщение отредактировал Nikitoc - Jun 25 2010, 11:29
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 11:41
Сообщение #32


Гуру
******

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



Цитата(Nikitoc @ Jun 25 2010, 15:22) *
Сделал в стартапе небольшую вставочку (в самом начале):

Логичнее было бы ее сделать в самом конце: так вы разрешили прерывания до всех настроек и сбросов периферии (что чревато), и только для режима SVC. На 'C' часть процессор может и в USER/SYSTEM уходить.


Цитата(Nikitoc @ Jun 25 2010, 15:22) *
P.S. У меня подозрение закралось, что прерывание происходит на RESET_HANDLER. Но почему? Может где-то нужно переопределить вектора прерывания IRQ? Но я ведь в стартапе это сделал...

Не умеет туда прерывание уходить по определению. "Топтаться" на RESET_HANDLER процессор тоже не умеет, если reset снят и есть клоки.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 12:05
Сообщение #33


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 14:41) *
Не умеет туда прерывание уходить по определению. "Топтаться" на RESET_HANDLER процессор тоже не умеет, если reset снят и есть клоки.

Я неправильно выразился. Я имел в виду, что процессор сбрасываетя по вектору Reset_Handler, нормально работает до конструкции:
Код
IMPORT  __main
                LDR     R0, =__main
                BX      R0

а потом опять сбрасывается и так по кругу.

Добавил через 10 мин:
А теперь запутался окончательно. Поставил разрешение прерываний перед входом в main и теперь процик все равно сбрасывается, и в прерывание не входит.
Немного непонятна сия конструкция из стартапа:
Код
Vectors         LDR     PC,Reset_Addr        
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                         ; Reserved Vector
             ;LDR     PC,IRQ_Addr
                LDR     PC,[PC,#-0xF20]     ; Vector From AIC_IVR
             ;LDR     PC,FIQ_Addr
                LDR     PC,[PC,#-0xF20]     ; Vector From AIC_FVR

А именно то, что стоит вместо закомментированных строк.

Сообщение отредактировал Nikitoc - Jun 25 2010, 12:24
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 12:31
Сообщение #34


Гуру
******

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



Поздравляю, работают теперь прерывания. LDR PC,[PC,#-0xF20] - это переход по адресу, содержащемуся в AIC_IVR. Так как соответствующий вектор вы не прописали, то процессор переходит по адресу 0.
Добавьте строку:
Код
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)RTTC_Interrupt_Handler;

И будет счастье.

На будущее: выкладывайте сразу стартап целиком. Невозможно угадать, что в нем написано и закомментировано.
Пожалуй, надо FAQ написать про прерывания на ARM'ах разных моделей...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 13:23
Сообщение #35


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 15:31) *
Поздравляю, работают теперь прерывания. LDR PC,[PC,#-0xF20] - это переход по адресу, содержащемуся в AIC_IVR. Так как соответствующий вектор вы не прописали, то процессор переходит по адресу 0.
Добавьте строку:
Код
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)RTTC_Interrupt_Handler;

И будет счастье.

Мозг начинает разрываться на части. Ход Ваших мыслей мне ясен. Вместо строк
Код
LDR     PC,[PC,#-0xF20]
я раскомментировал
Код
LDR     PC,IRQ_Addr
и
Код
LDR     PC,FIQ_Addr
Вроде бы здесь все должно было заработать, однако, по каким-то необъяснимым причинам происходит FIQ прерывание через примерно секунду после старта программы (это при том что RTT запрограммирован на 5сек.). Запретить его нету никакой возможности (ни в стартапе через CPSR ни через AIC)! Крыша едет!

Сообщение отредактировал Nikitoc - Jun 25 2010, 13:25
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 13:32
Сообщение #36


Гуру
******

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



Цитата(Nikitoc @ Jun 25 2010, 17:23) *
я раскомментировал

Раскомментировали, похоже, неаккуратно. И зачем это надо было делать вообще?
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 13:41
Сообщение #37


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 16:32) *
Раскомментировали, похоже, неаккуратно.

Вот:
Код
Vectors         LDR     PC,Reset_Addr        
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                           ; Reserved Vector
                LDR     PC,IRQ_Addr
               ;LDR     PC,[PC,#-0xF20]       ; Vector From AIC_IVR
                LDR     PC,FIQ_Addr
               ;LDR     PC,[PC,#-0xF20]       ; Vector From AIC_FVR

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                     ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
                PRESERVE8
                IMPORT  RTTC_Interrupt_Handler
IRQ_Handler     B       RTTC_Interrupt_Handler
                
FIQ_Handler     B       FIQ_Handler


Цитата
И зачем это надо было делать вообще?


Ну чтобы не записывать адрес в IVR и FVR. Кстати, а почему в стартапе для обоих векторов адрес берется по одному и тому же адресу -
Код
LDR     PC,[PC,#-0xF20]
?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 13:53
Сообщение #38


Гуру
******

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



Цитата(Nikitoc @ Jun 25 2010, 17:41) *
Ну чтобы не записывать адрес в IVR и FVR.

Так все равно потом придется.

Цитата(Nikitoc @ Jun 25 2010, 17:41) *
Кстати, а почему в стартапе для обоих векторов адрес берется по одному и тому же адресу -
Код
LDR     PC,[PC,#-0xF20]
?

Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 14:57
Сообщение #39


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 16:53) *
Так все равно потом придется.

Сделал и так (раскомментировал строки
Код
LDR     PC,[PC,#-0xF20]
) и записал адреса в SVR[0] для FIQ и SVR[1] для SYSIRQ. И все равно происходит почему-то FIQ и программа уходит именно на адрес записанный в SVR[0]! (и режим работы процессора меняется на Fast Interrupt) Почему? Может надо сбрасывать флаги?
Цитата
Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти.

Угу. Спасибо. Понял.



Ээх. Придется отказаться от использования прерываний. Как об стену горохом все попытки...
Буду периодически опрашивать флаги, но это,конечно, изврат.

Сообщение отредактировал Nikitoc - Jun 25 2010, 14:57
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 15:01
Сообщение #40


Гуру
******

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



Цитата(Nikitoc @ Jun 25 2010, 18:57) *
Ээх. Придется отказаться от использования прерываний. Как об стену горохом все попытки...

Зачем же сдаваться? Проект выложите - посмотрим.

Цитата(Nikitoc @ Jun 25 2010, 18:57) *
Буду периодически опрашивать флаги, но это,конечно, изврат.

Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 15:15
Сообщение #41


Местный
***

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



Цитата
Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно.

Да я для этого его и планировал использовать.
P.S. Не знаю правильно ли я выложил код?
Просьба не придираться к п/п PIO_INIT()

Сообщение отредактировал aaarrr - Jun 25 2010, 15:47
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 15:48
Сообщение #42


Гуру
******

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



Цитата(Nikitoc @ Jun 25 2010, 19:15) *
P.S. Не знаю правильно ли я выложил код?

Нет, приложите в виде архива с проектом - зачем такие полотна плодить?
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 25 2010, 16:00
Сообщение #43


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 18:48) *
Нет, приложите в виде архива с проектом - зачем такие полотна плодить?

Загрузил:
Прикрепленные файлы
Прикрепленный файл  Project.rar ( 4.39 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 16:02
Сообщение #44


Гуру
******

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



А зачем это вы упразднили модификаторы __irq? Они должны быть в вашем случае.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 26 2010, 07:01
Сообщение #45


Местный
***

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



Цитата(aaarrr @ Jun 25 2010, 19:02) *
А зачем это вы упразднили модификаторы __irq? Они должны быть в вашем случае.

Ну я так посмотрел - в регистры IVR и FVR заносятся те же значения, что с модификаторами _irq, что без них. Т.е. адреса перехода не меняются. И работает все так же. Почему то происходит именно быстрое прерывание, но не всегда, примерно в 90% случаев. А если не происходит быстрое то и обычное тоже не происходит.

Сообщение отредактировал Nikitoc - Jun 26 2010, 07:07
Go to the top of the page
 
+Quote Post

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

 


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


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