Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 (изменено) · Жалоба Разрешаются сбросом бита 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? Но я ведь в стартапе это сделал... Изменено 25 июня, 2010 пользователем Nikitoc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Сделал в стартапе небольшую вставочку (в самом начале): Логичнее было бы ее сделать в самом конце: так вы разрешили прерывания до всех настроек и сбросов периферии (что чревато), и только для режима SVC. На 'C' часть процессор может и в USER/SYSTEM уходить. P.S. У меня подозрение закралось, что прерывание происходит на RESET_HANDLER. Но почему? Может где-то нужно переопределить вектора прерывания IRQ? Но я ведь в стартапе это сделал... Не умеет туда прерывание уходить по определению. "Топтаться" на RESET_HANDLER процессор тоже не умеет, если reset снят и есть клоки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 (изменено) · Жалоба Не умеет туда прерывание уходить по определению. "Топтаться" на 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 А именно то, что стоит вместо закомментированных строк. Изменено 25 июня, 2010 пользователем Nikitoc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Поздравляю, работают теперь прерывания. LDR PC,[PC,#-0xF20] - это переход по адресу, содержащемуся в AIC_IVR. Так как соответствующий вектор вы не прописали, то процессор переходит по адресу 0. Добавьте строку: AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)RTTC_Interrupt_Handler; И будет счастье. На будущее: выкладывайте сразу стартап целиком. Невозможно угадать, что в нем написано и закомментировано. Пожалуй, надо FAQ написать про прерывания на ARM'ах разных моделей... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 (изменено) · Жалоба Поздравляю, работают теперь прерывания. 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)! Крыша едет! Изменено 25 июня, 2010 пользователем Nikitoc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба я раскомментировал Раскомментировали, похоже, неаккуратно. И зачем это надо было делать вообще? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Раскомментировали, похоже, неаккуратно. Вот: 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] ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Ну чтобы не записывать адрес в IVR и FVR. Так все равно потом придется. Кстати, а почему в стартапе для обоих векторов адрес берется по одному и тому же адресу - LDR PC,[PC,#-0xF20] ? Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 (изменено) · Жалоба Так все равно потом придется. Сделал и так (раскомментировал строки LDR PC,[PC,#-0xF20] ) и записал адреса в SVR[0] для FIQ и SVR[1] для SYSIRQ. И все равно происходит почему-то FIQ и программа уходит именно на адрес записанный в SVR[0]! (и режим работы процессора меняется на Fast Interrupt) Почему? Может надо сбрасывать флаги? Адреса команд разные, следовательно одно и то же значение смещения относительно PC даст разные адреса в памяти. Угу. Спасибо. Понял. Ээх. Придется отказаться от использования прерываний. Как об стену горохом все попытки... Буду периодически опрашивать флаги, но это,конечно, изврат. Изменено 25 июня, 2010 пользователем Nikitoc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Ээх. Придется отказаться от использования прерываний. Как об стену горохом все попытки... Зачем же сдаваться? Проект выложите - посмотрим. Буду периодически опрашивать флаги, но это,конечно, изврат. Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 (изменено) · Жалоба Для RTT это совсем не изврат. Единственное разумное применение его прерываний - периодически поднимать процессор из спячки, если нужно. Да я для этого его и планировал использовать. P.S. Не знаю правильно ли я выложил код? Просьба не придираться к п/п PIO_INIT() Изменено 25 июня, 2010 пользователем aaarrr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба P.S. Не знаю правильно ли я выложил код? Нет, приложите в виде архива с проектом - зачем такие полотна плодить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Нет, приложите в виде архива с проектом - зачем такие полотна плодить? Загрузил: Project.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба А зачем это вы упразднили модификаторы __irq? Они должны быть в вашем случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 26 июня, 2010 Опубликовано 26 июня, 2010 (изменено) · Жалоба А зачем это вы упразднили модификаторы __irq? Они должны быть в вашем случае. Ну я так посмотрел - в регистры IVR и FVR заносятся те же значения, что с модификаторами _irq, что без них. Т.е. адреса перехода не меняются. И работает все так же. Почему то происходит именно быстрое прерывание, но не всегда, примерно в 90% случаев. А если не происходит быстрое то и обычное тоже не происходит. Изменено 26 июня, 2010 пользователем Nikitoc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться