|
|
  |
real time timer - прерывание по переполнению |
|
|
|
Jun 25 2010, 11:22
|

Местный
  
Группа: 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 сбросился  . Но прерывания все равно не работают. Более того, после инициализации RTT, ожидая прерывания, я остановил RUN отладчика (ядро) и процессор находился в стартапе в RESET_HANDLER и выходить оттудова не собирался... Я вообще в ступор впал... P.S. У меня подозрение закралось, что прерывание происходит на RESET_HANDLER. Но почему? Может где-то нужно переопределить вектора прерывания IRQ? Но я ведь в стартапе это сделал...
Сообщение отредактировал Nikitoc - Jun 25 2010, 11:29
|
|
|
|
|
Jun 25 2010, 11:41
|
Гуру
     
Группа: Свой
Сообщений: 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 снят и есть клоки.
|
|
|
|
|
Jun 25 2010, 12:05
|

Местный
  
Группа: 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
|
|
|
|
|
Jun 25 2010, 12:31
|
Гуру
     
Группа: Свой
Сообщений: 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'ах разных моделей...
|
|
|
|
|
Jun 25 2010, 13:23
|

Местный
  
Группа: 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
|
|
|
|
|
Jun 25 2010, 13:41
|

Местный
  
Группа: 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] ?
|
|
|
|
|
Jun 25 2010, 13:53
|
Гуру
     
Группа: Свой
Сообщений: 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 даст разные адреса в памяти.
|
|
|
|
|
Jun 25 2010, 14:57
|

Местный
  
Группа: 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
|
|
|
|
|
Jun 25 2010, 15:01
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Nikitoc @ Jun 25 2010, 18:57)  Ээх. Придется отказаться от использования прерываний. Как об стену горохом все попытки... Зачем же сдаваться? Проект выложите - посмотрим. Цитата(Nikitoc @ Jun 25 2010, 18:57)  Буду периодически опрашивать флаги, но это,конечно, изврат. Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно.
|
|
|
|
|
Jun 25 2010, 15:15
|

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

|
Цитата Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно. Да я для этого его и планировал использовать. P.S. Не знаю правильно ли я выложил код? Просьба не придираться к п/п PIO_INIT()
Сообщение отредактировал aaarrr - Jun 25 2010, 15:47
|
|
|
|
|
Jun 25 2010, 16:00
|

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

|
Цитата(aaarrr @ Jun 25 2010, 18:48)  Нет, приложите в виде архива с проектом - зачем такие полотна плодить? Загрузил:
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|