Bender 0 24 сентября, 2005 Опубликовано 24 сентября, 2005 · Жалоба Да, аналогично :) У фуджиков тоже были свои стартап'ы, но я их почти не трогал-все работало и так. А тут без помощи не обойтись - все таки не понятно ни с .xcl, ни с cstartup.s79 - не мог бы кто нибудь поподробнее осветить это дело? 2VVJ- Тут буквально в пятницу в конце рабочего дня вроде заработал WIGGLER- похоже следовало поставить галку в DEBUGGER/DOWNLOAD на пункте Attach programm - стал коннектится, но это теперь до понедельника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 24 сентября, 2005 Опубликовано 24 сентября, 2005 · Жалоба Ребят, давайте мух от котлет отделять. 1. vvj, Если у тебя 29LV160 в 16-разрядном режиме, то забей на Bootloader. Тебе достаточно прошить код, перевести BMS в 0 и он стартанет прямо с флэшки. Только не забывай про ремэпы и что внутренняя SRAM проца будет по адресу 0x200000 и это надо указать в XCL-файле. Для 8-разрядного режима будет работать механизм Bootloader, только почитай Errata пункт 37. 2. Насчет cstartup.s79 и векторов. Все вектора, которые используются в приложении, будут вкомпилены в выходной файл. Если часть векторов не используется, как в вашем случае, на их местах будут нули. Для обычного приложения это штатная ситуация. Если мы хотим чтобы BootLoader признал наш код за валидное приложение, то должны прописать все вектора, а шестой еще и специальной информацией. Проще всего это сделать в cstartup.s79. Пример такого cstartup.s79 прикрепляю. Обратить внимание на код по адресу 0x14. 3. Насчет XCL-файла. Смею вас огорчить, но запрограммировать ARM в IAR не прописав руками XCL нереально. Справедливости ради надо отметить, что в настройках линкера есть кнопочка Command line configuration tool, но я как-то попробовал ей законфигурить и плюнув просто написал все в XCL. А необходимо это все по очень простой причине. ВЫ ДОЛЖНЫ СКАЗАТЬ КОМПИЛЯТОРУ СКОЛЬКО КАКОЙ ПАМЯТИ ПО КАКИМ АДРЕСАМ ЕСТЬ В СИСТЕМЕ И КУДА РАЗМЕЩАТЬ ВЕКТОРА ПРЕРЫВАНИЙ, СТЭКИ, СЕГМЕНТЫ КОДА И ДАННЫХ, КУЧУ. Ведь ARM может иметь довольно богатый набор различных типов памяти на борту и за бортом. Плюс тот же REMAP надо учесть. При этом, в отличии напримр от AVR, адресное пространство данных не отделено от адресного пространства программ, что дает множество возможных вариантов построения проекта. На этом месте советую почитать про сегменты в IAR-вском хэлпе. 4. Более того, один проект обычно содержит несколько XCL. Например, для отладки совсем не обязательно прошивать флэшки, а можно использовать для размещения кода SDRAM. При финальной же компиляции все переносится во flash. И примеров, когда надо использовать разную память в проекте, может быть множество. 5. Насчет Wiggler. Он хорош, если ARM для вас хобби. Но если это ваша работа, то я не понимаю как можно экономить на инструменте. Сравните стоимость фирменного J-Link и более чем вдвое дешевого MT-Link со стоимостью изготовления опытной четырех-шестислойной печатной платы для AT91RM9200 со всей его периферией !!! После подписания счета на печатные платы мой директор счет на J-Link подмахнул даже не спросив что это. Кстати, Flashloader для DataFlash уже работает. Так что, сегодня-завтра еще обкатаю на предмет ошибок и в понедельник выложу. cstartup.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 26 сентября, 2005 Опубликовано 26 сентября, 2005 · Жалоба Как и обещал выкладываю новую версию FlashLoader-а для IAR+AT91RM9200. Добавлена поддержка DataFlash AT45DB321 и AT45DB642. Остальные легко добавляются по аналогии. Обратите внимание на параметры, которые надо передать при запуске - они орсаны в файле !Parameters.txt. FL_AT91RM9200_AM29_AT45.RAR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 27 сентября, 2005 Опубликовано 27 сентября, 2005 · Жалоба извиняюсь за повтор но наболело: :cranky: Закачиваю значит бинарник в SDRAM и прыгаю по 0x20000000 Начинает работать, криво правда (- медленно) - потом разберусь... Если пишу закаченное в 16битный Flash - при BMS=0 - не начинает. Содержимое флэша уже проверял после ресета. Где та собака ? :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 27 сентября, 2005 Опубликовано 27 сентября, 2005 · Жалоба Может просто неправильно инициализируешь клоки? Не забудь, что SCM для флэшки надо инициализировать до того как переходишь на высокие тактовые MCK - флэшка то поди 70 нс? А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 28 сентября, 2005 Опубликовано 28 сентября, 2005 · Жалоба А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал. Виноват - не работает из SDRAMа - это из SRAMа код начинает работать... Потому как загружаемая прога компайлится используя тотже cstartup и .xcl для запуска из SRAM (по 0x00) - прав ли я? Но загрузив в SDRAM прект (с ftp://at91dist:[email protected]/ "AT91RM9200-Interrupt", из архива AT91RM9200_BasicTools_IAR4_11A_1_1.zip ) скомпайленый под at91_lnk_ram20000000.xlc, тоже наблюдаю тишину. Хотя с XModema, код скомпайленый, используя at91_lnk_ram.xlc и at91_lnk_ram200.xlc "лампочками мигает". Может я прыгаю не так: Jump((unsigned int)0x20000000); , хотя код взят из исходников loader'а (jump.s79): #include <at91rm9200dk.h> MODULE MyJump COMMON INTVEC:CODE:NOROOT(2) PUBLIC Jump Jump: CODE32 msr CPSR_c, #(ARM_MODE_SYS | I_BIT | F_BIT) mov pc, r0 ENDMOD END Кстати зачем перед прыжком там устанавливается режим процессора (или поправьте меня) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 28 сентября, 2005 Опубликовано 28 сентября, 2005 · Жалоба JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай. А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 28 сентября, 2005 Опубликовано 28 сентября, 2005 · Жалоба JTAG по тебе плачет. А SDRAM А.C.Пушкин инициализирует? Я честно говоря думал что мой "загрузчик" "оставляет" после себя (перед прыжком) проинициализарованный SDRC. Если не так, то как закаченный им в SDRAM код вообще должен считываться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 28 сентября, 2005 Опубликовано 28 сентября, 2005 · Жалоба Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Такой вопрос: если посмотреть на map файлы каждой из конфигураций Debug 0x20000000\List\interrupt.map: Absolute parts ENTRY ADDRESS REF BY ===== ======= ====== _HEAP_SIZE 00010000 _IRQ_STACK_SIZE 00000004 _CSTACK_SIZE 00010000 RAMEND 203FFFFF RAMSTART 20000000 ROMEND 203FFFFF ROMSTART 20000000 Debug 0x200000\List\interrupt.map: _HEAP_SIZE 00000100 _IRQ_STACK_SIZE 00000004 _CSTACK_SIZE 00000100 RAMEND 00203FFF RAMSTART 00200000 ROMEND 00203FFF ROMSTART 00200000 Debug 0x00\List\interrupt.map: _HEAP_SIZE 00000100 _IRQ_STACK_SIZE 00000004 _CSTACK_SIZE 00000100 RAMEND 00003FFF RAMSTART 00000000 ROMEND 00003FFF ROMSTART 00000000 то вроде бы отвечает ожиданиям, а вот если глядеть на визуальный AddressMap из Command File Configuration Tool от Linker'а то всё одно и тоже: 0-3F Вектора, 8000-F FFFF ROM, 10 0000-7F FFFF RAM при любой (из трёх) выбранной конфигурации! и я уже не понимаю что имеется ввиду под ROMом и RAMом? 2. Записал 1MB c ROMа(с 0x10 0000) во FLASH и всё равно при BMS=0 не грузится. Хотя должен ли BootLoader стартануть с 16b flash'ки? причём осциллографом видно что (при BMS0) читает после ресета - nCS0 выдаёт меандр ~5kHz в течении ~10 секунд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Ну блин, когда BMS=0, то FLASH с адреса 0x00000000 начинается, а SRAM с 0x200000. -DRAMSTART=200040 -DRAMEND=203FFF -DSDRAMSTART=20000000 -DSDRAMEND=21FFFFFF -DROMSTART=40 -DROMEND=1FFFFF Вот с таким XCL сможешь из FLASH стартануть, только не забудь в low_level_init SDRAM инициализировать. // INTVEC -- Exception vector table. // SWITAB -- Software interrupt vector table. // ICODE -- Startup (cstartup) and exception code. // DIFUNCT -- Dynamic initialization vectors used by C++. // CODE -- Compiler generated code. // CODE_I -- Compiler generated code declared __ramfunc (executes in RAM) // CODE_ID -- Initializer for CODE_I (ROM). // ------------- // Data segments - may be placed anywhere in memory. // ------------- // CSTACK -- The stack used by C/C++ programs (system and user mode). // IRQ_STACK -- The stack used by IRQ service routines. // SVC_STACK -- The stack used in supervisor mode // (Define other exception stacks as needed for // FIQ, ABT, UND). // HEAP -- The heap used by malloc and free in C and new and // delete in C++. // INITTAB -- Table containing addresses and sizes of segments that // need to be initialized at startup (by cstartup). // CHECKSUM -- The linker places checksum byte(s) in this segment, // when the -J linker command line option is used. // DATA_y -- Data objects. // // Where _y can be one of: // // _AN -- Holds uninitialized located objects, i.e. objects with // an absolute location given by the @ operator or the // #pragma location directive. Since these segments // contain objects which already have a fixed address, // they should not be mentioned in this linker command // file. // _C -- Constants (ROM). // _I -- Initialized data (RAM). // _ID -- The original content of _I (copied to _I by cstartup) (ROM). // _N -- Uninitialized data (RAM). // _Z -- Zero initialized data (RAM). -carm -DRAMSTART=200040 -DRAMEND=203FFF -DSDRAMSTART=20000000 -DSDRAMEND=21FFFFFF -DROMSTART=40 -DROMEND=1FFFFF -Z(CODE)INTVEC=00-3F -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND -Z(CODE)SWITAB=ROMSTART-ROMEND -Z(CODE)CODE=ROMSTART-ROMEND -Z(CONST)CODE_ID=ROMSTART-ROMEND -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND -Z(CONST)CHECKSUM=ROMSTART-ROMEND //************************************************ // Data segments. //************************************************ -Z(DATA)DATA_I,DATA_Z,DATA_N=SDRAMSTART-SDRAMEND //************************************************ // __ramfunc code copied to and executed from RAM. //************************************************ -Z(DATA)CODE_I=SDRAMSTART-SDRAMEND -QCODE_I=CODE_ID //************************************************************************* // Stack and heap segments. //************************************************************************* -D_CSTACK_SIZE=800 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=300 -D_HEAP_SIZE=4000 -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)HEAP+_HEAP_SIZE=SDRAMSTART-SDRAMEND Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Вот с таким XCL сможешь из FLASH стартануть, только не забудь в low_level_init SDRAM инициализировать. Есть ну очень тупая апликейшн: только лампочками мигает - никаких там PLL,SDRAM etc. Она работает со SRAMа закружаясь по XModem'у. Если её скомпайлить с приведённым выше .xcl и прошить во FLASH - должна ли она работать (у меня не хочет) или необходимо сделать что-то ещё ? cstartup сейчас default'овый - но ведь при BMS=0 никто и не "рыщит" за первыми 8ю векторами. Кстати, похоже что этот Linker Command File Configuration Tool не "парсит" изменения в отредоктированном ручками .xcl - всё время показывает свои Region: ARM [0-3F], [800-3FFF] что вообще ни пришей ни.. И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bender 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако. Посмотри настройки линкера - закладка "LIST" -> segment map,module map,static overlay map. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Вот тебе XCL для "тупого апликэйшина", работающего из FLASH при BMS=0. На коком MCK твой "тупой апликэйшин" работает? На забудь перед переходом с часового кварца на основной сделать что-то типа SMC_CSR0= (1<<13)|(1<<12)|(3<<8)|(1<<7)|5; //DWB=1 | BAT=1 | TDF=3 | WSEN | NWS=4 -carm -DRAMSTART=200040 -DRAMEND=203FFF -DROMSTART=40 -DROMEND=1FFFFF -Z(CODE)INTVEC=00-3F -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND -Z(CODE)SWITAB=ROMSTART-ROMEND -Z(CODE)CODE=ROMSTART-ROMEND -Z(CONST)CODE_ID=ROMSTART-ROMEND -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND -Z(CONST)CHECKSUM=ROMSTART-ROMEND //************************************************ // Data segments. //************************************************ -Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND //************************************************ // __ramfunc code copied to and executed from RAM. //************************************************ -Z(DATA)CODE_I=RAMSTART-RAMEND -QCODE_I=CODE_ID //************************************************************************* // Stack and heap segments. //************************************************************************* -D_CSTACK_SIZE=400 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=100 -D_HEAP_SIZE=0000 -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND -Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvj 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба #include "AT91RM9200.h" unsigned long cnt; void main(void) { * AT91C_PIOA_OER=AT91C_PIO_PA0 | AT91C_PIO_PA1; for (int l = 0; l<10; l++) { * AT91C_PIOA_SODR=AT91C_PIO_PA0; * AT91C_PIOA_SODR=AT91C_PIO_PA1; for (cnt=0;cnt<99999;cnt++); * AT91C_PIOA_CODR=AT91C_PIO_PA0; * AT91C_PIOA_CODR=AT91C_PIO_PA1; for (cnt=0;cnt<99999;cnt++); } } Тупее не придумал, но даже это с флэша не грузится. Может в default'овом cstartup'е дело? EDIT : лампочки зажглися :w00t: :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться