Содержание


Устанавливаем пакет инструментов GNU ARM под Linux

Инструменты разработки встроенных систем для популярного процессора

Comments

Если вы интересуетесь разработкой встроенных систем для популярного микропроцессора, вам стоит познакомиться с архитектурой Advanced RISC Machines (ARM). Эта статья поможет вам сделать первые шаги к пониманию процесса программирования встроенных систем, познакомив с широко используемым пакетом инструментов GNU ARM.

Семейство процессоров ARM

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

Ядро ARM развивается на протяжении 20 лет, в течение которых было выпущено несколько поколений процессоров. Последние из них – процессоры вида «системы на кристалле» (system on a chip или SoC), - работают на таких мобильных устройствах, как G1 Android от T-Mobile, и имеют по два ядра (ARM9 и ARM11), что позволяет улучшить производительность мультимедийных приложений на платформах с малыми ресурсами электропитания.

Последние версии процессоров ARM поддерживают два режима работы: режим ARM, в котором ядро выполняет 32-разрядные инструкции и режим THUMB, в котором выполняются 16-разрядные инструкции. Режим ARM позволяет задействовать всю мощь процессора, тогда как режим THUMB дает возможность писать определенные части программы, придерживаясь жестких ограничений, позволяющих экономить память. Переключение между режимами выполняется очень просто, что позволяет существенно уменьшить размер необходимого кода для множества алгоритмов.

Хорошая производительность процессоров ARM достигается благодаря использованию модифицированной гарвардской архитектуры. В этой архитектуре процессор использует отдельные кэши данных и инструкций, которые, однако, находятся на одной шине и одновременно очищаются при доступе к внешней памяти. Кроме того, инструкции размещаются в пятиступенчатом «конвейере». Таким образом, процессор осуществляет параллельную обработку последних пяти инструкций, помещенных в конвейер: каждое из пяти отдельных действий (чтение, декодирование, арифметико-логические операции, чтение памяти и запись), составляющих инструкцию, выполняется параллельно с другими. Таким образом, в случае непрерывного потока выполнения код выполняется быстро благодаря параллелизму, однако если после инструкции ветвления программе будет нужно выполнить код, находящийся вне конвейера, происходит очистка содержимого всего конвейера, ухудшающая производительность. Отсюда мораль: следует аккуратно проектировать код, используя инструкции ветвления в минимальном количестве.

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

Пакет инструментов GNU ARM

Большая часть программирования для ARM-систем ведется на рабочих станциях с процессорами, отличными от ARM, с помощью инструментов, выполняющих кросс-компиляцию для платформы ARM. Одной из таких сред разработки является пакет инструментов GNU ARM, позволяющий использовать привычные среду и инструменты вашей рабочей станции для проектирования, разработки и даже тестирования приложений на ARM-симуляторах.

Описываемый в этой статье пакет инструментов GNU, также известный как Sourcery G++ Lite, размещен на сайте группы CodeSourcery (см. ссылку в разделе Ресурсы) и доступен для бесплатной загрузки и использования. Все инструменты, за исключением библиотеки GNU C, распространяются под стандартной публичной лицензией GNU версии 3 (GPL3). Библиотека GNU C распространяется согласно лицензии GPL версии 2.1. В набор бинарных утилит этого пакета (binutils) входит набор компиляторов GNU (GCC), отладчик удаленного кода GNU (GDB), GNU make и базовые утилиты GNU.

Также в пакет Sourcery G++ Lite включена подробная документация набора инструментов GNU, в том числе Стандарты Кодирования GNU — документ, достойный тщательного изучения! В документации по ассемблеру GNU, as,, вы найдете множество информации, специфичной для платформы ARM: коды операций, синтаксис, директивы и так далее.

Загрузка и установка пакета инструментов GNU

Чтобы скачать набор инструментов GNU, посетите страницу загрузки сайта CodeSourcery (см. ссылку в разделе Ресурсы) и выберите там TAR-файл для IA32 GNU/Linux:

arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

Различные версии пакета инструментов GNU доступны для всех распространенных клиентских операционных систем, однако мы в этой статье рассмотрим установку и использование версии Lite в системе Linux®.

За время развития проекта ARM было разработано несколько поколений процессоров. Поэтому пакет Lite включает в себя различные C-библиотеки для трех наиболее распространенных версий архитектуры процессора - ARM v4T, ARM v5T и ARM 7.

Теперь с помощью команды bunzip2 распакуйте архив в свою домашнюю директорию.

Листинг 1. Извлечение пакета инструментов GNU из загруженного архива.
$ bunzip2 arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar -xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
  .
  .
  .
  (Здесь выводятся имена файлов по мере их извлечения из архива.)
  .
  .
  .
$

Теперь остается только добавить в переменную среды PATH путь к директории bin пакета, после чего инструменты можно использовать.

Настройка Linux для использования пакета инструментов GNU

На web-странице загрузки пакета вы обнаружите несколько полезных файлов документации в формате PDF, в том числе детальное руководство по началу работы с пакетом. Инструкции в этой статье являются его краткой версией, призванной помочь вам быстро настроить и запустить пакет.

Если вы занимаетесь программированием для архитектуры ARM гораздо больше, чем для архитектуры Intel®, в качестве альтернативы можно добавить в директорию /usr/local/bin символические ссылки, указывающие на директорию с бинарными файлами пакета. Тогда вы сможете использовать укороченную форму запуска команд, например as вместо arm-none-linux-gnueabi-as. В листинге 2 показано, как создавать подобные символические ссылки.

Листинг 2. Создание символических ссылок для инструментов ARM
# cd /usr/local/bin
# which arm-none-linux-gnueabi-as
/home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ln -s /home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as as
# ls -l as
lrwxrwxrwx 1 bzimmerly bzimmerly 76 2009-03-13 02:48 as -> /home/bzimmerly
/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ./as --version
GNU assembler (Sourcery G++ Lite 2008q1-126) 2.18.50.20080215
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-linux-gnueabi'.
#

Сначала, используя команду which, мы определили полный путь команды, чтобы его было легче скопировать и вставить в команду ln. Затем с помощью команды ln -s мы создали символическую ссылку. После этого, чтобы убедиться, что ссылка успешно создана, мы просмотрели информацию о ней с помощью ls, а потом запустили ее. Создав простые символические ссылки на все инструменты из директории с бинарными файлами пакета, вы избавите себя от необходимости вводить длинные имена с клавиатуры. Ведь определенно гораздо проще набирать as, а не arm-none-linux-gnueabi-as каждый раз, когда вы запускаете ассемблер!

Пишем программу для архитектуры ARM

Есть множество руководств по созданию ARM программ на вечно популярном языке программирования C, однако по программированию на чистом ассемблере руководств гораздо меньше. Я собираюсь сломать эту традицию и приведу здесь пример написания программы на чистом ассемблере, - того, что обычно считается черной магией программирования. Это простая программа из разряда “Hello World”, но специально написанная для конкретной версии ARM Linux.

Программа-пример, приведенная в этой статье, рассчитана на запуск на мобильном телефоне T-Mobile G1, работающем на платформе Android Linux. Она написана таким образом, что также может работать на любой другой Linux-системе, основанной на ARM (поскольку выполняет только стандартные системные вызовы). Однако, для того, чтобы работать с используемым здесь новым интерфейсом системных вызовов ядра EABI (Embedded Application Binary Interface – двоичный интерфейс для встроенных приложений), вам необходимо использовать версию ядра Linux не ниже 2.6.16.

Замечание: В разделе Ресурсы можно найти ссылку на статью с сайта Embedded.com, в которой рассказывается об ARM-программировании не для системы Linux, а непосредственно для «железа».

Теперь, используя код, приведенный в листинге 3, создайте в вашем любимом текстовом редакторе скрипт с названием build. Этот скрипт сначала запускает ассемблер GNU ARM, а затем компоновщик. При создании этой программы я старался получить исполняемый файл как можно меньшего размера, поэтому отключил вывод всей отладочной информации с помощью параметра компоновщика --strip-all. После создания скрипта сделайте его исполняемым командой chmod +x build.

