Вероятно, Вам сможет помочь вот ЭТО... Если Вы пытаетесь запустить прерывание, когда программа работает из RAM, а не из Flash, то вероятно ЭТО сможет Вам помочь:
Команда LDR pc,[pc,#-0xFF0] работает, НО только из Flash…
LDR pc,[pc,#-0xFF0]
Или, что то же самое,
LDR pc,[pc,#-(0x18 + 0x8 - 0xFFFFF030)]
Когда выполняется команда по адресу 0x18 в PC находиться значение 0x18 + 0x8 = 0x20 ВСЕГДА, т.е. адрес не следующей команды +0x04, а через одну +0x08 (для обеспечения "конвейерной обработки - pipeline"). И, если от текущего значения PC(0x20) отнять 0xFF0, произойдёт "переполнение в обратную сторону" 32-ух разрядного регистра и результат будет равен 0xFFFFF030. Т.е. адрес, из которого будет загружен регистр назначения (в данном случае PC) станет равен 0xFFFFF030, а это адрес регистра VICVectrAddr. Т.е. PC будет загружен содержимым из регистра VICVectrAddr.
Это всё справедливо, если программа работает из Flash памяти, т.е. начиная с адреса 0x00000000.
Если программа работает из RAM (отладка через Wiggler), т.е. начиная с адреса 0x40000000, то команда LDR pc,[pc,#-0xFF0] грузит в PC содержимое по адресу 0x3FFFF030. А для аналогичного перехода, надо из содержимого PC (0x40000020) вычесть 0x40000FF0, но синтаксис команды LDR допускает только 12-битное смещение.
Из RAM работает команда LDR pc,=irq_handler прописанная по адресу 0x18, где irq_handler это имя функции обработки прерывания, но эта команда занимает два слова, 0x18 и 0x1C , т.е. без дополнительных мер работать одновременно с прерыванием FIQ и IRQ из RAM не получиться. Для работы из RAM одновременно с прерыванием FIQ и IRQ можно попытаться создать таблицу адресов переходов, в области памяти, которую может охватить 12-битное смещение.
Но если Вы хотите работать только с IRQ, то
LDR pc,=irq_handler должно хватить
-
- Большое спасибо !!! - vsasha(29.10.2005 12:17, )