Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладка at91R40008
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Серокой
Добрый день. Совсем замучился я, что-то я не догоняю. Прошу помощи.
Задача стоит совсем простая: на не прошедшем remap AT91R40008 запустить программу. Отладка идёт с помощью собранных под ARM gnotools, сама платка подключена через Wiggler к insight.
Текст программы такой:
Код
int main(void)
{
int a, b, c;
a = 8;
b = 7;

c=a+b;

while (1)
    {
    c=c+1;
    }
return (c);
}


Компилируется без оптимизации, в итоге листинг выглядит так:
Код
00300000 <main>:
 300000:    e1a0c00d  mov    ip, sp
 300004:    e92dd800  stmdb    sp!, {fp, ip, lr, pc}
 300008:    e24cb004  sub    fp, ip, #4; 0x4
 30000c:    e24dd00c  sub    sp, sp, #12; 0xc
 300010:    e3a03008  mov    r3, #8; 0x8
 300014:    e50b3010  str    r3, [fp, -#16]
 300018:    e3a03007  mov    r3, #7; 0x7
 30001c:    e50b3014  str    r3, [fp, -#20]
 300020:    e51b2010  ldr    r2, [fp, -#16]
 300024:    e51b3014  ldr    r3, [fp, -#20]
 300028:    e0823003  add    r3, r2, r3
 30002c:    e50b3018  str    r3, [fp, -#24]
 300030:    e51b3018  ldr    r3, [fp, -#24]
 300034:    e2833001  add    r3, r3, #1; 0x1
 300038:    e50b3018  str    r3, [fp, -#24]
 30003c:    eafffffb  b    300030 <main+0x30>

Проверяю работу пошагово по GDB. Первая инструкция выполняется без нареканий, видно, как SP переместился в 12 регистр. После попытки выполения второй инструкции всё рухает со страшным грохотом. Wiggler кричит, что его заставляют читать с какого-то адреса, и по этой причине у него случается Bus Error. Адрес этот содержится в 11 регистре, он же fp в списке блочного сохранения. Мне непонятно, кто его заставляет читать оттуда, ведь происходит просто "засовывание" данных в стек? И, кстати, стек-поинтер тоже не проинициализирован - в регистрах этих, которые программа сторит, мусор по включению питания...
Просьба такая: подскажите, как с этим бороться и каким образом инициализируется стек?
jojo
В комплекте с Кейлом ARM есть примерчики для 40008. В стартапе.асм все инициализируется. Затем сишный код выполняется.

www.keil.com
Серокой
Спасибо. А у вас нет этого примера? На почту выслать. У меня нет Кейла, а качать из-за одного примера накладно... sad.gif
Серокой
jojo, спасибо за подсказку, я нашёл пример стартапа на собственно сайте Атмела! smile.gif
Буду крутить дальше...

http://atmel.com/dyn/resources/prod_documents/DOC2644.PDF
jojo
Это хорошо. Поскольку вашей почты у меня нет smile.gif

Примеры приделаны к этому сообщению. надеюсь.
Серокой
Это да, мыло недоступно так просто на таком движке. Забыл. smile.gif
Скачал, спасибо! smile.gif
Серокой
Кстати, вообще, возможна отладка по JTAG программы, откомпилированной для загрузки из flash, но в неё не прошитой?
jojo
Для отладки программа и данные должны быть в памяти. Будь то ОЗУ или ПЗУ. Иначе откуда будут выборки делаться программным автоматом?

Как я понимаю, надо процесс погрузки каким-то образом выполнить.
Серокой
То есть надо иметь два скрипта линковки - для отладки, чтоб всё в память складывать, и для конечной прошивки - во флеш? Одну программу отладить не получится. Верно я понимаю?
jojo
>То есть надо иметь два скрипта линковки - для отладки, чтоб всё в память складывать, и для конечной прошивки - во флеш?

Это если не хочется при отладке ПЗУ перешивать.

Я не пробовал отлаживать из ПЗУ через GDB и Wiggler с использованием символьной информации, только из ОЗУ. Там да, действительно, надо иметь два скрипта для линкера.

При использовании CrossWorks и Keil для символьной отладки достаточно, чтобы по нужным адресам был код программы. Шьем flash - и из нее же выполняем код и символьно отлаживаемся.
Серокой
Спасибо!
Я использую в качестве оболочки eclipse, а отлаживаю в insight. Но в общем принципы-то абсолютно те же...
Серокой
Ну вот, отлаживаю я по выходным, когда время есть, поэтому вопросы медленно скапливаются...
Собираю файл я "дёрнутым" из кейловского примера "Hello" скриптом линковки для RAM, и там указано следующее:
Код
MEMORY
{
 CODE (rx) : ORIGIN = 0x00010000, LENGTH = 0x00020000
 DATA (rw) : ORIGIN = 0x00030000, LENGTH = 0x00010000
}


Но когда я загружаю получившуюся прогрмамму insight'ом, получается, что он её кладёт непонятно куда, но только не в память, посколько процессор-то ещё не ремэпленный. :-/
Что делать, как отлаживать программу, стартующую на "голом" процессоре? sad.gif
Если я правлю ld-шник, то получается ещё хуже, но уже после ремепа...
Или можно insigh'ту указать, куда класть программу и с какого адреса стартовать?
v_shamaev
Цитата(Серокой @ Feb 12 2005, 21:31)
Но когда я загружаю получившуюся прогрмамму insight'ом, получается, что он её кладёт непонятно куда, но только не в память, посколько процессор-то ещё не ремэпленный. :-/
Что делать, как отлаживать программу, стартующую на "голом" процессоре? sad.gif
Если я правлю ld-шник, то получается ещё хуже, но уже после ремепа...
Или можно insigh'ту указать, куда класть программу и с какого адреса стартовать?
*


Обычно старт программы в ARM-е происходит след. путем: назначаются вектора прерываний, загружаются регистры EBI, и сразу remap. Insight сам по себе делать
это не умеет, а занимается этим обычно интерфейсная программа, связывающая GDB
с процессором - если это резидентный монитор (RedBoot, например) - то он. А в случае
с вигглером - та утилита, которая работает с вигглером. Есть команды записи в регистры,
обычно включаются в стартовый скрипт - вы видимо макрегоровским OCDLibRemote пользуетесь - там есть пример стартового скрипта для Insight-а.
Серокой
Благодарю вас!
У меня инициализация векторов, EBI и собственно ремэп включены в программу, задача её просто сложить в память куда надо и выставить счётчик инструкций на это место.
Посмотрю стартовый скрипт, если OCD и это умеет, то воспользуюсь.
v_shamaev
Цитата(Серокой @ Feb 13 2005, 00:34)
У меня инициализация векторов, EBI и собственно ремэп включены в программу, задача её просто сложить в память куда надо и выставить счётчик инструкций на это место.
Посмотрю стартовый скрипт, если OCD и это умеет, то вопользуюсь.
*


Ваш ремэп никуда не денется, но он после старта программы произойдет, не забывайте,
что отладочный режим не = рабочему, в последнем старт программы происходит по 0 адресу, куда по сбросу назначается флеш, а у вас программа в отладочном режиме и не во флеше. Поэтому и требуется небольшое количество специальных ухищрений. А команды для OCD выдает Insight из стартового скрипта, посмотрите файл .gdbinit, или для винды
будет gdb.init (или наподобие), команды, начинающиеся словом monitor - как раз для OCD,
попробуте в Insight-е включить консоль GDB и дать команду "help monitor" - должен ответить (OCD).
Серокой
Оп-па! А какой командой gdb-скрипта можно прописать что-то по адресу? Кажется, нет такой команды... sad.gif
А OCD commander ругается непонятно при команде... sad.gif
v_shamaev
Цитата(Серокой @ Feb 15 2005, 19:35)
Оп-па! А какой командой gdb-скрипта можно прописать что-то по адресу? Кажется, нет такой команды... sad.gif
А OCD commander ругается непонятно при команде... sad.gif
*


Эти команды понимает Insight в стартовом скрипте - но к этому моменту target должен
быть подсоединен.

Это кусок моего старого скрипта:

# EBI_CSR0
set {long}0xffe00000 = 0x01002529
# EBI_CSR1
set {long}0xffe00004 = 0x02003121
# set {long}0xffe00004 = 0x00403121
# REMAP Done
set {long}0xffe00020 = 0x00000001
#2M bytes per CS
set {long}0xffe00024 = 0x00000006
set {long}0xfff0000c = 0x00000001

Как вариант = не нужны {long}. В консоли GDB наберите help set - и он все выдаст.

Второй вариант - подключиться в Insight-е к target-у, открыть окно с памятью, и по адресам
поставить все вручную, в той последовательности, как в программе.
Серокой
Ура! Спасибо! Оба способра работают ({long} нужен, без него ругается), и программка тоже работает! smile.gif
Кстати, вы раньше упоминали RedBoot. Вообще, рекомендуете использовать eCos?
v_shamaev
Цитата(Серокой @ Feb 16 2005, 00:49)
Кстати, вы раньше упоминали RedBoot. Вообще, рекомендуете использовать eCos?
*


Как говаривал Чеширский Кот - это зависит от того, куда вы хотите попасть java script:emoticon(':biggrin:')
Система сама хороша - но быстро ее не освоить, разве что вы полиглот, и это 15-я ваша RTOS.
Ну и надобность в ОСе должна быть почувствована - в общем-то один из принципов IBM -
"сложность программы растет до тех пор, пока не превысит способностей программиста"
ОС - это возможность декомпозиции задачи, т.е. одна брольшая и сложная разбивается на кучу более мелких, к тому же часть проблем уже решена теми, кто написал ситему - причем
не только программы как таковые, но еще и идеология, мироощущение должны быть продуманны, правильны, понятны и близки вам.

Что касается RedBoot-а как отладочного монитора - полезная вещь, иногда очень, сильно помогает с eCos-ом, особенно когда приходится избавлятся от "строительных лесов" -
убирать отладочные сервисы из системы, а отладка еще нужна.
Серокой
Мне как раз eCos хвалили как простую настраиваемую оперционку, которая подержвает flash, fat, сеть... то есть всё то, что обычно пишется руками. Сократит ведь время разработки!

И обращаюсь ко всем, кто прочитает! Не могли бы вы помочь, приаттачив, если у вас есть, в ответе файл 91R40008.H от Кейла?
v_shamaev
Цитата(Серокой @ Feb 19 2005, 22:04)
Мне как раз eCos хвалили как простую настраиваемую оперционку, которая подержвает flash, fat, сеть... то есть всё то, что обычно пишется руками. Сократит ведь время разработки!
*


Если уже есть вариант под вашу платформу - т.е. не нужно писать драйвера, разбиратся во внутреннем устройстве - то да, механизмы межзадачного взаимодействия вполне обычные,
есть особенности, но не очень существенные, к тому же API можно выбрать по вкусу. И писать на C, а не C++, хоть и декларирован последний - STL так просто не приделать, правда
купить можно кит у eCosCentric-а.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.