Программирование голого металла - PullRequest
29 голосов
/ 29 июля 2011

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

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

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

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

С наилучшими пожеланиями

Мистер Гигу

Ответы [ 2 ]

41 голосов
/ 29 июля 2011

Абсолютно без проблем ...

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

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

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

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

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

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

Один порт RS232 предоставляется на BeagleBoard и обеспечивает доступ к 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 подошел и инициализировал последовательный порт, который нам не понадобился, просто вставьте байты в четверть. но быстро вы переполните память thr и потеряете байты, поэтому вам нужно прочитать trm для omap и найти какой-то бит, который указывает, что передатчик пуст, он передал все, а затем создать функцию типа uart_send, которая опрашивает передатчик пуст, затем отправляет один байт.

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

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

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

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

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

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

4 голосов
/ 03 августа 2013

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

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

...