COMA 1 9 января, 2007 Опубликовано 9 января, 2007 · Жалоба Насчет модели - у меня двухслойка. Резисторы 68 Ом. Схему посмотрю. Может у вас генератор не стартует? Попробуйте держать кнопку ресет пару секунд при включении платы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 9 января, 2007 Опубликовано 9 января, 2007 · Жалоба Вы по ходу правы, если верить огрызку кода... этого я не заметил честно говоря... так...веселье наступает... тогда, вопросиком плавно переходим к новому вопросику связанным с корректной работой схемы... а именно с работой с памятью... Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке. Data Abort возникает из-за некорректного обращения к памяти, а не по причине неисправности оной. У AT91RM9200 есть MC Abort Status Register и MC Abort Address Register - выведите их значения printf'ом в DataAbort(), и станет ясно, где происходит глюк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 9 января, 2007 Опубликовано 9 января, 2007 · Жалоба Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке. 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; } что это может значит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба что это может значит? Кстати по ходу дела CRC32 не учавствует в этом всем... дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefined следовательно - ерунда какаято...... кто-нибудь что-нибудь может дельное посоветовать? крыша едет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefined Могу только сказать, что адрес больше похож на код команды (b +0x10e8). кто-нибудь что-нибудь может дельное посоветовать? Для начала следует выяснить, где именно вызывается исключение. Для этого нужно прочитать значение LR_abt, только до этого нужно выяснить, не портится ли он, что в C-программе более чем вероятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба Могу только сказать, что адрес больше похож на код команды (b +0x10e8). Для начала следует выяснить, где именно вызывается исключение. Для этого нужно прочитать значение LR_abt, только до этого нужно выяснить, не портится ли он, что в C-программе более чем вероятно. а как это выснить? и что за LR_abt? я так понимаю если схема правильная, то и romboot должен корректно вести себя и работать, ведь у людей же работает он.... вот тот romboot который я пытаюсь загрузить... http://heavy-online.ru/arm-linux/files/pac...oot-evm9200.tgz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба а как это выснить? Посмотреть генерируемый компилятором код. и что за LR_abt? Link Register (R14) процессора для режима Abort. Придется написать свой обработчик Data Abort, и написать на ассемблере, по крайней мере, частично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба Посмотреть генерируемый компилятором код. 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 ROMBOOT.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexBoy 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба что это может значит? Кстати по ходу дела CRC32 не учавствует в этом всем... дело в том что если верить даташиту страницы 17, то по этому аддресу доступ вообще - undefined следовательно - ерунда какаято...... кто-нибудь что-нибудь может дельное посоветовать? крыша едет... JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба в асмовсвом коде я непонял где искать... на всякий случай, в прикрепленном файле асмовкский код этого файлика, если это не испугнет ~100К размер его... Посмотрел. В функции AT91F_DataAbort() LR должен остаться целым. Его можно попробовать вытащить через inline asm - это <адрес инструкции, вызвавшей Abort> + 0x08. оброботчик есть в файле cstartup.S Это не обработчик, а установка стека режима Abort. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго. JTAG спаяем (WIGGLER) - а каким инструментарием "пошагово пробежаться по этому куску"? я не делат этого никогда, не знаю как... в инете конечно посмотрю... но может уже есть правельное отканаттое решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexBoy 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба JTAGом пошагово пробежаться по этому куску, и все станет ясно. А так гадать можно очень долго. JTAG спаяем (WIGGLER) - а каким инструментарием "пошагово пробежаться по этому куску"? я не делат этого никогда, не знаю как... в инете конечно посмотрю... но может уже есть правельное отканаттое решение? Если в GCC то на сайте Macraigor подробно написано как отлаживаться через вигглер. www.macraigor.com/gnu_faq.htm Я пишу в RVDS 2.2 и отлаживаюсь встроенным отладчиком через H-JTAG. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 11 января, 2007 Опубликовано 11 января, 2007 · Жалоба Посмотрел. В функции AT91F_DataAbort() LR должен остаться целым. Его можно попробовать вытащить через inline asm - это <адрес инструкции, вызвавшей Abort> + 0x08. Вы были правы полностью: - вспоминается ваш пост: Стоп! Причем здесь корректная работа памяти? С ней, скорее всего, все в порядке. Data Abort возникает из-за некорректного обращения к памяти, а не по причине неисправности оной. с ней таки действительно все в порядке... я это проверил, вставил кусок кода для проверки памяти с топика - http://electronix.ru/forum/index.php?showtopic=20153 Подскажите пожалуста а как "можно попробовать вытащить через inline asm" ? и узнать "<адрес инструкции, вызвавшей Abort>" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 11 января, 2007 Опубликовано 11 января, 2007 · Жалоба Подскажите пожалуста а как "можно попробовать вытащить через 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба Честно говоря, как это сделать на GCC я так и не понял пытался это делать читая - http://www.ethernut.de/en/documents/arm-inline-asm.html и все одно не получается я не могу понять как ввставить такое, как асм вставку... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться