VladislavS
Jun 20 2005, 06:56
Только начал работать с 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
Jun 20 2005, 13:57
С вопросом номер 3 разобрался сам. Был невнимателен и не заметил, что Flashloader работает не на частоте PLLB, а на частоте PLLB/16. А это всего лишь 6 МГц. Кстати, наверное надо в макросе флэшлоадера прописать тактироваться от (Main Clock)/4 . Так можно будет шить на системах, где PLLB не заводится.
Цитата
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
Jun 21 2005, 09:11
Просветление потихоньку приходит. Спасибо. С частотами разобрался. FLASH пашет как милая, SDRAM сейчас буду запускать.
А нет случайно примера как в IAR написать команды включения кэшей? Что-то пока не приходит просветление по поводу:
CP15 registers can only be accessed in privileged mode by:
• MCR (Move to Coprocessor from ARM Register) instruction
Случайно примера как в IAR написать команды включения кэшей у меня нет, а то что касается включения и настройки кэш-памяти - можно посмотреть как это делается в Linux.
VladislavS
Jun 21 2005, 11:51
Надо отдать должное 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 прямо на ассемблере.
А можно что-нибудь по-проще?
Не понимаю как его (flashloader) использовать - сам пока только "лампочками мигаю" и тестирую (пишу/читаю) SDRAM. Гружусь Xmodemом (виглер бастует).
Вот...
А записать/прочитать флэш (такой же) ой как хочется. Об kernele конечно не может быть и речи, пока...
Не нашёл в этом loaderе даже обращения к SMC.
Ткните ПОЖАЛУЙСТА куда копать?
VladislavS
Sep 16 2005, 17:12
Для того чтобы использовать этот FlashLoader надо подключиться по J-TAG. Не важно чем Wiggler подойдет. С его помощью можно flash прошить. Подробнее смотри EWARM User Guide страницу 232. Там все подробно.
Для X-Modem это решение не идет. Подойдет вот это
http://www.ucrouter.ru/download/AT91RM9200-29lv160d.binСобственно там еще много чего интересного есть.
Цитата(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 не видит
VladislavS
Sep 21 2005, 18:55
В меню настройках Debuger надо указать Use macro file на файл .mac, а на вкладке Download галку Use flashloader. И потом добавить запись с указанием файлв d79. В параметрах указать стартовый адрес flash. Дополнительно можно задать параметры --erasechip чтобы стереть весь чип перед записью или --eraseonly чтобы только стереть чип без записи.
Кстати, на подходе новая версия с поддержкой DataFlash на SPI. На выходных дотестирую и выложу. В связи с этим вопрос к спецам возник. Я хочу сделть команду, которая позволит прописать в вектора прерываний данные, чтобы BootLoader распознал прошивку как загрузочную. Что делать с 6-м вектором понятно - там рамер прошивки и параметры flash, которые определяются на автомате. А как бытьс остальными векторами? Если они не прописаны, что туда записать? Есть идея просто 0-й продублировать. Прокатит ли?
Мы просто меняли в редакторе нех-значение 6 байта и всё работало.
В принципе и у тебя должно получиться.
VladislavS
Sep 22 2005, 12:30
Вопрос не в том чтобы загрузиться, это я как раз умею и без hex-редактора. Вопрос в том чтобы FlashLoader делал поправки на автомате. Для того чтобы прошивка загрузилась из SPI надо выполнить два условия:
1) Шестой вектор содержит информацию о размере кода и типе Flash
2) Все остальные вектора команду перехода.
Если с первым все понятно - никаких вольностей, все до бита определено, то ко второму вопросу можно подойти творчески.
- ничего не менять. Это правильней всего, пусть программист сам все определит в программе.
- если какие-то вектора пустуют, то их можно насильно прописать. Это упростит жизнь новичкам, которые еще не весь даташит наизусть знают. Только хочется сделать это максимально правильно.
Такие дела: Wiggler глючит - отложил пока, в использование Embedded srvcов не въехал. Написал свой загрузчик по XModemу в SDRAM оттуда во флэш - в начало 0го сектора.
Загружаю(во флэш) тестовый .bin с добавлеными вперёд 32 байтами. В шестой вектор пишу размер всего кода. Пробовал как Little так BigEndian (в отношении первых 32 бойтов). Также пробовал перекл. флэш в 8бит (пин у неё ByteModeSelect).
Не грузит с флэша и всё
Подскажите мож чё нетак делаю?
VladislavS
Sep 23 2005, 14:24
Еще раз внимательно прочти страницу 88 и особенно 89 даташита doc1768.pdf.
Лучше чем там написано объяснить трудно. Вкратце - шестрой вектор содержит ИНФОРМАЦИЮ О ТИПЕ МИКРОСХЕМЫ Flash и РАЗМЕР КОДА для загрузки. А остальные вектора команды LDR или B. И все будет грузится. Кстати, эти 32 байта не добавляются, а являются частью кода, так что лучше скомпилировать код сразу как надо.
Только не советую проводить опыты без JTAG, а то как только оно начнет грузиться из SPI, то про загрузку по XModem можно забыть. Разве что NPCS0 отключить джампером. Ну или предварительно загрузчик в параллельную флэш прописать и дергать BMS в случае чего.
Ну и про Embedded Services - все работает. Причем, точно так как написано в даташите. Надо только не забывать проверять статус занятости микросхемы перед выполнением каких-либо действий с ней.
Цитата(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
Sep 24 2005, 01:26
Да, аналогично
У фуджиков тоже были свои стартап'ы, но я их почти не трогал-все работало и так.
А тут без помощи не обойтись - все таки не понятно ни с .xcl, ни с cstartup.s79 - не мог бы кто нибудь поподробнее осветить это дело?
2VVJ- Тут буквально в пятницу в конце рабочего дня вроде заработал WIGGLER- похоже следовало поставить галку в DEBUGGER/DOWNLOAD на пункте Attach programm - стал коннектится, но это теперь до понедельника.
VladislavS
Sep 24 2005, 06:04
Ребят, давайте мух от котлет отделять.
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
Sep 26 2005, 04:25
Как и обещал выкладываю новую версию FlashLoader-а для IAR+AT91RM9200.
Добавлена поддержка DataFlash AT45DB321 и AT45DB642. Остальные легко добавляются по аналогии. Обратите внимание на параметры, которые надо передать при запуске - они орсаны в файле !Parameters.txt.
извиняюсь за повтор но наболело:
Закачиваю значит бинарник в SDRAM и прыгаю по 0x20000000
Начинает работать, криво правда (- медленно) - потом разберусь...
Если пишу закаченное в 16битный Flash - при BMS=0 - не начинает.
Содержимое флэша уже проверял после ресета.
Где та собака ?
VladislavS
Sep 27 2005, 17:37
Может просто неправильно инициализируешь клоки? Не забудь, что SCM для флэшки надо инициализировать до того как переходишь на высокие тактовые MCK - флэшка то поди 70 нс?
А то что из SDRAM работает это заслуга загрузчика, который за тебя уже все инициализировал.
Цитата(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
Sep 28 2005, 14:18
JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай.
А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.
Цитата(VladislavS @ Sep 28 2005, 17:18)
JTAG по тебе плачет.
Цитата(VladislavS @ Sep 28 2005, 17:18)
А SDRAM А.C.Пушкин инициализирует?
Я честно говоря думал что мой "загрузчик" "оставляет" после себя (перед прыжком) проинициализарованный SDRC. Если не так, то как закаченный им в SDRAM код вообще должен считываться?
VladislavS
Sep 28 2005, 18:26
Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.
Такой вопрос:
если посмотреть на 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
Sep 29 2005, 13:59
Ну блин, когда 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
Цитата(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
Sep 30 2005, 05:01
Цитата(vvj @ Sep 29 2005, 21:43)
И ещё: не нашёл в своём проекте .map файлов. Ни "на диске" , ни в настройках. В скачанных с инета проектах в List директории один .map, а у меня там куча .lst и .s79ых. Настораживает однако.
Посмотри настройки линкера - закладка "LIST" -> segment map,module map,static overlay map.
VladislavS
Sep 30 2005, 05:37
Вот тебе 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
Код
#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 : лампочки зажглися
Заработало, извиняюсь, видимо php здесь не сработал
TBD: эти "резонанс-посты" можно было бы удалить
Заработало, извиняюсь, видимо php здесь не сработал
TBD: эти "резонанс-посты" можно было бы удалить
А FLом займёмся как только JTAG приедет
VladislavS
Sep 30 2005, 16:16
Так заработало или нет?
Народ, а FlashLoader то у кого-нибудь работает? А то может зря распинался?
Цитата(VladislavS @ Sep 30 2005, 19:16)
А то может зря распинался?
ни в коем случае!
J-Link вчера приехал и усё сегодня заработало!
Созрели и вопросы (ответ конечно в 1768, но что не нашёл пока): при BMS=0, по 0му адресу-флэш, а по какому адресу начинается SRAM ? Надо ли делать ремап и что он даст?
Почему спрашиваю - по дисассемблеру видно что переменные индекса цикла читаются из ~[PC,#+160] но ведь код выполняется из флэша - писать(держать там переменные) туда "нельзя"...
При BMS=1 смотрю в дебагере (работает BootLoader - ремапа значит небыло) по адресу 0x00 и 0x10_0000 - разный код.
А вообще конечно от всей души за FL благодарю!
VladislavS
Oct 5 2005, 05:25
При BMS=0 Flash начинается с адреса 0x00000000 и копия с 0x10000000, а SRAM c 0x00200000
При BMS=1 Flash начинается с адреса 0x10000000, а SRAM c 0x00000000 и копия с 0x00200000
Remap лучше делать, так как вектора прерываний читаются из SRAM быстрее, чем из FLASH. Кэширование это немного сглаживает, но не до конца - разница в скорости исполнения кода небольшая есть.
А не могли бы пояснить с переменными: по инструкции 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
Oct 5 2005, 13:27
По директиве LDR надо просто почитать о методах адресации. Я в этом не силен.
Запись
Код
-Z(DATA)CODE_I=RAMSTART-RAMEND
-QCODE_I=CODE_ID
сделана для функций, которые при инициализации сегментов копируются из ПЗУ в ОЗУ и оттуда запускаются. В программе такие функции имеют модификатор __ramfunc.
Цитата(VladislavS @ Sep 24 2005, 09:04)
Насчет XCL-файла. Смею вас огорчить, но запрограммировать ARM в IAR не прописав руками XCL нереально.
Возвращаясь к .XCL и не только: а нет ли у кого IAR'овского проекта c U-Boot'ом ?
Сам пока не догоняю возможно ли это всё в одном проекте - у него там и BootImage, и переменные окружения, и запакованный код.
Это всё по отдельности прошивать надо или возможно "за один присест" ?
FlashLoader'ом?
VladislavS
Oct 6 2005, 18:09
В принципе, IAR-ом c FlashLoader-ом можно прошить любой предварительно подготовленный файл в формате simple-code. Про этот формат есть в его доках. То есть, можно скомпилить чем хочешь в бинарник, сделать несложный конвертер в simple-code и шить. Но это, по большомуу счету, извращение. Намного проще залить по X-Modem вот это
http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin и шить что хочешь и куда хочешь. FlashLoader удобен когда весь проект в IAR сделан и отлаживается.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.