Перейти к содержанию
    

real time timer - прерывание по переполнению

Разрешаются сбросом бита 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: . Но прерывания все равно не работают. Более того, после инициализации RTT, ожидая прерывания, я остановил RUN отладчика (ядро) и процессор находился в стартапе в RESET_HANDLER и выходить оттудова не собирался... Я вообще в ступор впал...

 

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

Изменено пользователем Nikitoc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал в стартапе небольшую вставочку (в самом начале):

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

 

 

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

Не умеет туда прерывание уходить по определению. "Топтаться" на RESET_HANDLER процессор тоже не умеет, если reset снят и есть клоки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не умеет туда прерывание уходить по определению. "Топтаться" на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздравляю, работают теперь прерывания. LDR PC,[PC,#-0xF20] - это переход по адресу, содержащемуся в AIC_IVR. Так как соответствующий вектор вы не прописали, то процессор переходит по адресу 0.

Добавьте строку:

    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)RTTC_Interrupt_Handler;

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

 

На будущее: выкладывайте сразу стартап целиком. Невозможно угадать, что в нем написано и закомментировано.

Пожалуй, надо FAQ написать про прерывания на ARM'ах разных моделей...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздравляю, работают теперь прерывания. 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я раскомментировал

Раскомментировали, похоже, неаккуратно. И зачем это надо было делать вообще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раскомментировали, похоже, неаккуратно.

Вот:

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]

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну чтобы не записывать адрес в IVR и FVR.

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

 

Кстати, а почему в стартапе для обоих векторов адрес берется по одному и тому же адресу -
LDR     PC,[PC,#-0xF20]

?

Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Сделал и так (раскомментировал строки

LDR     PC,[PC,#-0xF20]

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

Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти.

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

 

 

 

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

Буду периодически опрашивать флаги, но это,конечно, изврат.

Изменено пользователем Nikitoc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Буду периодически опрашивать флаги, но это,конечно, изврат.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да я для этого его и планировал использовать.

P.S. Не знаю правильно ли я выложил код?

Просьба не придираться к п/п PIO_INIT()

Изменено пользователем aaarrr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Не знаю правильно ли я выложил код?

Нет, приложите в виде архива с проектом - зачем такие полотна плодить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, приложите в виде архива с проектом - зачем такие полотна плодить?

Загрузил:

Project.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем это вы упразднили модификаторы __irq? Они должны быть в вашем случае.

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

Изменено пользователем Nikitoc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...