|
отладка at91R40008, простенькая программа |
|
|
|
Nov 25 2004, 21:16
|

Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 25-11-04
Из: Подольск
Пользователь №: 1 224

|
Добрый день. Совсем замучился я, что-то я не догоняю. Прошу помощи. Задача стоит совсем простая: на не прошедшем 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 в списке блочного сохранения. Мне непонятно, кто его заставляет читать оттуда, ведь происходит просто "засовывание" данных в стек? И, кстати, стек-поинтер тоже не проинициализирован - в регистрах этих, которые программа сторит, мусор по включению питания... Просьба такая: подскажите, как с этим бороться и каким образом инициализируется стек?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Feb 12 2005, 18:31
|

Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 25-11-04
Из: Подольск
Пользователь №: 1 224

|
Ну вот, отлаживаю я по выходным, когда время есть, поэтому вопросы медленно скапливаются... Собираю файл я "дёрнутым" из кейловского примера "Hello" скриптом линковки для RAM, и там указано следующее: Код MEMORY { CODE (rx) : ORIGIN = 0x00010000, LENGTH = 0x00020000 DATA (rw) : ORIGIN = 0x00030000, LENGTH = 0x00010000 } Но когда я загружаю получившуюся прогрмамму insight'ом, получается, что он её кладёт непонятно куда, но только не в память, посколько процессор-то ещё не ремэпленный. :-/ Что делать, как отлаживать программу, стартующую на "голом" процессоре? Если я правлю ld-шник, то получается ещё хуже, но уже после ремепа... Или можно insigh'ту указать, куда класть программу и с какого адреса стартовать?
|
|
|
|
|
Feb 12 2005, 20:46
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(Серокой @ Feb 12 2005, 21:31) Но когда я загружаю получившуюся прогрмамму insight'ом, получается, что он её кладёт непонятно куда, но только не в память, посколько процессор-то ещё не ремэпленный. :-/ Что делать, как отлаживать программу, стартующую на "голом" процессоре? Если я правлю ld-шник, то получается ещё хуже, но уже после ремепа... Или можно insigh'ту указать, куда класть программу и с какого адреса стартовать? Обычно старт программы в ARM-е происходит след. путем: назначаются вектора прерываний, загружаются регистры EBI, и сразу remap. Insight сам по себе делать это не умеет, а занимается этим обычно интерфейсная программа, связывающая GDB с процессором - если это резидентный монитор (RedBoot, например) - то он. А в случае с вигглером - та утилита, которая работает с вигглером. Есть команды записи в регистры, обычно включаются в стартовый скрипт - вы видимо макрегоровским OCDLibRemote пользуетесь - там есть пример стартового скрипта для Insight-а.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Feb 12 2005, 21:46
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(Серокой @ Feb 13 2005, 00:34) У меня инициализация векторов, EBI и собственно ремэп включены в программу, задача её просто сложить в память куда надо и выставить счётчик инструкций на это место. Посмотрю стартовый скрипт, если OCD и это умеет, то вопользуюсь. Ваш ремэп никуда не денется, но он после старта программы произойдет, не забывайте, что отладочный режим не = рабочему, в последнем старт программы происходит по 0 адресу, куда по сбросу назначается флеш, а у вас программа в отладочном режиме и не во флеше. Поэтому и требуется небольшое количество специальных ухищрений. А команды для OCD выдает Insight из стартового скрипта, посмотрите файл .gdbinit, или для винды будет gdb.init (или наподобие), команды, начинающиеся словом monitor - как раз для OCD, попробуте в Insight-е включить консоль GDB и дать команду "help monitor" - должен ответить (OCD).
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Feb 15 2005, 18:03
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(Серокой @ Feb 15 2005, 19:35) Оп-па! А какой командой gdb-скрипта можно прописать что-то по адресу? Кажется, нет такой команды...  А OCD commander ругается непонятно при команде...  Эти команды понимает 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-у, открыть окно с памятью, и по адресам поставить все вручную, в той последовательности, как в программе.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Feb 16 2005, 11:03
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(Серокой @ Feb 16 2005, 00:49) Кстати, вы раньше упоминали RedBoot. Вообще, рекомендуете использовать eCos? Как говаривал Чеширский Кот - это зависит от того, куда вы хотите попасть java script:emoticon(':biggrin:') Система сама хороша - но быстро ее не освоить, разве что вы полиглот, и это 15-я ваша RTOS. Ну и надобность в ОСе должна быть почувствована - в общем-то один из принципов IBM - "сложность программы растет до тех пор, пока не превысит способностей программиста" ОС - это возможность декомпозиции задачи, т.е. одна брольшая и сложная разбивается на кучу более мелких, к тому же часть проблем уже решена теми, кто написал ситему - причем не только программы как таковые, но еще и идеология, мироощущение должны быть продуманны, правильны, понятны и близки вам. Что касается RedBoot-а как отладочного монитора - полезная вещь, иногда очень, сильно помогает с eCos-ом, особенно когда приходится избавлятся от "строительных лесов" - убирать отладочные сервисы из системы, а отладка еще нужна.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Feb 19 2005, 21:51
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(Серокой @ Feb 19 2005, 22:04) Мне как раз eCos хвалили как простую настраиваемую оперционку, которая подержвает flash, fat, сеть... то есть всё то, что обычно пишется руками. Сократит ведь время разработки! Если уже есть вариант под вашу платформу - т.е. не нужно писать драйвера, разбиратся во внутреннем устройстве - то да, механизмы межзадачного взаимодействия вполне обычные, есть особенности, но не очень существенные, к тому же API можно выбрать по вкусу. И писать на C, а не C++, хоть и декларирован последний - STL так просто не приделать, правда купить можно кит у eCosCentric-а.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|