Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:4
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:8
Форум » starterkit.ru » ARM
Базовые вопросы по низкоуровневой отладке
neutrino17
Добавлено 29.10.2010 22:45
0
Сообщение: 1
neutrino17
0

Пункты: 295
Регистрация: 23.11.2009
Наконец-то дошли руки до собственного хеловорлда для AT91SAM9260 (пока на асме).

Написал, собрал, залил, до этого момента я более-менее разобрался, что к чему. Но есть проблема, а именно - при запуске не работает :) Т.е. не работает не "вообще", а какая-то часть хелловорлда. Код состоит из векторов исключений и вывода "Hello" в UART: по сбросу безусловный переход на вывод "Hello" на экран, а потом вечный цикл. Грузится хелловорлд бутстрапом, и поэтому - на сколько я понимаю бутстрап - UART и SDRAM проинициализированы и готовы к использованию. Код запускается, потому что если вывести только первый символ строки, он всё же выводится, а вот с циклом где-то ошибка закралась. Я бы привёл здесь листинг, но не хочу загружать вас своим кодом.

Вопрос, собственно говоря, у меня такой - какие возможности для низкоуровневой отладки проще всего использовать новичку? Как я понял, у AT91SAM9260 есть внутрисхемный эмулятор (ICE), работа с которым возможна через интерфейс JTAG (сам JTAG адаптер у меня есть). Так же непонятно, как быть с софтом. ОС (Windows или Linux) для меня большого значения не имеет. Слышал такие слова как Keil uVision, ARM DS-5, IAR, но не знаю, подойдут ли они мне для изучения ARM или это всё равно, что стрелять из пушки по воробьям... В то же время тратить большие деньги за профессиональный софт пока не охота (но если этот софт даёт существенные выгоды, то это другое дело). Может быть мне будет проще скачать какой-нибудь опенсорс симулятор арма и отладить хеловорлд на нём? С другой стороны очень хотелось бы научиться отлаживать на живом железе.

Что посоветуете?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 31.10.2010 11:41 Сообщение: 2
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Что посоветуете?

вполне можно выложить исходник в прикрепленных файлах или куда-нить в public place и дать ссылку на него. дабы знающие люди возможно подсказали бы возможные ошибки в сорце..

Цитата
вывести только первый символ строки, он всё же выводится

а если убрать цикл и попробовать вывести 2+ символа линейно?
может прерывание после отправки не отрабатывает, может флаг не тот поллится..

Цитата
какие возможности для низкоуровневой отладки

сам практически не касался, в памяти вертится нечто GDB под линукс - где-то на форуме обсуждалось..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 31.10.2010 16:30 Сообщение: 3
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
сам практически не касался, в памяти вертится нечто GDB под линукс - где-то на форуме обсуждалось..

что-то типа этого..
http://www.starterkit.ru/html/index.php?name=forum&op=view&id=6418

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
neutrino17
Добавлено 02.11.2010 15:18 Сообщение: 4
neutrino17
0

Пункты: 295
Регистрация: 23.11.2009
В аттачменте архив с 2 файлами: для векторов исключений и вывода строки. Только теперь вообше ничего не выводится, видимо выводилось в предыдуших версиях. Прерывания я не использую, а просто опрашиваю флаг готовности в регистре статуса, и как только флаг становится в "1", записываю очередной байт в регистр для передачи. По крайней мере, именно так работает отладочный вывод в бутстрапе. ГДБ мне тут, к сожалению, не поможет, т.к. некому его прочитать, запустить и обеспечить, у меня схема простая: РОМБут -> Бутстрап -> приложение.

П.С. Такое впечатление, что где-то очень глупая ошибка, но я ее не вижу.
Спуститься к концу Подняться к началу
Персональная информация
neutrino17
Добавлено 02.11.2010 15:24 Сообщение: 5
neutrino17
0

Пункты: 295
Регистрация: 23.11.2009
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 02.11.2010 17:25 Сообщение: 6
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
в асме я не силен - ковырял по любительски :)

визуально все похоже на правду..
и регистры те, и алгоритм вроде правильный.
для очистки совести попробуйте вместо ADD поставить ADDS

