Наконец-то дошли руки до собственного хеловорлда для AT91SAM9260 (пока на асме).
Написал, собрал, залил, до этого момента я более-менее разобрался, что к чему. Но есть проблема, а именно - при запуске не работает :) Т.е. не работает не "вообще", а какая-то часть хелловорлда. Код состоит из векторов исключений и вывода "Hello" в UART: по сбросу безусловный переход на вывод "Hello" на экран, а потом вечный цикл. Грузится хелловорлд бутстрапом, и поэтому - на сколько я понимаю бутстрап - UART и SDRAM проинициализированы и готовы к использованию. Код запускается, потому что если вывести только первый символ строки, он всё же выводится, а вот с циклом где-то ошибка закралась. Я бы привёл здесь листинг, но не хочу загружать вас своим кодом.
Вопрос, собственно говоря, у меня такой - какие возможности для низкоуровневой отладки проще всего использовать новичку? Как я понял, у AT91SAM9260 есть внутрисхемный эмулятор (ICE), работа с которым возможна через интерфейс JTAG (сам JTAG адаптер у меня есть). Так же непонятно, как быть с софтом. ОС (Windows или Linux) для меня большого значения не имеет. Слышал такие слова как Keil uVision, ARM DS-5, IAR, но не знаю, подойдут ли они мне для изучения ARM или это всё равно, что стрелять из пушки по воробьям... В то же время тратить большие деньги за профессиональный софт пока не охота (но если этот софт даёт существенные выгоды, то это другое дело). Может быть мне будет проще скачать какой-нибудь опенсорс симулятор арма и отладить хеловорлд на нём? С другой стороны очень хотелось бы научиться отлаживать на живом железе.
вполне можно выложить исходник в прикрепленных файлах или куда-нить в public place и дать ссылку на него. дабы знающие люди возможно подсказали бы возможные ошибки в сорце..
а если убрать цикл и попробовать вывести 2+ символа линейно?
может прерывание после отправки не отрабатывает, может флаг не тот поллится..
сам практически не касался, в памяти вертится нечто GDB под линукс - где-то на форуме обсуждалось..
В аттачменте архив с 2 файлами: для векторов исключений и вывода строки. Только теперь вообше ничего не выводится, видимо выводилось в предыдуших версиях. Прерывания я не использую, а просто опрашиваю флаг готовности в регистре статуса, и как только флаг становится в "1", записываю очередной байт в регистр для передачи. По крайней мере, именно так работает отладочный вывод в бутстрапе. ГДБ мне тут, к сожалению, не поможет, т.к. некому его прочитать, запустить и обеспечить, у меня схема простая: РОМБут -> Бутстрап -> приложение.
П.С. Такое впечатление, что где-то очень глупая ошибка, но я ее не вижу.
Скорей всего адрес линкера относительно которого он считает все метки и адрес по которому загружается бинарь из бутсрапа не совпадают.
Потом если уж пишете на ассемблере - пишите оптимальный код, зачем вот это ?
do_pr: ldrb r1, [r2]
..........
add r2, r2, #1
это делается одной командой
ldrb r1, [r2, #1]!
Вот такие замысловатые конструкции нисколько не читаемы
tst r1, #0xFF
beq halt
Неужели нельзя номальо написать
cmp r1, #0
beq halt
На экране выводится "l����" Адресацию в лдрб, как я понял, подглядев в "АРМ Сустем Девелоперс Гуиде" надо делать именно так, как я сейчас написал, т.е. режим постиндекс. Но проблема действительно в адресации, где-то я туплю. Ведь вряд ли надо в моем случае прибегать к линкер-скрипту с указанием карты памяти... так что пока думаю дальше... Сейчас видимо придется сделать без цикла...
То что проблема с адрсами понятно :) чем вы вообще пользуетесь каким компилятором и как собираете бинарник ? там же абсолютный адрес у строки, тоесть если при сборке линкер его относительно 0х0 вычислит значит и загружать программу нужно по нулевому адресу, в gas (вернее в ld) это указывается например так -Ttext=0x20000000 - это если загружать в sdram в самое начало. sram по адресу 0х0 - там все стеки код бутсрапа, тоесть вам нужно в любом случае ориентироваться на sdram и сообщить линкеру базовый адрес, по этому же адресу и загружать потом бинарь.