aaarrr 63 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба Честно говоря, как это сделать на GCC я так и не понял пытался это делать читая - http://www.ethernut.de/en/documents/arm-inline-asm.html и все одно не получается я не могу понять как ввставить такое, как асм вставку... Должно быть что-то типа: asm volatile("mov %0, r14" : "=r" (i) : ); Только листинг надо потом проверить обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба asm volatile("mov %0, r14" : "=r" (i) : ); Только листинг надо потом проверить обязательно. оказуется так просто? вот что в итоге получается... AT91F_LowLevelInit(): Debug channel initialized AT91F_DataflashInit AT91F_SpiInit PIOA->PIO_ABSR - 0 PIOA->PIO_PSR - 3FFFFF80 PMC->PMC_PCSR - 2000 SPI->SPI_SR - 100F2 SPI->SPI_MR - E0019 dfcode - 0 press any key to enter bootloader *----------------------------------------* 1: Download Dataflash [addr] 2: Read Dataflash [addr] 3: Start U-BOOT 4: Clear bootloader section in Dataflash 5: ...test... *----------------------------------------* Enter: 1 c0000000 Download Dataflash [0xc0000000] CCCCC Modification of Arm Vector 6 :34340017 Write 11392 bytes in DataFlash [0xc0000000] write_dataflash AT91F_DataflashSelect novalid -F- Data Abort detected -F- LOOP... --------- ASR --------->: 10201 --------- AASR --------->: EA000490 --------- Address --------->: 11C8 тоесть - 11C8 если я верно понял - это адрес из пространства - Internal Memories на еще и диапазона 0х0..0х100000 (Boot Memory) так а что это теперь может нам сообщить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба тоесть - 11C8 если я верно понял - это адрес из пространства - Internal Memories на еще и диапазона 0х0..0х100000 (Boot Memory) так а что это теперь может нам сообщить? Теперь смотрите map-файл линкера - к какой процедуре относится этот адрес. В асм-листинге все в порядке с R14? Еще не грех прочитать значение кода команды по полученному адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба Теперь смотрите map-файл линкера - к какой процедуре относится этот адрес. В асм-листинге все в порядке с R14? Еще не грех прочитать значение кода команды по полученному адресу. если я все правильно вижу - такого файла нет (map-файл линкера) root@server:romboot-evm9200_dmb# ll итого 435 drwxr-xr-x 6 dmb dmb 1320 2007-01-12 17:35 ./ drwxr-sr-x 5 root staff 280 2007-01-11 09:47 ../ -rw-r--r-- 1 root root 732 2007-01-12 17:35 asm_isr.o -rw-rw-rw- 1 dmb dmb 2058 2007-01-09 11:37 asm_isr.S -rw-rw-rw- 1 dmb dmb 23776 2007-01-12 17:15 at45.cpp -rw-r--r-- 1 root root 4792 2007-01-12 17:35 at45.o -rw-rw-rw- 1 dmb dmb 3711 2007-01-09 16:09 com.cpp -rw-rw-rw- 1 dmb dmb 3252 2007-01-09 11:37 com.h -rw-r--r-- 1 root root 2488 2007-01-12 17:35 com.o -rwxr-xr-x 1 dmb dmb 835 2007-01-09 17:34 compile* -rw-r--r-- 1 root root 1208 2007-01-12 17:35 cstartup_ram.o -rw-rw-rw- 1 dmb dmb 5272 2007-01-09 11:37 cstartup_ram.S -rw-rw-rw- 1 dmb dmb 7556 2007-01-12 17:15 dataflash.cpp -rw-rw-rw- 1 dmb dmb 7174 2007-01-12 16:06 dataflash.h -rw-r--r-- 1 root root 3940 2007-01-12 17:35 dataflash.o -rw-rw-rw- 1 dmb dmb 984 2007-01-09 16:09 div0.c -rw-r--r-- 1 root root 648 2007-01-12 17:35 div0.o -rw-rw-rw- 1 dmb dmb 348 2007-01-09 16:10 elf32-littlearm.lds -rw-rw-rw- 1 dmb dmb 27065 2007-01-09 11:37 embedded_services.h -rwxr-xr-x 1 dmb dmb 192 2007-01-09 11:37 env.sh* drwxrwxrwx 2 root root 112 2007-01-11 10:35 exchange/ drwxr-xr-x 2 dmb dmb 144 2007-01-10 10:08 include/ -rwxrw-rw- 1 root root 8429 2007-01-12 17:35 init.cpp* -rw-r--r-- 1 root root 2944 2007-01-12 17:35 init.o -rw-r--r-- 1 root root 508 2007-01-12 17:35 jump.o -rw-rw-rw- 1 dmb dmb 39 2007-01-09 11:37 jump.S -rw-rw-rw- 1 dmb dmb 15700 2007-01-12 16:10 main.cpp -rw-rw-rw- 1 dmb dmb 1352 2007-01-09 16:10 main.h -rw-r--r-- 1 root root 6580 2007-01-12 17:35 main.o lrwxrwxrwx 1 root root 13 2007-01-11 10:32 Makefile -> Makefile_last -rw-rw-rw- 1 dmb dmb 1044 2007-01-12 12:42 Makefile_last drwxr-xr-x 2 root root 1288 2007-01-11 10:30 old/ drwxr-xr-x 3 root root 1280 2007-01-11 10:32 old2/ -rw-r--r-- 1 root root 117345 2007-01-11 13:18 ROMBOOT.asm -rwxr-xr-x 1 root root 11308 2007-01-12 17:35 romboot.bin* -rwxrw-rw- 1 root root 10116 2007-01-09 11:37 romboot.bin.orig* -rw-rw-rw- 1 root root 44010 2007-01-12 17:35 romboot.lss -rwxr-xr-x 1 root root 18007 2007-01-12 17:35 romboot.out* -rw-rw-rw- 1 dmb dmb 5276 2007-01-09 11:37 stdio.cpp -rw-rw-rw- 1 dmb dmb 643 2007-01-09 11:37 stdio.h -rw-r--r-- 1 root root 3776 2007-01-12 17:35 stdio.o -rw-r--r-- 1 root root 900 2007-01-12 17:35 _udivsi3.o -rw-rw-rw- 1 dmb dmb 2219 2004-07-04 11:49 _udivsi3.S -rw-r--r-- 1 root root 892 2007-01-12 17:35 _umodsi3.o -rw-rw-rw- 1 dmb dmb 2767 2004-07-04 11:49 _umodsi3.S значение... посмотрите пожалуста(я не знаю что там искать) в приклепленном файле асмовый код... ROMBOOT.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 12 января, 2007 Опубликовано 12 января, 2007 · Жалоба если я все правильно вижу - такого файла нет (map-файл линкера) Значит линкер нужно попросить - посмотрите документицию. значение... посмотрите пожалуста(я не знаю что там искать) в приклепленном файле асмовый код... Посмотрел, могу сказать только, что LR не поврежден. Значение посмотрите тем же printf'ом: *(unsigned int*)i. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Значит линкер нужно попросить - посмотрите документицию. Посмотрел, могу сказать только, что LR не поврежден. Значение посмотрите тем же printf'ом: *(unsigned int*)i. Благодарю Вас... >"Значит линкер нужно попросить" - не совсем понятно, честно говоря что Вы имеете ввиду, а где его можно попросить? кстати, elf32-littlearm.lds - это не линкер скрипт? Кстати, раз проблема близка к проблеме с стеком... как можно проверить вообще стек? как узнать что должно быть и что получаем...? Видимо если - DataAbort - то \то очень вероятно что чтото или с памятью или с стеком... Как выяснилось память SDRAM тут не причем... Мне вообще не ясно что может быть за проблемма??? По следующей логике пытаюсь судить ---> Ведь, romboot этот стандартный(причем написан фирмой ATMEL если я правильно все понимаю) и у других людей этот загрузчик работает видимо корректно, почемуже не работает у нас? Схема то отличается только подключением переферии - ETHRNET и т д Я конечно извеняюсь, такого уровня проект делаю первый раз и подобная проблемма просто как скала перед носом... руки опускать не хочу и не могу себе позволить, а решить нада задачку... Вот и прошу Вас помочь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 33 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Вы что, с дуба все упали?ИМХО. Кто и где сказал загрузчику, что датафлеш сериальная? Загрузчик понимает, что флешка (обычная, параллельная) сидит по адресу 0xC0000000 И пытается ее писать. А ее нету. ну и облом соответственно. Соответственно и SPI недергается вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Вы что, с дуба все упали?ИМХО. Кто и где сказал загрузчику, что датафлеш сериальная? Загрузчик понимает, что флешка (обычная, параллельная) сидит по адресу 0xC0000000 И пытается ее писать. А ее нету. ну и облом соответственно. Соответственно и SPI недергается вообще. Разберитесь в проблеме, для начала. Данный загрузчик вообще не умеет писать "обычную" флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lelick 0 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба А вам кажется подозрительной фраза: Modification of Arm Vector 6 :34340017 вообще-nо для AT45DB642 должно быть 0841a017 (см стр. 87 на at91rm9200 "Structure of arm vector 6") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба А вам кажется подозрительной фраза: Modification of Arm Vector 6 :34340017 вообще-nо для AT45DB642 должно быть 0841a017 (см стр. 87 на at91rm9200 "Structure of arm vector 6") Совершенно верно, но к проблеме отношения не имеет :( Только не обязательно 0841a017, правильнее 0841a0xx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Совершенно верно, но к проблеме отношения не имеет :( Только не обязательно 0841a017, правильнее 0841a0xx. Можно Вас попросить изложить свою мысль по этому поводу? Хотелось бы понять что же все таки происходит и куда копать... Вы довольно метко подмечаете особенности вопроса! а то, уже, есть идея начинать пробовать писать свой загрузчик... неделю мыкаюсь и без результата... Правда побаиваюсь что после написания своего загрузчика тоже можем натолкнуться на такой же "глюк, эффект"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Попробую кратко изложить свои мысли по поводу Вашей проблемы. Итак, исключение DataAbort возникает из-за обращения инструкции, находящейся по адресу 0x11C8, к несуществующей памяти по адресу 0xEA000490. Само значение адреса говорит о том, что базовый регистр, использующийся при обращении, был загружен неправильно, и в результате вместо адреса в нем оказался фрагмент кода (b +0x10e8). Сейчас нужно установить, к какой именно части кода относится инструкция, расположенная по адресу 0x11C8. Это можно заставить сделать линкер, но у меня, к сожалению, нет сейчас под рукой документации. Добавьте в обработчик AT91F_DataAbort() еще одну строку: printf("\n --------- Address --------->: %X \n\r", (i - 0x08)); printf("\n --------- Opcode --------->: %X \n\r", *(volatile unsigned int*)(i - 0x08)); Возможно, это поможет обойтись без map-файла, но все же он крайне желателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Попробую кратко изложить свои мысли по поводу Вашей проблемы. Итак, исключение DataAbort возникает из-за обращения инструкции, находящейся по адресу 0x11C8, к несуществующей памяти по адресу 0xEA000490. Само значение адреса говорит о том, что базовый регистр, использующийся при обращении, был загружен неправильно, и в результате вместо адреса в нем оказался фрагмент кода (b +0x10e8). Сейчас нужно установить, к какой именно части кода относится инструкция, расположенная по адресу 0x11C8. Это можно заставить сделать линкер, но у меня, к сожалению, нет сейчас под рукой документации. Добавьте в обработчик AT91F_DataAbort() еще одну строку: printf("\n --------- Address --------->: %X \n\r", (i - 0x08)); printf("\n --------- Opcode --------->: %X \n\r", *(volatile unsigned int*)(i - 0x08)); Возможно, это поможет обойтись без map-файла, но все же он крайне желателен. собственно, вот что получил в терминале... Enter: 1 c0000000 Download Dataflash [0xc0000000] CCCCCCCC Modification of Arm Vector 6 :bdf80017 Write 11392 bytes in DataFlash [0xc0000000] write_dataflash - это я выводу для дебага пути AT91F_DataflashSelect novalid - это я выводу для дебага пути -F- Data Abort detected - это я выводу для дебага пути -F- LOOP... - это я выводу для дебага пути --------- ASR --------->: 10201 --------- AASR --------->: EA000494 --------- Address --------->: 11C8 --------- Opcode --------->: E59F002C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Совершенно верно, но к проблеме отношения не имеет :( Только не обязательно 0841a017, правильнее 0841a0xx. да кстати вот тест в int AT91F_DataflashInit (void) делаю маленькое изменение // for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) { for (i = 0; i < 1; i++) { и вот что получаю AT91F_LowLevelInit(): Debug channel initialized AT91F_DataflashInit AT91F_SpiInit PIOA->PIO_ABSR - 0 PIOA->PIO_PSR - 3FFFFF80 PMC->PMC_PCSR - 2000 SPI->SPI_SR - 100F2 SPI->SPI_MR - E0019 dfcode - 3C AT45DB642 press any key to enter bootloader ATMEL LOADER VER 1.01 Jan 16 2007 09:56:44 *----------------------------------------* AT91F_DataflashPrintInfo DataFlash:AT45DB642 Nb pages: 008192 Page Size: 001056 Size=08650752 bytes Logical address: 0xC0000000 AT91F_DataflashPrintInfo ERROR detect - 0 *----------------------------------------* 1: Download Dataflash [addr] 2: Read Dataflash [addr] 3: Start U-BOOT 4: Clear bootloader section in Dataflash 5: ...test... *----------------------------------------* Enter: Enter: 1 c0000000 Download Dataflash [0xc0000000] Modification of Arm Vector 6 :841a017 Write 11392 bytes in DataFlash [0xc0000000] write_dataflash AT91F_DataflashSelect read_dataflash AT91F_DataflashSelect Hit a Key!CCCCCCCCCCCC AT91F_LowLevelInit(): Debug channel initialized AT91F_DataflashInit AT91F_SpiInit PIOA->PIO_ABSR - 0 PIOA->PIO_PSR - 3FFFFF80 PMC->PMC_PCSR - 2000 SPI->SPI_SR - 100F2 SPI->SPI_MR - E0019 dfcode - 3C AT45DB642 PIOA->PIO_ABSR - 0 PIOA->PIO_PSR - 3FFFFF80 PMC->PMC_PCSR - 2000 SPI->SPI_SR - 100F2 SPI->SPI_MR - 70019 dfcode - 0 press any key to enter bootloader Load U-BOOT from dataflash[c0008000] to SDRAM[20f00000] read_dataflash AT91F_DataflashSelect Set PLLA to 180Mhz and Master clock to 45Mhz and start U-BOOT и - УРА!!!!!! зашилось нада зхаметить чтло это случайно....!!!!!!!!! с какойто промежуточной редакцией гдето в коде.... тоесть вот что я вижу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nvn 0 16 января, 2007 Опубликовано 16 января, 2007 (изменено) · Жалоба >CCCCCCCCCCCCCCCCC >AT91F_LowLevelInit(): Debug channel initialized >press any key to enter bootloader > >ATMEL LOADER VER 1.01 May 3 2006 15:21:06 >*----------------------------------------* >*----------------------------------------* >1: Download Dataflash [addr] >2: Read Dataflash [addr] >3: Start U-BOOT >4: Clear bootloader section in Dataflash >*----------------------------------------* >Enter: > >тут вроде все верно как раз тут и неверно... у Вас DataFlash вообще неопределяется romboot'ом, поэтому дальше идти рано... добейтесь что бы romboot увидел вашу флэшку. Должно быть что-то вроде этого: ATMEL LOADER VER 1.01 May 3 2006 15:21:06 *----------------------------------------* DataFlash:AT45DB321 Nb pages: 008192 Page Size: 000528 Size=04325376 bytes Logical address: 0xC0000000 *----------------------------------------* 1: Download Dataflash [addr] 2: Read Dataflash [addr] 3: Start U-BOOT 4: Clear bootloader section in Dataflash *----------------------------------------* Enter: упс!! не заметил пока печатал, что вы уже решили эту проблему :) З.Ы.: да еще на AT45DB321 запись у romboot'а глючит Изменено 16 января, 2007 пользователем nvn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться