Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка кода из SD Card
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
yerzhik
Здравствуйте,
я впервые делаю подобное и потому не знаю как сделать это:
Имеется проект, который компилируется и загружается на девайс успешно через IAR и JLink дебаггер.
Часть кода работает во flash rom, другая часть кода а также данные грузятся в ram и SDRAM.
Теперь необходимо обойтись без дебаггера
Часть кода во флеш роме остается не изменное, но при каждой загрузке
нужно загрузить код и данные в ram и sdram из внешней флешки (sd card).
Вопрос собственно как это сделать?
Я получил бинарный файл при компиляции IAR.
Программа на максимум 2 мегабайта, но бинарный файл аж на 1 гигабайт, я не знаю как от туда взять код соответсвующий SDRAM и вообще правильный ли подход?
mdmitry
Вы бы описали задачу подробно: микропроцессор и аппаратное окружение, компилятор, ключи компиляции, что и как в файле линкера настроено.
KRS
Цитата(yerzhik @ Nov 30 2012, 09:36) *
Программа на максимум 2 мегабайта, но бинарный файл аж на 1 гигабайт, я не знаю как от туда взять код соответсвующий SDRAM и вообще правильный ли подход?

Так там просто дырка в адресации! Часть кода для флеша, часть для SDRAM а между ними ff заполнено просто - это же бинарник!
Генерируйте intel HEX или IAR simplecode.
Или разделите проекты для флеша и sdram - тогда дырки не будет.

Загрузку кода с SD карты прийдется делать. Возьмите Fatfs там есть все необходимое.
Если у вас конечно обычный микроконтроллер из серии LPC17xx или STM32...
SyncLair
Насколько я понимаю у Вас ARM

0. Отодвигаете начало вашей программы в флешь на пару килобайт
1. Узнаёте по каким адресам в ОЗУ и какие секции расположены.
2. Выдёргиваете как-нибудь эти секции по одельности (по IAR я не спец, я больше по GCC )
3. Пишете ОТДЕЛЬНО программу которая читает секции с SD карты и пишет их в flash & RAM
4. прошиваете эту одельную программу

втыкаете sd КАРТУ и наслаждаетесь процессом копирования.

Конечно тут придётся повозиться со скриптами и настройкой компилятора. -- нюхнёте пороху ибо любая системная вешь -- это вам не "Hellow word!" понимаешь biggrin.gif

yerzhik
Цитата(mdmitry @ Nov 30 2012, 17:55) *
Вы бы описали задачу подробно: микропроцессор и аппаратное окружение, компилятор, ключи компиляции, что и как в файле линкера настроено.


LPC1788 Процессор. IAR Embedded workbench.
В файле линкера часть кода идет во флеш ром (0x00 - 0x0007FFFF)
стек идет в RAM: (0x10000000 - 0x1000FFFF)
И остальное - это код и данные идут в SDRAM (0xA0000000 - 0xA1FFFFFF)

В memory map написано:

"P3": place in [from 0xa0000000 to 0xa1ffffff] {
ro section ...наименования секции};
"P4": place in [from 0xa0000000 to 0xa1ffffff] { rw };
"P5": place in [from 0xa0000000 to 0xa1ffffff] { block HEAP };

У P3 размер 0xad2ac.
Я решил скопировать из файла бинарника область от 0xA0000000 - 0xA00AD2AC

Я смотрю в файл бинарника начиная с 0xA0000000го байта, и сравниваю с тем, что находится фактически в памяти через дебаггер
выходит что не совпадают значения.

Они начинают совпадать начиная с 0xA0000040 го байта.

Цитата(KRS @ Nov 30 2012, 22:39) *
Так там просто дырка в адресации! Часть кода для флеша, часть для SDRAM а между ними ff заполнено просто - это же бинарник!
Генерируйте intel HEX или IAR simplecode.
Или разделите проекты для флеша и sdram - тогда дырки не будет.

Загрузку кода с SD карты прийдется делать. Возьмите Fatfs там есть все необходимое.
Если у вас конечно обычный микроконтроллер из серии LPC17xx или STM32...

У меня не совпадают байты из бинарного файла по адресу начала адреса SDRAM (0xA0000000)
с байтами, которые фактически находятся в SDRAM после запуска программы через дебаггер.
Начиная с адреса 0xA0000000, судя по memory map файлу находится секция кода. То есть не должна она меняться (read only).
Вот я и не могу понять в чем проблема.
Но если пропарсить ELF файл через программу ELF Viewer то можно увидеть, что секция кода расположена по адресу 0xA0000000 имеет содержимое, которое совпадает с фактическими байтами из программы. Как найти соответсвующий код в бинарном файле?
yerzhik
Кажется я понял проблему не совпадения.
Во первых я сравнивал первые 64 байта. Фактических байтов данных в памяти с тем что находится в бинарнике.
Проверял от начала до конца бинарного файла и получил место совпадения равным 0xA0000040. Надо было отнять 64 (0x40) чтобы получить место начала совпадения ( а не конца совпадения)
Во вторых в программе венды у меня не работает fseek(filePointer, 0xA0000000, SEEK_SET);
он возвращает не ноль, что свидетельствует об ошибке, но почему не знаю.
Поэтому я скопировал начало файла вместо того что должно идти по адресу 0xA0000000
demiurg_spb
Цитата(yerzhik @ Dec 3 2012, 07:09) *
Во вторых в программе венды у меня не работает fseek(filePointer, 0xA0000000, SEEK_SET);
он возвращает не ноль, что свидетельствует об ошибке, но почему не знаю.
Файл открыт с атрибутами "rb"?
Используйте srec_cat не изобретайте велосипед.
yerzhik
Цитата(demiurg_spb @ Dec 3 2012, 09:34) *
Файл открыт с атрибутами "rb"?
Используйте srec_cat не изобретайте велосипед.


Да rb. А srec_cat'ом можно разве вытащить только код определенной секции?
demiurg_spb
Из бинарника или хекса или любого другого файлового формата, поддерживаемого srec_cat можно вытащить что угодно и как угодно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.