Перейти к содержанию
    

Добрый день.

 

В стартуп файле сделал:

 

    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()?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что не правильно в cpu_irq_handler()?

То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])?

Т.е. асм функцию вместо void cpu_irq_handler(void)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написать и дизассемблировать, например (e51ffff0).

Понял. Спасибо.

 

Только зачем?

Чтобы сразу вписать значение и всё.

 

А как ещё в нужную ячейку рам вписать нужную команду?

Изменено пользователем Kesha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как в нужную ячейку рам вписать нужную команду?

А что Вы делали в мейне?

//---- Set interrupts vectors

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что Вы делали в мейне?

Сейчас сделал так:

    //---- Set interrupts vectors
    ptr  = (unsigned int *)IRQ_RAM_ADDR;
    *ptr = 0xE51FFFF0;                       //-- ldr pc, [pc, #-0xff0]

Вместо обработчика прыгаю в pabort.

Что опять я неправильно сделал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что опять я неправильно сделал?

Слишком буквально восприняли мои советы. У Вас VIC PL192, а не PL190, так что читать надо адрес 0xfffffff0: ldr pc, [pc, #-0x30] (e51ff030).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас 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:...

Изменено пользователем Kesha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далее прыгаю в 0x40000018 (там команда ldr pc, [pc, #-0x120]).

Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018.

Всё верно.

В случае прерывания если ремапа нет, то прыгаем на 0x00000018.

Далее у меня там -> irq_handler_address: .word 0x40000018 /* cpu_irq_isr */.

Похоже стормозил на счет ldr pc, [pc, #-40000120] (это для загрузки если находися в 0x18).

В ячейке 0x40000018 нужно разместить команду для загрузки в PC адрес из регистра адреса VIC.

Можно ли здесь одной командой отделаться? Если да, то какой именно?

Изменено пользователем Kesha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В случае прерывания если ремапа нет, то прыгаем на 0x00000018.

Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов.

Спасибо, aaarrr.

 

Посоветуйте книжку по АСМу, пожалуйста.

Изменено пользователем Kesha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...