Помогите разобраться с загрузочными векторами at91sam9260.
Предыстория
В программировании микроконтроллеров у меня крошечный опыт - на третьем курсе программировали микропроцессорный комплект К580, но в программировании вообще, в том числе и на ассемблере, опыт большой.
Передо мной стоит задача создать анализатор акустического спектра на этой плате (дипломная работа).
Работаю в IAR на ассеблере, зашиваю самбой.
Для начала решил просто зажеч СИД, чтобы разобраться в принципах работы данного микроконтроллера.
СИД подключен к PIN_27 (PB18).
Вручную в самбе записав число 0х40000 поочереди в ячейки 0xFFFFF600, 0xFFFFF610 и 0xFFFFF634 он загорается.
Но мне то надо чтобы это делала программа. Соответственно написал ее:
PUBLIC __vector
PUBLIC __iar_program_start
SECTION .intvec : CODE
ARM
__vector:
DCD __iar_program_start
B .
B .
B .
B .
DCD 0x38 ; Размер в листинге указан 56 байт
B .
B .
__iar_program_start:
SECTION .text : CODE
ARM
main
LDR R0, =0xFFFFF600
LDR R1, =0x40000
STR R1, [R0, #0x0]
STR R1, [R0, #0x10]
STR R1, [R0, #0x34]
END
Компиляция для моего ядра проходит успешно, создается HEX файл:
Его я конвертирую в BIN, который зашиваю самбой в DataFlash скриптом "SendFile" после "Enable_CS0".
Естественно диод не загорается.
А теперь собственно суть вопроса: я надеюсь что сама программа после main верна, остается грешить только на таблицу векторов прерываний. Про них нигде ничего не написано, в даташите на контроллер сказано, что по ним ориентуриется заводской загрузчик и что менять шестой вектор, содержащий размер исполняемой программы, про остальные ни слова. В моей проге блок этих векторов _vector: взят из примера в IAR.
Прошу Вас товарищи, обьясните за что отвечают эти векторы, как правильно их программировать, какие значения в них надо записывать, как определять эти значения.
И еще, есть ли разница с какого адреса ничинается сама программа, должна ли она начинаться сразу после векторов, или с любого адреса (как у меня в НЕХ, она нчаинается с 0х80, а команда "DCD __iar_program_start" записывает по адресу 0x0 значение 0х20)? Если с любого, то в каком векторе процессор определяет начальный адрес программы. И как правильно определить размер программы, считать его вместе с векторами, или с байта после них, или непосредственно с начала программы?
И последнее, нигде нормально не написано что такое REMAP, зачем он нужен и как им пользоваться.
Обьясните пожалуйста поподробнее, иначе я пропал. Тему диплома менять поздно.
Заранее премного благодарен.
Сразу оговорюсь что с iar не работал и не собираюсь.
Во первых это не вектора прерываний а вектора исключений, написано про них буквально во всех примерах от атмел.
Размер бинарника в байтах, в любом фаломенеджере посмотрите сколько он на диске занимает. Ну и прежде чем ножками дрыгать очевидно нужно настроить контроллер GPIO. В общем зайдите на сайт атмел и скачайте примеры для платы - там все разжевано.
я в иаре не работал и надеюсь не придется :)
- посмотрите или покажите листинг того что генерит ваш компилятор - я попробовал подсунуть ИДЕ ваш hex-файл - ничего осмысленного там не увидел.. может оно.. того.. не генерит ничего из кода кроме таблицы векторов
- проверьте, может чего не хватает при вашей настройке пина
в сях это выглядит примерно так:
- еще неплохо в конце программы ставить банальный "loop" что-бы после исполнения программа не "улетала" хрен-знает-куда, а мирно крутила пустой цикл :)
Зажигаю нулем
Повторюсь, что вручную это делается элементарно, без инициализации всяких там Clock, Watchdog, Power controller.
Тупо вписывал 0х40000 по адресам: 0хFFFFF600
0xFFFFF610
0xFFFFF634
А как я понимаю из последнего рисунка, то обсуждаемые векторы это типа ссылки на обработчики своих исключеий, так? Но если так, то все равно не понятно с начальным адресом программы
Что значит "вручную" ? Просто sam-ba инициализирует их за вас. Повторюсь - чтобы что-то заработало, скачайте примеры с сайта атмел, там есть и для iar, bootstrap тот же.