Листинг 3. Сборка приложения Hello World для ARM Linux
#!/bin/bash
echo Building the ARM Linux Hello World...
arm-none-linux-gnueabi-as -alh -o hw.o hw.S > hw.lst
arm-none-linux-gnueabi-ld --strip-all -o hw hw.o

После этого создайте модуль исходного кода hw.S и поместите в него код, приведенный в листинге 4.

Листинг 4. Приложение Hello World для ARM Linux
@filename: hw.S

.text
.align 2
.global _start

@ ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
@         r7                 r0      r1                r2

_start:
    adr     r1, msg         @ адрес
    mov     r0, #1          @ STDOUT
    mov     r2, #16         @ длина
    mov     r7, #4          @ sys_write
    svc     0x00000000

@ int sys_exit(int status)
@     r7       r0

    mov     r0, #0          @ Код возврата
    mov     r7, #1          @ sys_exit
    svc     0x00000000

.align 2

msg:
    .asciz "Hello Android!\n\n"

В ассемблере GNU символ "at" (@) обозначает начало комментария. Ассемблер игнорирует все, что следует после символа @ до конца строки.

В программе используются два стандартных системных вызова Linux – sys_write и sys_exit. Перед кодом на ассемблере в комментариях приводится его эквивалент, написанный на C. Это позволяет показать, как регистры ARM отображаются в параметры выполняемых системных вызовов. Запомните, что параметры перечисляются слева направо, от r0 до r6. В регистре r7 помещается номер используемого системного вызова.

Инструкция svc 0x00000000 командует процессору ARM вызвать «супервизор», которым в данном случае является ядро Linux.

Тестирование программы для ARM

В пакете Sourcery G++ Lite для отладки низкоуровневых программ предоставляется не теряющий популярности отладчик GDB. Этот отладчик позволяет (помимо прочего) удаленно отлаживать ARM-код, выполняющийся на одноплатном компьютере с подсоединенным к нему модулем JTAG или ICE.

Если вы хотите протестировать код так, как это сделал я – на системе Android Linux, запущенной на мобильном телефоне, - сначала вам нужно подключить телефон к рабочему компьютеру поставляемым вместе с телефоном USB-кабелем, а затем, используя команду adb push из набора инструментов разработки (SDK) для Android, скопировать программу на телефон. После этого на телефоне переместитесь в директорию, содержащую исполняемые файлы (/data/local/bin) и командой chmod 555 hw сделайте файл программы выполняемым. (Команда chmod на Android не позволяет в таких случаях использовать параметр +x, поэтому приходится передавать 555.)

Наконец, используя команду adb shell, соединитесь с телефоном, переместитесь с помощью cd в нужную директорию и запустите программу: ./hw. Если все пойдет правильно, то программа, как на моем телефоне, выведет на экран приветствие "Hello Android!".

Заключение

Если это небольшое введение в программирование на ассемблере для ARM вас заинтересовало, то по ссылкам в разделе Ресурсы вы можете более подробно познакомиться с архитектурой этого процессора. Наилучшим ресурсом для глубокого изучения ядра ARM является справочное руководство по архитектуре ARM (ARM Architecture ReferenceManual. или ARM ARM,) – библия разработки для процессоров ARM.

Тем, кто строит карьерные планы, я предлагаю подумать о следующем: сегодня в мире миллионы мобильных телефонов, и с каждым годом их количество увеличивается. Прогресс дошел до такого состояния, что мы можем носить в своем кармане машину с двухъядерным процессором, устройством хранения данных емкостью несколько гигабайт и полноценными сетевыми возможностями, обеспечивающими моментальный доступ к информации и развлечениям через Интернет. Со стороны производителей мобильных телефонов существует большой спрос на талантливых программистов. При такой распространенности процессоров ARM у вас всегда будет много работы, причем интересной! Как всегда, играйте с инструментами и получайте удовольствие от работы, которую вы делаете. Программирование – это отчасти искусство, отчасти наука, и, возможно, одна из самых приятных технических профессий.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=620432
ArticleTitle=Устанавливаем пакет инструментов GNU ARM под Linux
publish-date=02012011