Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR Flashloader для AT91RM9200 + AM29LV160D
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
VladislavS
Только начал работать с ARM и сразу на AT91RM9200. До этого имел дело c ATMega128. Потихоньку начал разбираться. Сначала во внутренней RAM простенькие программы запускал, шупал настройки и проникался масштабом бедствий. Потом дошло дело до Flashloader. Два дня отладчика и он заработал.

В эттаче FlashLoader для AT91RM9200 + AM29LV160DB(T) с исходниками.
Может кому полезно будет.

Ну и попутно вопросы созрели:

1. Помогите разобраться с тактовыми частотами. PLLB = 96 МГц c выходом 48 для USB это понятно. Все остальное буду тактировать от PLLA. Какую MCK надо подать на Memory Controller, если на нем подключено AM29LV160DB 70 нc и SDRAM с CL=2 при 100 МГц.

2. Тактовая на SDRAM равна MCK? Тогда что лучше в плане производительности
a) Процессор на 180 МГц и SDRAM на 90 МГц
б) Процессор на 100 Мгц и SDRAM на 100 МГц
Код будет исполняться из SDRAM.

3. Не совсем понял с времянкой работы FLASH на SMC. Во флэшлоадере MCK у меня 96 МГц c PLLB и все настройки SMC по умолчанию. Как это вяжется с 70 нc скоростью микросхемы AM29LV160D? Похоже, я что-то не понимаю.

4. Стоит ли стэк помещать во внутренней RAM процессора, а не в SDRAM. Получу ли я прибавку в скорости. Как к этому отнесется кэш?

Нажмите для просмотра прикрепленного файла
VladislavS
С вопросом номер 3 разобрался сам. Был невнимателен и не заметил, что Flashloader работает не на частоте PLLB, а на частоте PLLB/16. А это всего лишь 6 МГц. Кстати, наверное надо в макросе флэшлоадера прописать тактироваться от (Main Clock)/4 . Так можно будет шить на системах, где PLLB не заводится.
GSG
Цитата
1. Помогите разобраться с тактовыми частотами. PLLB = 96 МГц c выходом 48 для USB это понятно. Все остальное буду тактировать от PLLA. Какую MCK надо подать на Memory Controller, если на нем подключено AM29LV160DB 70 нc и SDRAM с CL=2 при 100 МГц.

2. Тактовая на SDRAM равна MCK? Тогда что лучше в плане производительности
  a) Процессор на 180 МГц и SDRAM на 90 МГц
  б) Процессор на 100 Мгц и SDRAM на 100 МГц
Код будет исполняться из SDRAM.

3. Не совсем понял с времянкой работы FLASH на SMC. Во флэшлоадере MCK у меня 96 МГц c PLLB и все настройки SMC по умолчанию. Как это вяжется с 70 нc скоростью микросхемы AM29LV160D? Похоже, я что-то не понимаю.

4. Стоит ли стэк помещать во внутренней RAM процессора, а не в SDRAM. Получу ли я прибавку в скорости. Как к этому отнесется кэш?


Ответ на первый и попутно на второй вопросы - с точки зрения производительности лучше :
a) Процессор на 200 МГц и SDRAM на 100 МГц, но т.к производитель нормирует максимальную частоту работы на внешней шине всего лишь 80 Мhz, то есть ещё 2 варианта:
б) Процессор на 209 МГц и SDRAM на 70(209/3) МГц;
в) Процессор на 160 МГц и SDRAM на 80 МГц.
ВЫбирай сам.

Ответ на третий вопрос - нужно внимательно посмотреть на значение МСК и настройки SMC для нужного nCS.

Ответ на четвертый вопрос - по моему мнению стэк стоит помещать во внутренней RAM процессора, а не в SDRAM, работать будет быстрее.
VladislavS
Просветление потихоньку приходит. Спасибо. С частотами разобрался. FLASH пашет как милая, SDRAM сейчас буду запускать.

А нет случайно примера как в IAR написать команды включения кэшей? Что-то пока не приходит просветление по поводу:

CP15 registers can only be accessed in privileged mode by:
• MCR (Move to Coprocessor from ARM Register) instruction
GSG
Случайно примера как в IAR написать команды включения кэшей у меня нет, а то что касается включения и настройки кэш-памяти - можно посмотреть как это делается в Linux.
VladislavS
Надо отдать должное IAR за исчерпывающую документацию. Для включения кэша (вообще для доступа к CP15) можно пользоваться функцией __MCR void __MCR(__ul coproc, __ul opcode_1, __ul src, __ul CRn, __ulCRm, __ul opcode_2); Generates a coprocessor write instruction (MCR). Так как это надо делать в режиме ARM, то гораздо проще оказалось прописать все в cstartup.s79 прямо на ассемблере.
vvj
А можно что-нибудь по-проще?
Не понимаю как его (flashloader) использовать - сам пока только "лампочками мигаю" и тестирую (пишу/читаю) SDRAM. Гружусь Xmodemом (виглер бастует).
Вот...
А записать/прочитать флэш (такой же) ой как хочется. Об kernele конечно не может быть и речи, пока...

