Kesha 0 28 февраля, 2009 Опубликовано 28 февраля, 2009 · Жалоба Добрый день. В стартуп файле сделал: irq_handler_address: .word 0x40000018 /* cpu_irq_isr */ fiq_handler_address: .word 0x4000001C /* cpu_fiq_isr */ В мейне сделал так: #define IRQ_RAM_ADDR 0x40000018 #define FIQ_RAM_ADDR 0x4000001C #define IRQ_RAM_FUNC_ADDR 0x40000038 #define FIQ_RAM_FUNC_ADDR 0x4000003C MEMMAP = 0x01;//Interrupt vectors are not re-mapped and reside in Flash. unsigned int * ptr; //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] ptr = (unsigned int *)FIQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] //--- Put IRQ & FIQ vectors in RAM ptr = (unsigned int *)IRQ_RAM_FUNC_ADDR; *ptr = (unsigned int)&cpu_irq_handler; ptr = (unsigned int *)FIQ_RAM_FUNC_ADDR; //*ptr = (unsigned int)&cpu_fiq_handler; И определил: //---------------------------------------------------------------------------- void cpu_irq_handler(void) { int_func ifunc; ifunc = (int_func)VICAddress; if(ifunc != 0) (*ifunc)(); } При прерывании заходим в cpu_irq_handler(void) и прыгаем непосредственно в обработчик прерывания. При выходе из обработчика прерывания мы прыгаем в dabort_handler. Что не правильно в cpu_irq_handler()? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 февраля, 2009 Опубликовано 28 февраля, 2009 · Жалоба Что не правильно в cpu_irq_handler()? То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 28 февраля, 2009 Опубликовано 28 февраля, 2009 · Жалоба То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])? Т.е. асм функцию вместо void cpu_irq_handler(void)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 февраля, 2009 Опубликовано 28 февраля, 2009 · Жалоба Одну команду, а не функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба Одну команду, а не функцию. А как узнать код этой команды из "ldr pc, [pc, #-0xff0]"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба Написать и дизассемблировать, например (e51ffff0). Только зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 1 марта, 2009 Опубликовано 1 марта, 2009 (изменено) · Жалоба Написать и дизассемблировать, например (e51ffff0). Понял. Спасибо. Только зачем? Чтобы сразу вписать значение и всё. А как ещё в нужную ячейку рам вписать нужную команду? Изменено 1 марта, 2009 пользователем Kesha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба А как в нужную ячейку рам вписать нужную команду? А что Вы делали в мейне? //---- Set interrupts vectors Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба А что Вы делали в мейне? Сейчас сделал так: //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE51FFFF0; //-- ldr pc, [pc, #-0xff0] Вместо обработчика прыгаю в pabort. Что опять я неправильно сделал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба Что опять я неправильно сделал? Слишком буквально восприняли мои советы. У Вас VIC PL192, а не PL190, так что читать надо адрес 0xfffffff0: ldr pc, [pc, #-0x30] (e51ff030). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 1 марта, 2009 Опубликовано 1 марта, 2009 (изменено) · Жалоба У Вас VIC PL192, а не PL190, так что... Спасибо! ...#-0x120... Пишу так: ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE51FF120; //E51FF120 ldr pc, [pc, #-0x120] Происходит следующее: Инициализируем все и после запускаем прерывание. Далее прыгаю в 0x40000018 (там команда ldr pc, [pc, #-0x120]). Но при попытке выполнить эту команду, тут же оказываюсь на векторе reset_handler. Что за х? На всякий случай из стартапа: .section .vectors, "ax" .code 32 .align 0 .global _vectors .global reset_handler /***************************************************************************** * Exception Vectors * *****************************************************************************/ _vectors: ldr pc, reset_handler_address ldr pc, undef_handler_address ldr pc, swi_handler_address ldr pc, pabort_handler_address ldr pc, dabort_handler_address .word 0xB8A06F58 /* 0 - (sum of other vectors instructions) */ ldr pc, irq_handler_address ldr pc, fiq_handler_address reset_handler_address: .word reset_handler undef_handler_address: .word undef_handler swi_handler_address: .word swi_handler pabort_handler_address: .word pabort_handler dabort_handler_address: .word dabort_handler .word 0x00 irq_handler_address: .word 0x40000018 /* cpu_irq_isr */ fiq_handler_address: .word 0x4000001C /* cpu_fiq_isr */ .section .init, "ax" .code 32 .align 0 /****************************************************************************** * * * Default exception handlers * * * ******************************************************************************/ reset_handler:... Изменено 1 марта, 2009 пользователем Kesha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба Далее прыгаю в 0x40000018 (там команда ldr pc, [pc, #-0x120]). Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 1 марта, 2009 Опубликовано 1 марта, 2009 (изменено) · Жалоба Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018. Всё верно. В случае прерывания если ремапа нет, то прыгаем на 0x00000018. Далее у меня там -> irq_handler_address: .word 0x40000018 /* cpu_irq_isr */. Похоже стормозил на счет ldr pc, [pc, #-40000120] (это для загрузки если находися в 0x18). В ячейке 0x40000018 нужно разместить команду для загрузки в PC адрес из регистра адреса VIC. Можно ли здесь одной командой отделаться? Если да, то какой именно? Изменено 1 марта, 2009 пользователем Kesha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба В случае прерывания если ремапа нет, то прыгаем на 0x00000018. Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kesha 0 2 марта, 2009 Опубликовано 2 марта, 2009 (изменено) · Жалоба Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов. Спасибо, aaarrr. Посоветуйте книжку по АСМу, пожалуйста. Изменено 2 марта, 2009 пользователем Kesha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться