|
AT91SAM7S прерывания в SRAM (IAR) |
|
|
|
Sep 13 2007, 03:21
|
Частый гость
 
Группа: Свой
Сообщений: 85
Регистрация: 25-12-06
Пользователь №: 23 865

|
Уже второй бьюсь над прерыванием таймера в ИАР 4.4A Когда самбой загружаю - прерывание НЕ работает!  Вот код: __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 Прерывания не работают!  как сделать прерывание рабочим? где ИАРу прописать, чтоб REMAP сделал и откопировал вектора в нужную область?
Сообщение отредактировал romashko - Sep 13 2007, 03:21
|
|
|
|
|
Sep 13 2007, 09:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(romashko @ Sep 13 2007, 06:21)  Уже второй бьюсь над прерыванием таймера в ИАР 4.4A Когда самбой загружаю - прерывание НЕ работает!  Ппереведи!.... (с) "Москва слезам не верит". Т.е. вы хотите чтобы вся программа исполнялась из ОЗУ, и загружаете ее туда самбой, так? Цитата(romashko @ Sep 13 2007, 06:21)  Vectors 0x202000-20203F Прерывания не работают!  Естественно. Ибо процессор ожидает вектора в области 0-3F. Цитата(romashko @ Sep 13 2007, 06:21)  как сделать прерывание рабочим? где ИАРу прописать, чтоб REMAP сделал и откопировал вектора в нужную область?  Извините, но 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
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 14 2007, 00:39
|
Частый гость
 
Группа: Свой
Сообщений: 85
Регистрация: 25-12-06
Пользователь №: 23 865

|
Всеравно не получается  Често говоря, я ничерта не понимаю, как в ИАР заставить исполняться программу начиная с адресов 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'е это прекрасно работает, а в ИАРе отказывается  Прошу помочь разобраться с ИАРом!
|
|
|
|
|
Sep 14 2007, 06:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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'е это прекрасно работает, а в ИАРе отказывается  Прошу помочь разобраться с ИАРом!  Увы, ни с кейлом ни с самбой не работал  Через JTAG-отладчик все решается гораздо проще. Не хотите собрать JTAG?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 16 2007, 22:23
|
Частый гость
 
Группа: Свой
Сообщений: 85
Регистрация: 25-12-06
Пользователь №: 23 865

|
Цитата(Сергей Борщ @ Sep 14 2007, 17:59)  А что мешает линковать сразу на 0x200000? Самба мешает - из-за её кривости нельзя грузить в 0x200000 - там её переменные хранятся. Только начиная с 0x202000 и до конца. Цитата(Сергей Борщ @ Sep 14 2007, 17:59)  Через JTAG-отладчик все решается гораздо проще. Не хотите собрать JTAG? согласен! с ЖТАГом прекрасно и с 0x200000 работает... но он доступен токо на работе, дома только SAM-Bой.... прийдётся блин, свой загрузчик писать с бут ассистентом - по ком-порту грузить... токо отхапаю пол-килобайта SRAM на сам загрузчик в конце!
|
|
|
|
|
Sep 17 2007, 07:17
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(romashko @ Sep 17 2007, 09:56)  А под самопальным JTAGом вы имели ввиду виглер? Или вигглер или амонтек он же Olimex ARM-USB-TINY. Последний мне кажется очень интересным.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 17 2007, 10:54
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Ни с ИАР ни с кейл я не знаком, но по видимому, они используют разные команды по векторам. Например если по вектору IRQ размещена команда использующая СМЕЩЕНИЕ от текущего PC как адрес назначения, то после копирования векторов по другому адресу сещения оказываются НЕВЕРНЫМИ. Часто используется такая техника: В векторах используют команды LDR PC,=IRQ_HANDLER, а сами значения ложат СРАЗУ ЗА ВЕКТОРАМИ и копируют и вектора и адреса. А адреса - абсолютные. Тогда будет работать не зависимо от того, скопированы вектора или нет. Проверте по дизассемблеру.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 17 2007, 13:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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). Пока не пробовал.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 18 2007, 07:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 18 2007, 13:56
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(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 бита).
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 18 2007, 23:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|