Не нашёл в этом loaderе даже обращения к SMC.

Ткните ПОЖАЛУЙСТА куда копать?
VladislavS
Для того чтобы использовать этот FlashLoader надо подключиться по J-TAG. Не важно чем Wiggler подойдет. С его помощью можно flash прошить. Подробнее смотри EWARM User Guide страницу 232. Там все подробно.

Для X-Modem это решение не идет. Подойдет вот это
http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin
Собственно там еще много чего интересного есть.
vvj
Цитата(VladislavS @ Sep 16 2005, 20:12)
Для того чтобы использовать этот FlashLoader надо подключиться по J-TAG. Не важно чем Wiggler подойдет. С его помощью можно flash прошить. Подробнее смотри EWARM User Guide страницу 232. Там все подробно.

Читал. Между делом и флэш раскочегарил - пишу, читаю, стираю.

Но т.к. слишком зелёный в этом деле (начал вот читать уже с первых страниц) - непонял что конкретно подсовывать в качестве пути в диалог Override default flash loader path?
FlashAT91RM9200_AM29LV160.d79?
выдаёт ошибку "Overlapping address ranges"
И в перспктиве осталось неясным как выполнить этот самый пункт первый
"C-SPY downloads the flash loader into target RAM" ?

PS> А как вообще IAR с Wigglerом совмещать надо?
схема с двумя буферами и ресетами (SRst инвентирован), IAR_4.30
Я как-то пару раз вошёл в debug (CtrlD) режим без проблем.
А теперь никак: "Check that all cables are connected and power is OK"
Настройки wigglerа не менял, изменение последних (скорость и ресет) результатов недаёт. А OCD Commander работает...

Здесь промелькала тема что IAR4.11 c Wigglerом не дружит. Ну блин это же не значит что савсем несовместим! Между прочим, насколько я теперь вспоминаю я перезапустил IAR с другим проектом. И теперь он Wiggler не видит angry.gif
VladislavS
В меню настройках Debuger надо указать Use macro file на файл .mac, а на вкладке Download галку Use flashloader. И потом добавить запись с указанием файлв d79. В параметрах указать стартовый адрес flash. Дополнительно можно задать параметры --erasechip чтобы стереть весь чип перед записью или --eraseonly чтобы только стереть чип без записи.

Кстати, на подходе новая версия с поддержкой DataFlash на SPI. На выходных дотестирую и выложу. В связи с этим вопрос к спецам возник. Я хочу сделть команду, которая позволит прописать в вектора прерываний данные, чтобы BootLoader распознал прошивку как загрузочную. Что делать с 6-м вектором понятно - там рамер прошивки и параметры flash, которые определяются на автомате. А как бытьс остальными векторами? Если они не прописаны, что туда записать? Есть идея просто 0-й продублировать. Прокатит ли?
GSG
Мы просто меняли в редакторе нех-значение 6 байта и всё работало.
В принципе и у тебя должно получиться.
VladislavS
Вопрос не в том чтобы загрузиться, это я как раз умею и без hex-редактора. Вопрос в том чтобы FlashLoader делал поправки на автомате. Для того чтобы прошивка загрузилась из SPI надо выполнить два условия:
1) Шестой вектор содержит информацию о размере кода и типе Flash
2) Все остальные вектора команду перехода.

Если с первым все понятно - никаких вольностей, все до бита определено, то ко второму вопросу можно подойти творчески.
- ничего не менять. Это правильней всего, пусть программист сам все определит в программе.
- если какие-то вектора пустуют, то их можно насильно прописать. Это упростит жизнь новичкам, которые еще не весь даташит наизусть знают. Только хочется сделать это максимально правильно.
vvj
Такие дела: Wiggler глючит - отложил пока, в использование Embedded srvcов не въехал. Написал свой загрузчик по XModemу в SDRAM оттуда во флэш - в начало 0го сектора.
Загружаю(во флэш) тестовый .bin с добавлеными вперёд 32 байтами. В шестой вектор пишу размер всего кода. Пробовал как Little так BigEndian (в отношении первых 32 бойтов). Также пробовал перекл. флэш в 8бит (пин у неё ByteModeSelect).
Не грузит с флэша и всё angry.gif
Подскажите мож чё нетак делаю?
VladislavS
Еще раз внимательно прочти страницу 88 и особенно 89 даташита doc1768.pdf.
Лучше чем там написано объяснить трудно. Вкратце - шестрой вектор содержит ИНФОРМАЦИЮ О ТИПЕ МИКРОСХЕМЫ Flash и РАЗМЕР КОДА для загрузки. А остальные вектора команды LDR или B. И все будет грузится. Кстати, эти 32 байта не добавляются, а являются частью кода, так что лучше скомпилировать код сразу как надо.

Только не советую проводить опыты без JTAG, а то как только оно начнет грузиться из SPI, то про загрузку по XModem можно забыть. Разве что NPCS0 отключить джампером. Ну или предварительно загрузчик в параллельную флэш прописать и дергать BMS в случае чего.

Ну и про Embedded Services - все работает. Причем, точно так как написано в даташите. Надо только не забывать проверять статус занятости микросхемы перед выполнением каких-либо действий с ней.
vvj
Цитата(VladislavS @ Sep 23 2005, 17:24)
Кстати, эти 32 байта не добавляются, а являются частью кода, так что лучше скомпилировать код сразу как надо.
догадывался, но я то ожидал увидеть вектора в начале .bin'а, а там только первый есть, остальные - нули.
Может покажете свой cstartup.s79 - ведь цивильно вектора вписываются туда как я понял из EWARM_CompilerReference.pdf (а не hex редактором). Кстати надоли тоогда что менять в.xcl ? Впринципе же эти директивы о содержимом табдицы векторов можно в любой имеющийся в проекте .s79 засунуть?
Сам то я пользуюсь пока тест проектом от тов. Bender'а: там был в OBJ директории cstartup.r79 - я его потёр - ничё неизменилось.
Теперь про шестой вектор.
В шите говориться об установках для dataFlash. Но у меня то обычная 29LV160 от EBI через SMC. SPI нету. А стр. 95 п.7.3.3.5 упоминается размер кода в шестом векторе.
Благодарю всех за исчерпывающие ответы особенно что-нибудь про этот cstartup. Как-то сам теперь удивляюсь что позади работа c 51ми TUSB3210 и 7C68013(EZ-FX2, USB2.0 поднимал - детский сад, как теперь вижу) на Keilе, а вот удалось прожить не вдаваясь в подробности cstartup'ов - ,были там какие-то - ну хрен с ними - и так работало...
Bender
Да, аналогично smile.gif
У фуджиков тоже были свои стартап'ы, но я их почти не трогал-все работало и так.
А тут без помощи не обойтись - все таки не понятно ни с .xcl, ни с cstartup.s79 - не мог бы кто нибудь поподробнее осветить это дело?

2VVJ- Тут буквально в пятницу в конце рабочего дня вроде заработал WIGGLER- похоже следовало поставить галку в DEBUGGER/DOWNLOAD на пункте Attach programm - стал коннектится, но это теперь до понедельника.
VladislavS
Ребят, давайте мух от котлет отделять.

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 уже работает. Так что, сегодня-завтра еще обкатаю на предмет ошибок и в понедельник выложу.
VladislavS
Как и обещал выкладываю новую версию FlashLoader-а для IAR+AT91RM9200.
Добавлена поддержка DataFlash AT45DB321 и AT45DB642. Остальные легко добавляются по аналогии. Обратите внимание на параметры, которые надо передать при запуске - они орсаны в файле !Parameters.txt.
vvj
извиняюсь за повтор но наболело: cranky.gif
Закачиваю значит бинарник в SDRAM и прыгаю по 0x20000000
Начинает работать, криво правда (- медленно) - потом разберусь...
Если пишу закаченное в 16битный Flash - при BMS=0 - не начинает.
Содержимое флэша уже проверял после ресета.
Где та собака ? smile3046.gif
VladislavS
Может просто неправильно инициализируешь клоки? Не забудь, что SCM для флэшки надо инициализировать до того как переходишь на высокие тактовые MCK - флэшка то поди 70 нс?

А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.
vvj
Цитата(VladislavS @ Sep 27 2005, 20:37)
А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.

Виноват - не работает из SDRAMа - это из SRAMа код начинает работать...
Потому как загружаемая прога компайлится используя тотже cstartup и .xcl для запуска из SRAM (по 0x00) - прав ли я?
Но загрузив в SDRAM прект (с ftp://at91dist:distrib@81.80.104.162/ "AT91RM9200-Interrupt", из архива Нажмите для просмотра прикрепленного файла ) скомпайленый под 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
JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай.

А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.
vvj
Цитата(VladislavS @ Sep 28 2005, 17:18)
JTAG по тебе плачет.
blush.gif
Цитата(VladislavS @ Sep 28 2005, 17:18)
А SDRAM А.C.Пушкин инициализирует?
Я честно говоря думал что мой "загрузчик" "оставляет" после себя (перед прыжком) проинициализарованный SDRC. Если не так, то как закаченный им в SDRAM код вообще должен считываться?
VladislavS
Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.
vvj
Такой вопрос:
если посмотреть на 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
Ну блин, когда 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
Цитата(VladislavS @ Sep 29 2005, 16:59)
Вот с таким 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
Цитата(vvj @ Sep 29 2005, 21:43)
И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако.

Посмотри настройки линкера - закладка "LIST" -> segment map,module map,static overlay map.
VladislavS
Вот тебе 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
Код
#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.gif

a14.gif
vvj
Заработало, извиняюсь, видимо php здесь не сработал bb-offtopic.gif

TBD: эти "резонанс-посты" можно было бы удалить
vvj
Заработало, извиняюсь, видимо php здесь не сработал bb-offtopic.gif
TBD: эти "резонанс-посты" можно было бы удалить
А FLом займёмся как только JTAG приедет
VladislavS
Так заработало или нет?

Народ, а FlashLoader то у кого-нибудь работает? А то может зря распинался?
vvj
Цитата(VladislavS @ Sep 30 2005, 19:16)
А то может зря распинался?

ни в коем случае!
J-Link вчера приехал и усё сегодня заработало!
Созрели и вопросы (ответ конечно в 1768, но что не нашёл пока): при BMS=0, по 0му адресу-флэш, а по какому адресу начинается SRAM ? Надо ли делать ремап и что он даст?
Почему спрашиваю - по дисассемблеру видно что переменные индекса цикла читаются из ~[PC,#+160] но ведь код выполняется из флэша - писать(держать там переменные) туда "нельзя"...
При BMS=1 смотрю в дебагере (работает BootLoader - ремапа значит небыло) по адресу 0x00 и 0x10_0000 - разный код.

А вообще конечно от всей души за FL благодарю!
VladislavS
При BMS=0 Flash начинается с адреса 0x00000000 и копия с 0x10000000, а SRAM c 0x00200000

При BMS=1 Flash начинается с адреса 0x10000000, а SRAM c 0x00000000 и копия с 0x00200000

Remap лучше делать, так как вектора прерываний читаются из SRAM быстрее, чем из FLASH. Кэширование это немного сглаживает, но не до конца - разница в скорости исполнения кода небольшая есть.
vvj
А не могли бы пояснить с переменными: по инструкции LDR я не вижу что бы "cnt" читалась в R2 именно из SRAM, а вот обведённый красным комментарий сообщает об обратном:Нажмите для просмотра прикрепленного файла
Не имеет ли к этому отношение запись в .xcl
Цитата
//************************************************
// __ramfunc code copied to and executed from RAM.
//************************************************

-Z(DATA)CODE_I=RAMSTART-RAMEND

-QCODE_I=CODE_ID

И что имеется ввиду в Debug Log'е : Driver does not support code coverage. ?
VladislavS
По директиве LDR надо просто почитать о методах адресации. Я в этом не силен.

Запись
Код
-Z(DATA)CODE_I=RAMSTART-RAMEND

-QCODE_I=CODE_ID

сделана для функций, которые при инициализации сегментов копируются из ПЗУ в ОЗУ и оттуда запускаются. В программе такие функции имеют модификатор __ramfunc.
vvj
Цитата(VladislavS @ Sep 24 2005, 09:04)
Насчет XCL-файла. Смею вас огорчить, но запрограммировать ARM в IAR не прописав руками XCL нереально.

Возвращаясь к .XCL и не только: а нет ли у кого IAR'овского проекта c U-Boot'ом ?
Сам пока не догоняю возможно ли это всё в одном проекте - у него там и BootImage, и переменные окружения, и запакованный код.
Это всё по отдельности прошивать надо или возможно "за один присест" ?
FlashLoader'ом?
VladislavS
В принципе, IAR-ом c FlashLoader-ом можно прошить любой предварительно подготовленный файл в формате simple-code. Про этот формат есть в его доках. То есть, можно скомпилить чем хочешь в бинарник, сделать несложный конвертер в simple-code и шить. Но это, по большомуу счету, извращение. Намного проще залить по X-Modem вот это http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin и шить что хочешь и куда хочешь. FlashLoader удобен когда весь проект в IAR сделан и отлаживается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.