существует еще такое понятие
Код
.align 4
выравнивание по границе слова

и все же абстрагируемся, для начала, от цикла:

проинтили регистры
считали первый символ
заслали в уарт
ждем готовность
считали второй символ
заслали в уарт
ждем готовность
в конце бесконечная петля

убеждаемся, что линейно все работает как задумано

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 02.11.2010 17:32 Редактировалось 02.11.2010 17:35 Сообщение: 7
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Скорей всего адрес линкера относительно которого он считает все метки и адрес по которому загружается бинарь из бутсрапа не совпадают.
Потом если уж пишете на ассемблере - пишите оптимальный код, зачем вот это ?
do_pr: ldrb r1, [r2]
..........
add r2, r2, #1

это делается одной командой
ldrb r1, [r2, #1]!

Вот такие замысловатые конструкции нисколько не читаемы
tst r1, #0xFF
beq halt

Неужели нельзя номальо написать
cmp r1, #0
beq halt
Спуститься к концу Подняться к началу
Персональная информация
neutrino17
Добавлено 03.11.2010 00:36 Сообщение: 8
neutrino17
0

Пункты: 295
Регистрация: 23.11.2009
Благодарю за замечания, сам я в ассемблере тоже не капенгаген, но именно поэтому сейчас мучаю его :)

Добился вывода одного нуля не прибегая к косвенной адресации:

DBGU_SR=0xFFFFF214
DBGU_THR=0xFFFFF21C

.globl start_main
start_main:
ldr r4, =DBGU_SR
ldr r5, =DBGU_THR
do_pr: mov r1, #48
wrwait: ldr r0, [r4]
ands r0, r0, #2
beq wrwait
str r1, [r5]
halt: b halt

Далее, не ориентируясь на ноль в конце строки, и используя r6 в качестве счетчика символов:

DBGU_SR=0xFFFFF214
DBGU_THR=0xFFFFF21C

.globl start_main
start_main:
mov r6, #0
ldr r4, =DBGU_SR
ldr r5, =DBGU_THR
ldr r2, hello_str
do_pr: cmp r6, #HELLO_STR_SIZE
beq halt
add r6, #1
ldrb r1, [r2], #1
wrwait: ldr r0, [r4]
ands r0, r0, #2
beq wrwait
strb r1, [r5]
b do_pr
halt: b halt

HELLO_STR_SIZE=5
hello_str:
.ascii "Hello"

На экране выводится "l����" Адресацию в лдрб, как я понял, подглядев в "АРМ Сустем Девелоперс Гуиде" надо делать именно так, как я сейчас написал, т.е. режим постиндекс. Но проблема действительно в адресации, где-то я туплю. Ведь вряд ли надо в моем случае прибегать к линкер-скрипту с указанием карты памяти... так что пока думаю дальше... Сейчас видимо придется сделать без цикла...
Спуститься к концу Подняться к началу
Персональная информация
neutrino17
Добавлено 03.11.2010 00:39 Сообщение: 9
neutrino17
0

Пункты: 295
Регистрация: 23.11.2009
то бишь 'l' и 4 знака вопроса
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 03.11.2010 00:53 Редактировалось 03.11.2010 01:03 Сообщение: 10
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
Но проблема действительно в адресации, где-то я туплю. Ведь вряд ли надо в моем случае прибегать к линкер-скрипту с указанием карты памяти... так что пока думаю дальше... Сейчас видимо придется сделать без цикла...


То что проблема с адрсами понятно :) чем вы вообще пользуетесь каким компилятором и как собираете бинарник ? там же абсолютный адрес у строки, тоесть если при сборке линкер его относительно 0х0 вычислит значит и загружать программу нужно по нулевому адресу, в gas (вернее в ld) это указывается например так -Ttext=0x20000000 - это если загружать в sdram в самое начало. sram по адресу 0х0 - там все стеки код бутсрапа, тоесть вам нужно в любом случае ориентироваться на sdram и сообщить линкеру базовый адрес, по этому же адресу и загружать потом бинарь.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM