Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Программируем Raspberry Pi на голом железе

Anna | 24.06.2014 | нет комментариев

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

В чем подвох?

На 1-й взор задача кажется банальной: скачиваем keil, создаем проект… Но все не так легко. Все среды программирования(keil, IAR, Atolic) поддерживают максимум ARM9.У нас же ARM11. Это связано с негласным правилом, что на голом железе пишут до ARM9, а позже на Линуксе. Но все-таки есть одна уловка: arm-none-eabi-gcc поддерживает всякий ARM.
Вторая задача заключается в том, что под данный процессор(BCM2835) нет никаких конфигурационных файлов, header’ов и т.д. Тут нам на поддержка придет загрузчик Raspberry Pi. И ничего, что он пропритетарный. Он исполняет две функции: инициализирует процессор и его периферию, а также передает управление ядру kernel.img. Мы легко замаскируем свою программу под ядро и загрузчик её запустит.

Что нам потребуется?

1) Сама Raspberry Pi, карта памяти к ней и питание.
2) Даташит на процессор
3) Компьютер с установленным Linux (но может быть дозволено и на Винде. Не знаю, не пробовал).
4) Кросскомпилятор, установленный на компьютере из пункта 2. Я использую arm-none-eabi-gcc
5) Содержимое этой папочки.

Приготовления.

Нам необходимо отформатировать карту памяти в FAT16 и закинуть на нее содержимое этой папки. Это загрузчик плюс ядро. После этого удаляем оттуда файлы kernel.img и kernel_emergency.img. Это ядро Linux, а оно нам не необходимо.

Первая программа.

Сейчас мы можем приступить к написанию первой программы. Создаем файл main.c и пишем дальнейший код

int main (void)
{
while(1)
{
}
}
void exit (void)
{
while(1)
{
}
}

Как видите, эта программа ничего не делает. Функция exit для чего-то необходима компилятору.
Сейчас соберем её.

arm-none-eabi-gcc -O2 -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -nostartfiles main.c -o kernel.elf
arm-none-eabi-objcopy kernel.elf -O binary kernel.img

Полученный файл kernel.img кидаем на карту памяти. Готово!

GPIO

Вряд ли Вас устроит программа, которая не будет делать безусловно ничего. Теперь испробуем зажечь лампу.
Для начала объявим адрес, по которому лежит GPIO( это дозволено прочитать в даташите).

#define GPIO_BASE 0x20200000UL

И объявим переменную, которая определяют, что порт настроен на выход (GPIO_GPFSEL1) и переменную, подающую низкий ярус(то есть лампа горит) на порт (GPIO_GPCLR0).

#define GPIO_GPFSEL1 1
#define GPIO_GPCLR0 10

Ну и наконец модифицируем основную функцию для зажигания лампы:

volatile unsigned int* gpio;
int main(void)
{
gpio = (unsigned int*)GPIO_BASE;
gpio[GPIO_GPFSEL1] |= (1 << 16);
gpio[GPIO_GPCLR0] = (1 << 16);
while(1)
{

}
}

Собираем, прошиваем и радуемся.

В дальнейшей части испробуем поиграться с таймерами и прерываниями.

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB