t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 (изменено) · Жалоба Доброго времени суток! Возник очень больной вопрос по данному чипу... Среда программирования IAR ARM 4.42 В чем суть... Суть в том что уже 3 неделю никак не могу победить расширенный контроллер прерываний данного чипа... Разрешал на уровне ядра глобально все прерывания, на уровне контроллера AIC разрешал все 32!!! прерывания! Контроллер все нормально регистрирует допустим FIQ или IRQ прерывания от счетчика или от еще какой нибудь периферии, записывал в регистр вектора текущего прерывания нужный адрес подпрограммы обработчика прерываний устанавливал статус что мол линия IRQ или FIQ активна! Все нормально... Но ядро отказывалось регистрировать прерывание! переходить на соответствующий вектор в отладчике. Контроллер AIC пробовал как в защищенном режиме чтобы просматривать регистры контроллера как и не в защищенном... Пробовал даже просто прошить без отладки, думал что глючит режим отладки... Но все равно... Самое интересное что симулятор в IARе все генерит и нормально обрабатывает прерывания... Вот на обозрение простенький код в ассемблере ссори за отсутствие коментов мне главное было чтобы он зарегистрировал прерывания и перешел в этом коде на вектор 0x1C!!! #include "AT91SAM7A3_inc.h" NAME main PUBLIC main CODE32 ;------------------------------------------------------------------------------- org 0 //программный счетчик на 0x0 B init //движимся на инит ;------------------------------------------------------------------------------- org 0x1C //программный счетчик на 0x1С B irq_handler //движимся на обработчик FIQ ;------------------------------------------------------------------------------- org 0x4C //программный счетчик на 0x4C irq_handler msr CPSR_c, #ARM_MODE_USER //пишет в CPSR режим юзера B main //движимся на майн ;------------------------------------------------------------------------------- org 0xAC //программный счетчик на 0xAC ARM_MODE_USER EQU 0x10 //простая замена init mvn r0, #0xDF bic r0, r0, #0xE00 mov r1, #0x1 str r1 , [r0] //это все записывает в регистр AIC_IECR разрешение прерывания FIQ msr CPSR_c, #ARM_MODE_USER //пишет в CPSR режим юзера и разрешает все прерывания в ядре ;------------------------------------------------------------------------------- main NOP //майн зациклен сам на себя B main END main ;------------------------------------------------------------------------------- Вот такой простенький код в симуляторе работает на ура переходит на нужный вектор прерываний в отладчике нифига не работает -------------------------------------------------------------------------------- Вот еще пример уже конкретной отлаженной программы. Евли реализовать без прерываний все работает в отладчике диод мигает! Если внедрить прерывание по FIQ то ниче не работает. На входе FIQ висит джостик. не переходит на вектор 0х1С и ядро вообще молчит! хотя в AIC ставятся флаги что линия FIQ активна и в регистре AIC_IVR пишется нужный адрес обработчика. Я даже не открывал окно регистров контроллера прерываний. Компилил во флеш... зашивал в контроллер, но ниче не работает :laughing: #include "ioat91sam7a3.h" #include "intrinsics.h" #define LED_1 0x00100000 #define LED_2 0x00200000 #define LED_3 0x01000000 #define LED_4 0x02000000 void sys_fiq(void) { if (((AT91C_BASE_PIOA -> PIO_PDSR) & LED_1) == 0) AT91C_BASE_PIOA -> PIO_SODR = LED_1; else AT91C_BASE_PIOA -> PIO_CODR = LED_1; AT91C_BASE_AIC->AIC_EOICR = 0xF1F1F1F1; //обработчик просто гасит и зажигает диод по прерыванию } AIC_config() { AT91C_BASE_AIC -> AIC_SVR[0] = (int) sys_fiq;//пишет в регистр адрес обработчика прерывания AT91C_BASE_AIC -> AIC_IECR = 0x00000001;//разрешает FIQ } PMC_config() { AT91C_BASE_CKGR -> CKGR_MOR = 0x00000F01;//генератор кварц AT91C_BASE_PMC -> PMC_MCKR = 0x0000000D;//выбран кварц как основной AT91C_BASE_PMC -> PMC_SCER = 0x00000001;//разрешение тактирования ядра AT91C_BASE_PMC -> PMC_PCER = 0x0000000C;//разрешение тактирования PIOA и PIOB } PIO_config() { AT91C_BASE_PIOA -> PIO_PER = 0x03300000; AT91C_BASE_PIOA -> PIO_SODR = 0x03300000; AT91C_BASE_PIOA -> PIO_OER = 0x03300000; AT91C_BASE_PIOB -> PIO_PDR = 0x00000100; AT91C_BASE_PIOB -> PIO_ASR = 0x00000100; //конфигурирует PIOA и PIOB чтобы диоды горели и на вход FIQ } main () { PMC_config(); PIO_config(); AIC_config(); while (1); } Прерывания разрешаются в асемблерном файлике в переработанно стартупе msr CPSR_c, #ARM_MODE_USER и опять же мне главное было чтобы в обработчике прога перешла при наступлении прерываний на вектор 0x1C!!! Кстати писал в регистры AIC_IDCR, AIC_ICCR, AIC_EOICR соответствующие значения но все равно ниче не помогало! В общем вот такая проблема... Если кто может направте пожалуйста на путь истинный))) я уже, чесное слово, задолбался))) В запасе еще есть конечно время но все меньше и меньше скоро проект надо начинать делать... Периферия изучена на 60% но прерывания просто необходимы!!! Ссори за ошибки) писал на "нервах") Ссори за ошибки) "Линия FIQ активна" Писалось все на "нервах") Изменено 2 декабря, 2008 пользователем shrek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба Что у Вас записано по векторам 0x18, 0x1C? void sys_fiq(void) Где оформление прерывания? Диод, я надеюсь, Вы осциллографом смотрите? А то глазами можно и не заметить моргания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 (изменено) · Жалоба Что у Вас записано по векторам 0x18, 0x1C? Где оформление прерывания? Диод, я надеюсь, Вы осциллографом смотрите? А то глазами можно и не заметить моргания. диод по идее должен гаснуть и зажигаться по однократному нажатию на джостик или кнопку) в отладке это работает. в смысле если функциональную часть обработчика например в майн сунуть то это работает диод гаснет и зажигается если задержку внедрить то при выходе из отладки видно как гаснет и зажигается))) :laughing: в 0х18 я ничего не писал так как не использую IRQ вот что находится по вектору 0x1C org 0x1C mov r9,r0 ldr lr , [pc, #AIC_FVR] msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC stmfd sp!, { r1-r3, r12, lr} mov r14, pc bx r0 ldmia sp!, { r1-r3, r12, lr} msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ mov r0,r9 subs pc,lr,#4 взятый из стартупа) Изменено 2 декабря, 2008 пользователем shrek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба в 0х18 я ничего не писал так как не использую IRQ А какой смысл использовать FIQ, тем более с таким "оформлением": вот что находится по вектору 0x1C Тому, кто такие "стартупы" пишет, следовало бы руки оторвать :maniac: Здесь - bx r0 - процессор отправляется в свободное плаванье по неизвестному адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба так проц вообще на вектор 0х1С не переходит) (в отладке) даже более скажу если в майн записать туже функциональную часть с задержкой для другого диода, то этот же диод будет работать, а если жать на кнопку FIQ прерывания то изменения никакого не последует даже если проц в свободное плавание уйдет то есть проц упорно не хочет идти при прерывании на вектор соответствующий... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба так проц вообще на вектор 0х1С не переходит) (в отладке) Оставьте в отладке (если уж без нее никак) отображение только AIC_CISR и посмотрите, ставится ли там бит NFIQ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 (изменено) · Жалоба Бит NFIQ ставится!!! но на вектор проц не переходит) Изменено 2 декабря, 2008 пользователем shrek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба Бит NFIQ ставится!!! но на вектор проц не переходит) Значит FIQ запрещен на самом деле - чудес не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба FIQ разрешен) AT91C_BASE_AIC -> AIC_IECR = 0x00000001 msr CPSR_c, #ARM_MODE_USER строчка из стратупа перед входом в майн) в CPSR биты F и I сбрасываются) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба FIQ разрешен) Не верю :( Что в CPSR в тот момент, когда Вы наблюдаете '1' в NFIQ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба вот вот именно когда в NFIQ в CPSR ниче не меняется!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба вот вот именно когда в NFIQ в CPSR ниче не меняется!!! Меня интересует не что в нем меняется, а что в нем записано в этот момент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба биты I и F сброшены решим пользователя 10000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба биты I и F сброшены решим пользователя 10000 Это эмулятор говорит, или это Ваша догадка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба эмулятор) мне кажется что то начало получаться... буду пробовать) спасибо что у вас хватило терпения выслушать мою проблему) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться