Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S прерывания в SRAM (IAR)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
romashko
Уже второй бьюсь над прерыванием таймера в ИАР 4.4A
Когда самбой загружаю - прерывание НЕ работает! sad.gif

Вот код:

__irq __arm void TimerIRQ(void)
{
PITC_PIVR; //читаем интеррупт-статус таймера
OutLED(0); //зажигаем лампочку
AIC_EOICR=0; //энд оф интеррупт
}

void SetTimerFrequency(unsigned long int Frequency) //установка частоты тиков таймера
{
PITC_PIMR=0x03000000|(2995200/Frequency); //CPU Clock/16/Frequency
}

void EnableTimerIRQ(unsigned long int Priority) //настраивем AIC и PIT
{
AIC_SVR1=(unsigned long int)TimerIRQ; //адрес хэндлера
AIC_SMR1=Priority|(1<<5); //приоритет и срабатывание
AIC_IECR|=(1<<1); //разрешаем прерывание таймера
AIC_IDCR&=~(1<<1);
}

int main(void)
{
PMC_PCER|=(1<<2); //Enable PIOA Clock
PIO();
SetTimerFrequency(4000);
EnableTimerIRQ(7);
GO: //пустой цикл
goto GO;
}

в ИАРе в опциях линкера описываю регионы (at91sam7s256):

Vectors 0x202000-20203F
Code 0x202040-209FFF
Data 0x20A000-20CFFF

Прерывания не работают! sad.gif

как сделать прерывание рабочим? где ИАРу прописать, чтоб REMAP сделал и откопировал вектора в нужную область? help.gif
Сергей Борщ
Цитата(romashko @ Sep 13 2007, 06:21) *
Уже второй бьюсь над прерыванием таймера в ИАР 4.4A
Когда самбой загружаю - прерывание НЕ работает! sad.gif
Ппереведи!.... (с) "Москва слезам не верит". Т.е. вы хотите чтобы вся программа исполнялась из ОЗУ, и загружаете ее туда самбой, так?
Цитата(romashko @ Sep 13 2007, 06:21) *
Vectors 0x202000-20203F
Прерывания не работают! sad.gif
Естественно. Ибо процессор ожидает вектора в области 0-3F.
Цитата(romashko @ Sep 13 2007, 06:21) *
как сделать прерывание рабочим? где ИАРу прописать, чтоб REMAP сделал и откопировал вектора в нужную область? help.gif
Извините, но REMAP придется вам делать самому из вашей программы. И копировать вектора тоже придется вручную. Не знаю, позволяет ли самба писать скрипты и из скрипта сделать эти действия. А линкеру указывать
Код
-DRAMSTART=00200040
-DRAMEND=00203FFF                       // any AT91SAM7 has at least 16K RAM

// Intvec always linked to 0x00-0x3F
-Z(CODE)INTVEC=00000000-0000003F

-Z(CODE)INTVEC_I=RAMSTART-RAMEND
-QINTVEC=INTVEC_I
romashko
Всеравно не получается sad.gif

Често говоря, я ничерта не понимаю, как в ИАР заставить исполняться программу
начиная с адресов 0x202000

Кстати, когда вектора находятся по адресу 0-3F, размер бинарника сильно вырастает, тоесть не линкер, не компилятор не мыслят механизмов ремэпа...

в общем смысл таков:

когда создаётся HEX (а из него потом BIN) карта памяти ДО РЕМЭПА такая:

Вектора 0x202000-0x20203F
КОД 0x202040-0x209FFF
ДАННЫЕ 0x20A000-0x20CFFF

Далее этот BIN грузится САМБОЙ по адресу 0x202000 и туда делаем GO

Далее внутри программы просиходит копирование векторов с 0x202000 в 0x200000
А потом делаем ремэп.

Сановится так:

Вектора 0x000000-0x00003F и 0x002000-0x00203F
КОД 0x002040-0x009FFF
ДАННЫЕ 0x00A000-0x00CFFF

В Keil'е это прекрасно работает, а в ИАРе отказывается sad.gif

Прошу помочь разобраться с ИАРом! 1111493779.gif help.gif
Сергей Борщ
Цитата(romashko @ Sep 14 2007, 03:39) *
Често говоря, я ничерта не понимаю, как в ИАР заставить исполняться программу начиная с адресов 0x202000
Да наверное никак. Ибо в бинарнике нет информации о точке старта. В HEX есть. Самба HEX понимает?
Цитата(romashko @ Sep 14 2007, 03:39) *
Кстати, когда вектора находятся по адресу 0-3F, размер бинарника сильно вырастает, тоесть не линкер, не компилятор не мыслят механизмов ремэпа...
Боюсь, что компилятор не при чем, а механизма не мыслит кто-то другой. Обратите внимание на строчку -QINTVEC=INTVEC_I. Это значит линковать вектора так, как будто они лежат в INTVEC, но на самом деле разместить их в INTVEC_I. После ремапа INTVEC_I отобразится на INTVEC без всякого копирования.
Цитата(romashko @ Sep 14 2007, 03:39) *
Далее этот BIN грузится САМБОЙ по адресу 0x202000 и туда делаем GO. Далее внутри программы просиходит копирование векторов с 0x202000 в 0x200000
А что мешает линковать сразу на 0x200000?
Цитата(romashko @ Sep 14 2007, 03:39) *
А потом делаем ремэп.

Сановится так:

Вектора 0x000000-0x00003F и 0x002000-0x00203F
КОД 0x002040-0x009FFF
ДАННЫЕ 0x00A000-0x00CFFF
Да, там лежат отражения данных и кода, но программа работает с адресами 0x202040-0x209FFF и 0x20A000-0x20CFFF. Хотя это и не играет роли.

Цитата(romashko @ Sep 14 2007, 03:39) *
В Keil'е это прекрасно работает, а в ИАРе отказывается sad.gif

Прошу помочь разобраться с ИАРом! 1111493779.gif help.gif
Увы, ни с кейлом ни с самбой не работал sad.gif Через JTAG-отладчик все решается гораздо проще. Не хотите собрать JTAG?
romashko
Цитата(Сергей Борщ @ Sep 14 2007, 17:59) *
А что мешает линковать сразу на 0x200000?


Самба мешает - из-за её кривости нельзя грузить в 0x200000 - там её переменные хранятся. Только начиная с 0x202000 и до конца.

Цитата(Сергей Борщ @ Sep 14 2007, 17:59) *
Через JTAG-отладчик все решается гораздо проще. Не хотите собрать JTAG?


согласен! с ЖТАГом прекрасно и с 0x200000 работает... но он доступен токо на работе, дома только SAM-Bой....

прийдётся блин, свой загрузчик писать с бут ассистентом - по ком-порту грузить... токо отхапаю пол-килобайта SRAM на сам загрузчик в конце!
romashko
А под самопальным JTAGом вы имели ввиду виглер?
Сергей Борщ
Цитата(romashko @ Sep 17 2007, 09:56) *
А под самопальным JTAGом вы имели ввиду виглер?
Или вигглер или амонтек он же Olimex ARM-USB-TINY. Последний мне кажется очень интересным.
amw
Ни с ИАР ни с кейл я не знаком, но по видимому, они используют разные команды по векторам.
Например если по вектору IRQ размещена команда использующая СМЕЩЕНИЕ от текущего PC как адрес назначения, то после копирования векторов по другому адресу сещения оказываются НЕВЕРНЫМИ.
Часто используется такая техника:
В векторах используют команды LDR PC,=IRQ_HANDLER, а сами значения ложат СРАЗУ ЗА ВЕКТОРАМИ и копируют и вектора и адреса. А адреса - абсолютные. Тогда будет работать не зависимо от того, скопированы вектора или нет.
Проверте по дизассемблеру.
alexander55
Цитата(Сергей Борщ @ Sep 17 2007, 11:17) *
Olimex ARM-USB-TINY[/url]. Последний мне кажется очень интересным.

Сергей, я правильно понял, что там стоит FTDI 245, драйвер от FTDI, а адаптер прикидывается Wingler.
И еще вопрос. Впечатления от работы (глючность и скорость по отношению к JLink).
Сергей Борщ
Цитата(alexander55 @ Sep 17 2007, 15:00) *
Сергей, я правильно понял, что там стоит FTDI 245, драйвер от FTDI, а адаптер прикидывается Wingler.
Из документа по приведенной ссылке: based on FT2232L IC from Future Technology Devices International Ltd. Живьем я его не щупал, мои сведения основываются на отзывах в различных форумах. Сомневаюсь, что прикидывается вигглером, скорее OpenOCD его знает как самостоятельное устройство. А большинство отладчиков умеют дружить с OpenOCD.
Цитата(alexander55 @ Sep 17 2007, 15:00) *
И еще вопрос. Впечатления от работы (глючность и скорость по отношению к JLink).
Пока не пробовал.
Сергей Борщ
Цитата(Сергей Борщ @ Sep 17 2007, 16:05) *
А большинство отладчиков умеют дружить с OpenOCD. Пока не пробовал.
Экспресс-поиск показал, что не все так радужно. Большинство отладчиков дружат через RDI с H-JTAG, а с OpenOCD дружит WinARM, GCC через GDB. Мда... Остается вигглер sad.gif
romashko
ИАР:

B InitReset ; 0x00 Reset handler
undefvec:
B undefvec ; 0x04 Undefined Instruction
swivec:
B swivec ; 0x08 Software Interrupt
pabtvec:
B pabtvec ; 0x0C Prefetch Abort
dabtvec:
B dabtvec ; 0x10 Data Abort
rsvdvec:
B rsvdvec ; 0x14 reserved
irqvec:
B IRQ_Handler_Entry ; 0x18 IRQ
fiqvec: ; 0x1c FIQ
Сергей Борщ
Цитата(romashko @ Sep 18 2007, 01:36) *
ИАР:[i]

B InitReset ; 0x00 Reset handler
Попробуем так:
Код
    LDR PC, =InitReset; 0x00 Reset handler
undefvec:
    LDR PC, =undefvec; 0x04 Undefined Instruction
..........

.xcl:DRAMSTART=00202000
-DRAMEND=00203FFF                       // any AT91SAM7 has at least 16K RAM

-Z(CODE)INTVEC=RAMSTART-RAMEND

main.c:
_C_LIB_DECL
int __low_level_init(void)
{
    // copy application INTVEC to remapped INTVEC
    uint32_t const *Src = (uint32_t *)__sfb(INTVEC);
    uint32_t *Dst = (uint32_t *)0x00200000;                //RAM START
    uint_fast8_t Size = 0x40 / sizeof *Dst;
    do { *Dst++ = *Src++; } while (--Size);

    AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;    // REMAP


    return 1;
}
_END_C_LIB_DECL
amw
Цитата(romashko @ Sep 18 2007, 01:36) *
ИАР:

B InitReset ; 0x00 Reset handler
undefvec:
B undefvec ; 0x04 Undefined Instruction
swivec:
B swivec ; 0x08 Software Interrupt
pabtvec:
B pabtvec ; 0x0C Prefetch Abort
dabtvec:
B dabtvec ; 0x10 Data Abort
rsvdvec:
B rsvdvec ; 0x14 reserved
irqvec:
B IRQ_Handler_Entry ; 0x18 IRQ
fiqvec: ; 0x1c FIQ

Во-во. Оно самое. Команда B использует смещение.
Перемещаемый код должен быть типа
Код
    ldr    pc, RESET_ADDR
    ldr    pc, UNDEF_ADDR
    ldr    pc, SWI_ADDR
    ldr    pc, PREFETCH_ABORT_ADDR
    ldr    pc, DATA_ABORT_ADDR
    .word    0
    ldr    pc, IRQ_ADDR
    ldr    pc, FIQ_ADDR
RESET_ADDR:        .word    RESET_handler
UNDEF_ADDR:        .word    UNDEF_handler
SWI_ADDR:        .word    SWI_handler
PREFETCH_ABORT_ADDR:    .word    PREFETCH_ABORT_handler
DATA_ABORT_ADDR:    .word    DATA_ABORT_handler
            .word    0
IRQ_ADDR:        .word    IRQ_handler
FIQ_ADDR:        .word    FIQ_handler
..............

RESET_handler:
тут код по ресет
UNDEF_handler:
тут код по UNDEF
SWI_handler:
тут код по SWI
PREFETCH_ABORT_handler:
тут код по PREFETCH_ABORT
DATA_ABORT_handler:
тут код по DATA_ABORT
IRQ_handler:
тут код по IRQ
FIQ_handler:
тут код по FIQ

Копировать нужно первые 16 слов (слово = 32 бита).
Сергей Борщ
Цитата(amw @ Sep 18 2007, 16:56) *
Перемещаемый код должен быть типа
Код
    ldr    pc, RESET_ADDR
RESET_ADDR:        .word    RESET_handler
IAR генерит такую конструкцию сам при использовании записи LDR PC, =RESET_handler.
Цитата(amw @ Sep 18 2007, 16:56) *
Копировать нужно первые 16 слов (слово = 32 бита).
Абсолютно согласен: uint_fast8_t Size = 0x40 / sizeof *Dst
romashko
Ура! Получилось! cool.gif
Короче, полностью стартап и линкер перелопатил (см. аттач)
В общем всё сделал с учётом ваших пожеланий! Благодарю за помощь! beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.