Программирование на голом железе на Beagleboard

Я только что получил свой BeagleBoard-Xm, и мне интересно, есть ли какие-нибудь подробные пошаговые руководства о том, как получить очень простое программное обеспечение для работы на голом железе на оборудовании?

Причина, по которой я спрашиваю, заключается в том, что я хочу глубоко понять, как работает аппаратная архитектура, все, от загрузчика, компоновщиков, прерываний, исключений, MMU и т. Д. Я подумал, что лучший способ - получить простую программу hello world для выполнения на beagleboard xm без ОС. Ничего особенного, просто запустите доску и получите сообщение "hello world" на экране. это оно!

Следующим шагом будет запуск крошечной ОС, которая может планировать некоторые очень простые задачи. Файловая система не нужна, просто чтобы понять основы ОС.

Любая помощь приветствуется!

С уважением

Г-н Гигу


person MrGigu    schedule 29.07.2011    source источник


Ответы (2)


Абсолютно никаких проблем ...

Прежде всего, запустите и запустите последовательный порт, у меня есть одна из более старых / более ранних версий beagleboards, и я помню, что последовательный порт и почти все о том, что ввод-вывод был болезненным, тем не менее, установите на нем последовательный порт, чтобы вы могли видеть, как он загружается.

Я думаю, он загружает uboot, и вы можете нажать клавишу или esc или что-то в этом роде, чтобы прервать обычную загрузку (в Linux). Из приглашения uboot легко загрузить ваши первые простые программы.

На данный момент у меня под рукой есть код биглборда, но у меня нет под рукой самого биглборда, чтобы попробовать их. Итак, перейдите на http://sam7stuff.blogspot.com/, чтобы получить представление о том, как смешать некоторый стартовый ассемблер и код C для встроенных программ без ОС (для arm у меня есть несколько примеров для других платформ thumb / cortex-m3, но они загружаются немного по-другому).

Порты sam7 для вещей и адресного пространства памяти полностью отличаются от beagleboard / omap. Вышеупомянутая структура, которую вы можете изменить или заново изобрести.

Вам понадобится техническое справочное руководство OMAP 35x с сайта ti.com. Найдите часть omap на их сайте OMAP3530.

Также документация beagleboard. Например, это утверждение:

На BeagleBoard имеется один порт RS232, обеспечивающий доступ к линиям TX и RX UART3.

Таким образом, в trm для omap поиск UART3 показывает, что он находится по базовому адресу 0x49020000. (часто бывает очень сложно вычислить весь адрес для чего-либо, поскольку в руководствах обычно есть часть карты памяти здесь, а другая часть там, а рядом с описанием регистров вызываются только несколько младших битов адреса.)

Глядя на регистры uart, THR_REG - это то место, куда вы пишете байты для отправки uart, обратите внимание, что это 16-битный регистр.

Зная это, мы можем составить первую программу:

.globl _start
_start:
    ldr r0,=0x49020000
    mov r1,#0x55
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
hang: b hang

Вот make-файл для него:

ARMGNU = arm-none-linux-gnueabi

AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

uarttest.bin : uarttest.s
    $(ARMGNU)-as $(AOPS) uarttest.s -o uarttest.o
    $(ARMGNU)-ld -T rammap uarttest.o -o uarttest.elf
    $(ARMGNU)-objdump -D uarttest.elf > uarttest.list
    $(ARMGNU)-objcopy uarttest.elf -O srec uarttest.srec
    $(ARMGNU)-objcopy uarttest.elf -O binary uarttest.bin

И используемый скрипт компоновщика:

/* rammap */
MEMORY
{
    ram : ORIGIN = 0x80300000, LENGTH = 0x10000
}

SECTIONS
{
    .text : { *(.text*) } > ram
}

Обратите внимание, что вызывается версия linux из codeourcery, вам не нужна эта версия кросс-компилятора GNU, на самом деле этот код, являющийся asm, требует только ассемблера и компоновщика (материал binutils). Кросс-компилятор типа arm-none-eabi -... также будет работать (при условии, что вы получаете облегченные инструменты из codeourcery).

Если у вас есть файл .bin, посмотрите справку по uboot, я не помню точную команду, но, вероятно, это l 0x80300000 или load_xmodem или что-то в этом роде. В основном вы хотите, чтобы x, y или z модемировали файл .bin через последовательный порт в пространство памяти для процессора, а затем с помощью команды go или любой другой команды сообщали uboot о переходе к вашей программе.

Вы должны увидеть несколько символов U (0x55 - «U»), выходящих из последовательного порта при запуске.

Ваша главная цель - создать простую процедуру последовательного порта, чтобы вы могли распечатывать данные для отладки и иным образом видеть, что делают ваши программы. Позже вы сможете заняться графикой и т. Д., Но сначала используйте последовательный порт.

Происходил какой-то обман. Так как uboot подошел и инициализировал последовательный порт, нам не пришлось, просто засунуть байты в th. но быстро вы переполните хранилище thr и потеряете байты, поэтому вам нужно будет прочитать trm для omap и найти какой-то бит, который указывает, что передатчик пуст, он все передал, а затем создать функцию типа uart_send, которая опрашивает передатчик пустой, затем отправляет один байт.

также забудьте о printf (), вам нужно создать свой собственный номер для печати (восьмеричный или шестнадцатеричный - самые простые) и, возможно, строку для печати. Я делаю такую ​​работу весь день и всю ночь, и в 99% случаев все, что я использую, - это небольшая процедура, которая выводит 32-битные шестнадцатеричные числа из uart. по номерам я могу отлаживать и видеть статус программ.

Итак, возьмите модель sam7 или что-то в этом роде (обратите внимание, что параметры командной строки компилятора и компоновщика важны, как и порядок файлов в командной строке ссылки, первый файл должен быть вашей точкой входа, если вы хотите получить первую инструкцию / слово в файле .bin будет вашей точкой входа, что обычно является хорошей идеей, поскольку в будущем вы захотите узнать, как управлять этим для загрузки из ROM).

Вероятно, вы можете немного обойтись без удаления или замены uboot, если вы начнете смотреть на команды загрузки на основе Linux для uboot, вы увидите, что он копирует то, что в значительной степени является файлом .bin из флэш-памяти или где-то в место в оперативной памяти , затем переходя к нему. Теперь, переходя на linux, esp arm linux включает в себя несколько таблиц arm и возможную настройку некоторых регистров, где ваши программы не хотят или не нуждаются в этом. в основном, какую бы команду вы ни выбрали для использования после того, как вы скопировали свою программу в RAM, вы будете использовать скрипт в загрузочном скрипте для uboot, если вы решите, что плата загружается и запускается, как это происходит с Linux.

Говоря, что вы можете использовать jtag и не полагаться на uboot для работы, когда вы идете по этому пути, хотя, вероятно, есть определенное количество вещей, которые вам нужно сделать при загрузке, чтобы запустить и запустить чип, в частности, настройка uart, вероятно, будет где-то несколько делителей тактовой частоты, включение тактовой частоты, включение ввода-вывода и тому подобное. Вот почему пример sam7 начинается с мигания светодиода вместо элемента uart. Amotek jtag-tiny - хороший jtag wiggler, я был очень доволен, использую их весь день каждый день на работе. Beagleboard, вероятно, использует распиновку TI, а не стандартную распиновку ARM, поэтому вам, вероятно, придется изменить кабели. И я не знаю, дает ли OMAP вам прямой доступ к контроллеру касания руки или вам нужно сделать что-то конкретное. Вам лучше пока просто пойти по маршруту uboot.

Когда у вас есть фреймворк, в котором у вас есть небольшое количество asm для настройки стека и перехода к вашему коду C точки входа, вы можете начать превращать этот код C в ОС или делать все, что захотите. Если вы посмотрите на chibios, prex или другие подобные, вы обнаружите, что у них есть небольшой загрузочный код asm, который вводит их в свою систему. Точно так же там есть отладочные и неотладочные процедуры uart. Многие rtoses захотят использовать прерывания, а не опрашивать, чтобы thr оставался пустым.

Если этот пост не поможет вам начать работу со своим приветственным миром (позволяя вам выполнить часть работы), дайте мне знать, и я откопаю свой биглборд и создам полный пример. Моя доска не совсем совпадает с вашей, но что касается hello world, она должна быть достаточно близкой.

person old_timer    schedule 29.07.2011
comment
Вау, это отличный материал! Спасибо, что уделили мне время, очень признательны! Как только я закончу свою диссертацию, я начну копаться в этом и постараюсь заставить его работать! Может мне стоит купить Jtag для отладки моего биглборда! Спасибо еще раз! - person MrGigu; 01.08.2011
comment
Наконец-то я нашел время поиграть с доской, и она заработала! Теперь я могу вывести текст на консоль :) Кто-то, кто также использовал этот пост как ссылку на свой учебник по голому железу, подумал, что вы хотели бы знать! wiki.osdev.org/Beagleboard. Еще раз спасибо - person MrGigu; 02.11.2011
comment
@dwelch, чувак, ты повсюду в мире встроенных систем. еще раз удивительный материал. к настоящему времени, если я увижу хороший ответ / статью, я могу догадаться, что это вы. - person deepak; 20.05.2013
comment
@dwelch Верно. Есть еще пара человек, которые ответили на удивительные вопросы, но в большинстве случаев ответы или статьи, которые я запрашивал или использовал, были написаны вами. Удивительное репо на github! Вы, наверное, уже в двенадцатый раз оказали мне большую помощь. Еще раз спасибо за этот замечательный ответ. - person deepak; 26.05.2013
comment
У меня есть общие сомнения в многоядерном программировании. Насколько я понимаю, двухъядерный процессор ARM имеет 2 счетчика программ. В этом случае с использованием сборки, как я могу получить доступ к этим двум счетчикам программ? - person robomon; 20.08.2015

Вы также можете попробовать TI StarterWare:

http://www.ti.com/tool/starterware-sitara

person dhanushka    schedule 03.08.2013