|
|
  |
AT91RM9200 - мистика? SPI? или romboot.bin?, задачка не для слабонервных.... |
|
|
|
Jan 9 2007, 12:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(PrSt @ Jan 9 2007, 10:48)  Вы по ходу правы, если верить огрызку кода... этого я не заметил честно говоря... так...веселье наступает... тогда, вопросиком плавно переходим к новому вопросику связанным с корректной работой схемы... а именно с работой с памятью... Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке. Data Abort возникает из-за некорректного обращения к памяти, а не по причине неисправности оной. У AT91RM9200 есть MC Abort Status Register и MC Abort Address Register - выведите их значения printf'ом в DataAbort(), и станет ясно, где происходит глюк.
|
|
|
|
|
Jan 9 2007, 16:52
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(aaarrr @ Jan 9 2007, 11:07)  Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке. Data Abort возникает из-за некорректного обращения к памяти, а не по причине неисправности оной. У AT91RM9200 есть MC Abort Status Register и MC Abort Address Register - выведите их значения printf'ом в DataAbort(), и станет ясно, где происходит глюк. собрать из линукса и gcc - бинарик для прошивки получилось.... щяс пробую сделать проверку по Вашему совету... я так понимаю Вы говорите про это? The full 32-bit wide abort address is saved in the Abort Address Status Register (MC_AASR). Parameters of the access are saved in the Abort Status Register (MC_ASR) and include: • the size of the request (ABTSZ field) • the type of the access, whether it is a data read or write or a code fetch (ABTTYP field) • whether the access is due to accessing an undefined address (UNDADD bit) or a misaligned address (MISADD bit) • the source of the access leading to the last abort (MST0, MST1, MST2 and MST3 bits) • whether or not an abort occurred for each master since the last read of the register (SVMST0, SVMST1, SVMST2 and SVMST3 bits) except if it is traced in the MST bits.
вот что я сделал //*---------------------------------------------------------------------------- //* \fn AT91F_DataAbort //* \brief This function reports an Abort //*---------------------------------------------------------------------------- void AT91F_DataAbort() { int i; AT91F_DBGU_Printk("-F- Data Abort detected\n\r"); AT91F_DBGU_Printk("-F- LOOP... \n\r"); // Abort Address Status Register (MC_AASR) // Abort Status Register (MC_ASR) //int *iii; //iii=(int *AT91C_MC_ASR); printf("\n --------- ASR --------->: %X \n\r", *AT91C_MC_ASR); //iii=(int *AT91C_MC_AASR); printf("\n --------- AASR --------->: %X \n\r", *AT91C_MC_AASR);
while (1); }
и вот что получилось Enter: 1 c0000000 Download Dataflash [0xc0000000] CCCCC Modification of Arm Vector 6 :34340015
Write 10368 bytes in DataFlash [0xc0000000]
--------- ASR --------->: 10201
--------- AASR --------->: EA000438 -F- Data Abort detected -F- LOOP...судя по всему за аддрес EA000438 отвечает этот кусок кода из lib_AT91RM9200.h //*---------------------------------------------------------------------------- //* \fn AT91F_AIC_SetExceptionVector //* \brief Configure vector handler //*---------------------------------------------------------------------------- __inline unsigned int AT91F_AIC_SetExceptionVector ( unsigned int *pVector, // \arg pointer to the AIC registers void (*Handler) () ) // \arg Interrupt Handler { unsigned int oldVector = *pVector;
if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; else *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;
return oldVector; }
что это может значит?
--------------------
|
|
|
|
|
Jan 10 2007, 11:57
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(PrSt @ Jan 9 2007, 15:52)  что это может значит? Кстати по ходу дела CRC32 не учавствует в этом всем... дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefinedследовательно - ерунда какаято...... кто-нибудь что-нибудь может дельное посоветовать? крыша едет...
--------------------
|
|
|
|
|
Jan 10 2007, 13:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(PrSt @ Jan 10 2007, 11:57)  дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefined Могу только сказать, что адрес больше похож на код команды (b +0x10e8). Цитата(PrSt @ Jan 10 2007, 11:57)  кто-нибудь что-нибудь может дельное посоветовать? Для начала следует выяснить, где именно вызывается исключение. Для этого нужно прочитать значение LR_abt, только до этого нужно выяснить, не портится ли он, что в C-программе более чем вероятно.
|
|
|
|
|
Jan 10 2007, 15:40
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(aaarrr @ Jan 10 2007, 12:18)  Могу только сказать, что адрес больше похож на код команды (b +0x10e8).
Для начала следует выяснить, где именно вызывается исключение. Для этого нужно прочитать значение LR_abt, только до этого нужно выяснить, не портится ли он, что в C-программе более чем вероятно. а как это выснить? и что за LR_abt? я так понимаю если схема правильная, то и romboot должен корректно вести себя и работать, ведь у людей же работает он.... вот тот romboot который я пытаюсь загрузить... http://heavy-online.ru/arm-linux/files/pac...oot-evm9200.tgz
--------------------
|
|
|
|
|
Jan 10 2007, 15:49
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(PrSt @ Jan 10 2007, 15:40)  а как это выснить? Посмотреть генерируемый компилятором код. Цитата(PrSt @ Jan 10 2007, 15:40)  и что за LR_abt? Link Register (R14) процессора для режима Abort. Придется написать свой обработчик Data Abort, и написать на ассемблере, по крайней мере, частично.
|
|
|
|
|
Jan 10 2007, 17:25
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(aaarrr @ Jan 10 2007, 14:49)  Посмотреть генерируемый компилятором код.
Link Register (R14) процессора для режима Abort.
Придется написать свой обработчик Data Abort, и написать на ассемблере, по крайней мере, частично. в асмовсвом коде я непонял где искать... на всякий случай, в прикрепленном файле асмовкский код этого файлика, если это не испугнет ~100К размер его... оброботчик есть в файле cstartup.S /*- Set up Abort Mode and set Abort Mode Stack*/ msr CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT mov r13, r0 /* Init stack Abort*/ sub r0, r0, #ABT_STACK_SIZE
--------------------
|
|
|
|
|
Jan 10 2007, 18:16
|

Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394

|
Цитата(PrSt @ Jan 10 2007, 10:57)  Цитата(PrSt @ Jan 9 2007, 15:52)  что это может значит? Кстати по ходу дела CRC32 не учавствует в этом всем... дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefinedследовательно - ерунда какаято...... кто-нибудь что-нибудь может дельное посоветовать? крыша едет... JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго.
|
|
|
|
|
Jan 10 2007, 18:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(PrSt @ Jan 10 2007, 17:25)  в асмовсвом коде я непонял где искать... на всякий случай, в прикрепленном файле асмовкский код этого файлика, если это не испугнет ~100К размер его... Посмотрел. В функции AT91F_DataAbort() LR должен остаться целым. Его можно попробовать вытащить через inline asm - это <адрес инструкции, вызвавшей Abort> + 0x08. Цитата(PrSt @ Jan 10 2007, 17:25)  оброботчик есть в файле cstartup.S Это не обработчик, а установка стека режима Abort.
|
|
|
|
|
Jan 10 2007, 18:32
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(AlexBoy @ Jan 10 2007, 17:16)  JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго. JTAG спаяем (WIGGLER) - а каким инструментарием "пошагово пробежаться по этому куску"? я не делат этого никогда, не знаю как... в инете конечно посмотрю... но может уже есть правельное отканаттое решение?
--------------------
|
|
|
|
|
Jan 10 2007, 20:09
|

Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394

|
Цитата(PrSt @ Jan 10 2007, 17:32)  Цитата(AlexBoy @ Jan 10 2007, 17:16)  JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго. JTAG спаяем (WIGGLER) - а каким инструментарием "пошагово пробежаться по этому куску"? я не делат этого никогда, не знаю как... в инете конечно посмотрю... но может уже есть правельное отканаттое решение? Если в GCC то на сайте Macraigor подробно написано как отлаживаться через вигглер. www.macraigor.com/gnu_faq.htm Я пишу в RVDS 2.2 и отлаживаюсь встроенным отладчиком через H-JTAG.
|
|
|
|
|
Jan 11 2007, 12:09
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(aaarrr @ Jan 10 2007, 17:22)  Посмотрел. В функции AT91F_DataAbort() LR должен остаться целым. Его можно попробовать вытащить через inline asm - это <адрес инструкции, вызвавшей Abort> + 0x08. Вы были правы полностью: - вспоминается ваш пост: Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке.Data Abort возникает из-за некорректного обращения к памяти, а не по причине неисправности оной. с ней таки действительно все в порядке... я это проверил, вставил кусок кода для проверки памяти с топика - http://electronix.ru/forum/index.php?showtopic=20153 Подскажите пожалуста а как " можно попробовать вытащить через inline asm" ? и узнать " <адрес инструкции, вызвавшей Abort>" ?
--------------------
|
|
|
|
|
Jan 11 2007, 12:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(PrSt @ Jan 11 2007, 12:09)  Подскажите пожалуста а как "можно попробовать вытащить через inline asm" ? и узнать "<адрес инструкции, вызвавшей Abort>" ? Не знаю, как в GCC, нужно посмотреть документацию Для ADS/RVDS это будет выглядеть так: Код void AT91F_DataAbort() { int i; AT91F_DBGU_Printk("-F- Data Abort detected\n\r"); AT91F_DBGU_Printk("-F- LOOP... \n\r"); // Abort Address Status Register (MC_AASR) // Abort Status Register (MC_ASR) //int *iii; //iii=(int *AT91C_MC_ASR); printf("\n --------- ASR --------->: %X \n\r", *AT91C_MC_ASR); //iii=(int *AT91C_MC_AASR); printf("\n --------- AASR --------->: %X \n\r", *AT91C_MC_AASR);
__asm { mov i, R14 } printf("\n --------- Address --------->: %X \n\r", (i - 0x08));
while (1); }
|
|
|
|
|
Jan 12 2007, 17:38
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(aaarrr @ Jan 11 2007, 11:23)  Честно говоря, как это сделать на GCC я так и не понял пытался это делать читая - http://www.ethernut.de/en/documents/arm-inline-asm.htmlи все одно не получается я не могу понять как ввставить такое, как асм вставку...
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|