Arm – это просто (часть 2)

Миро Самек. Построение простых систем на ARM-контроллерах с использованием инструментов GNU (перевод)

Часть 3

В этой части описывается управляющий файл компоновщика GNU для простого (bare-metal) проекта на процессоре ARM. Рекомендуется прочесть “Embedded System Design on a Shoestring” by Lewin Edwards [1], а именно третью главу “Ld – GNU Linker”.

3.1 Управляющий файл компоновщика

Имена секций и специальные символы управляющего файла компоновщика должны соответствовать стартовому коду, описанному в части 2 “2.1 Стартовый код”. Управляющий файл не может быть универсальным, так как в нём объявляется конкретная карта распределения памяти целевого кристалла с учётом требований приложения.

Управляющий файл компоновщика, упоминаемый здесь как “blinky.ld”, соответствует примеру “Blinky”, мигающему четырьмя светодиодами отладочной платы AT91SAM7S-EK. Версия для языка “Си” располагается в каталоге “c_blinky”, а для языка C++ – в каталоге “cpp_blinky”.

Листинг 3.1 Управляющий файл компоновщика для учебного проекта “Blinky” (AT91SAM7S64)

(1) OUTPUT_FORMAT(“elf32-littlearm”, “elf32-bigarm”, “elf32-littlearm”)
(2) OUTPUT_ARCH(arm)
(3) ENTRY(_vectors) (4) MEMORY { /* memory map of AT91SAM7S64 */
(5) ROM (rx) : ORIGIN = 0x00100000, LENGTH = 64k
(6) RAM (rwx) : ORIGIN = 0x00200000, LENGTH = 16k } /* The sizes of the stacks used by the application. */
(7) C_STACK_SIZE = 512; IRQ_STACK_SIZE = 0; FIQ_STACK_SIZE = 0; SVC_STACK_SIZE = 0; ABT_STACK_SIZE = 0; UND_STACK_SIZE = 0; /* The size of the heap used by the application. */ HEAP_SIZE = 0; (8) SECTIONS {
(9) .reset : { /* startup code (ARM vectors and reset handler) */
(10) *startup.o (.text)
(11) . = ALIGN(0x4);
(12) } >ROM (13) .ramvect : { /* used for vectors remapped to RAM */ __ram_start = .;
(14) . = 0x40;
(15) } >RAM (16) .fastcode : {
(17) __fastcode_load = LOADADDR (.fastcode);
(18) __fastcode_start = .; (19) *(.glue_7t) *(.glue_7) *isr.o (.text.*)
(20) *(.text.fastcode)
(21) *(.text.Blinky_dispatch)
(22) /* add other modules here … */ . = ALIGN (4); __fastcode_end = .;
(23) } >RAM AT>ROM (24) .text : { . = ALIGN(4); *(.text) /* code) */ *(.text*) /* code) */
(27) *(.rodata) /* constants, strings, etc. */ *(.rodata*) /* constants, strings, etc. */
(25) *(.glue_7) /* NOTE: placed already in .fastcode */ *(.glue_7t) /* NOTE: placed already in .fastcode */ KEEP (*(.init)) KEEP (*(.fini)) . = ALIGN(4); _etext = .; /* global symbol at end of code */
(28) } >ROM (26) .preinit_array : { … .init_array : { … .fini_array : { … } >ROM (30) .data : { __data_load = LOADADDR (.data); __data_start = .; *(.data) /* .data sections */ *(.data*) /* .data* sections */ . = ALIGN(4); _edata = .;
(31) } >RAM AT>ROM (32) .bss : { __bss_start__ = . ; *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); _ebss = .; /* define a global symbol at bss end */ __bss_end__ = .;
(33) } >RAM (37) PROVIDE ( end = _ebss ); PROVIDE ( _end = _ebss ); PROVIDE ( __end__ = _ebss ); .heap : { __heap_start__ = . ; . = . + HEAP_SIZE; . = ALIGN(4); __heap_end__ = . ; } >RAM (34) .stack : { __stack_start__ = . ; . += IRQ_STACK_SIZE; . = ALIGN (4); __irq_stack_top__ = . ; . += FIQ_STACK_SIZE; … … . += C_STACK_SIZE; . = ALIGN (4);
(35) __c_stack_top__ = . ; __stack_end__ = .;
(36) } >RAM /* Remove information from the standard libraries */ /DISCARD/ : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) } }

Выше представлен управляющий файл компоновщика для примера “Blinky”. Небольшие отличия версий файла для “Си” и C++ будут объснены позднее. Ниже отмечаются основные особенности.

(1) Директива “OUTPUT_FORMAT” объявляет формат выходного файла (elf32, little-endian, ARM).

(2) Директива “OUTPUT_ARCH” объявляет архитектуру целевой машины.

(3) “ENTRY” указывает конкретную инструкцию [метку] с которой начинается исполняемый код программы.

(4) “MEMORY” описывает размер и расположение блоков памяти целевого контроллера.

(5) Область “ROM” соответствует флэш-памяти кристалла AT91SAM7S64. Она может включать секции “только для чтения” и исполняемые секции (rx), начинается с адреса 0x00100000 и имеет размер 64KB.

(6) Область “RAM” соответствует статической памяти кристалла AT91SAM7S64. Она может включать секции “только для чтения”, секции для “чтения-записи” и исполняемые секции (rwx), начинается по адресу 0x00200000 и имеет размер 16KB.

(7) Данные идентификаторы объявляют размеры стеков, которые следует подогнать под требования конкретного приложения. “C-stack” не может иметь нулевой размер.

(8) Команда “SECTIONS” предваряет объявление секций.

(9) Секция “.reset” содержит стартовый код (включая таблицу векторов ARM) и должна быть первой в программной памяти (области ROM).

(10) Данная строка относит к секции “.reset” содержимое всех секций “.text” из файла “startup.o”.

(11) Секция должна быть выровнена по границе слова (4 байта).

(12) Секция относится к области “ROM”, определённой командой “MEMORY”.

(13) Секция “.ramvect” содержит таблицу векторов в оперативной памяти и вторичную таблицу адресов переходов и должна быть первой в оперативной памяти (области RAM).

(14) Размер таблицы векторов и вторичнай таблицы адресов переходов известен – 0x40 байт. Данной инструкцией счётчик адресов секции увеличивается на 0x40 байт, резервируя место под таблицы.

(15) Секция “.ramvect” относится к области “RAM”, определённой командой “MEMORY”.

(16) Секция “.fastcode” предназначена для кода, исполняемого из оперативной памяти. Располагается он в программной памяти (“ROM”), откуда впоследствии копируется в оперативную память (“RAM”), где и исполняется.

(17) В секции “.fastcode” адрес расположения (load memory address – LMA) отличается от рабочего адреса (virtual memory address – VMA). Идентификатор “__fastcode_load” соответствует LMA в области “ROM” и требуется для стартового кода при копировании секции из программной памяти в оперативную.

(18) Идентификатор “__fastcode_start” соответствует рабочему адресу (VMA) секции “.fastcode” и нужен стартовому коду при копировании секции из программной памяти в оперативную [в данном примере секция “.fastcode” будет находиться в оперативной памяти сразу после обеих таблиц векторов].

(19) Секции “.glue_7t” и “.glue_7” автоматически создаются компилятором когда в коде объявляется переход между наборами машинных инструкций “ARM” и “THUMB”. Секции содержат декоративные вызовы между кодом “THUMB” и “ARM” и вызываются при каждом переключении между наборами инструкций. В большинстве случаев выгодно располагать эти маленькие участки “горячего” кода в оперативной памяти.

(20) Код конкретных C/C++ функций явным образом располагается в секции “.text.fastcode” с помощью директивы “__attribute__ ((section (“.text.fastcode”)))”.

(21) Компилятор GNU может располагать каждую функцию в индивидуальной кодовой секции с названием, получаемым добавлением имени функции к имени секции (требуется указать опцию компилятора “-ffunction-sections”). Это позволяет избирательно подходить к расположению кода каждой функции (расположить, например, “Blinky_dispatch()” в оперативной памяти).

Примечание. Компилятор C++ проводит декорирование имён (name-mangling) и для выяснения идентификатора, присвоенного конкретной функции, следует заглянуть в “map”-файл. (Скажем, метод “Blinky::shift()” располагается в секции “.text._ZN6Blinky5shiftEv”).

(22) Возможно, в процессе настройки понадобится переместить в оперативную память и другие функции.

(23) Рабочий адрес секции “.fastcode” находится в оперативной памяти, но размещается она в области “ROM”.

(24) Секция “.text” предназначена для кода и данных “только для чтения”, остающихся на своём месте (в области “ROM”). [адрес размещения (LMA) и рабочий адрес (VMA) совпадают]

(25) При повторном объявлении о размещении кода, уже упомянутого в другой секции (скажем, в “.fastcode”), первое [в порядке появления] объявление имеет преимущество. Но если впоследствии будет решено убрать объявление о размещении из первой секции (здесь – “.fastcode”), заработает второе объявление.

(26) Данные секции создаются компилятором GNU C++ и используются для статических конструкторов и деструкторов.

(27) Секция “.rodata” используется для констант (данных “только для чтения”) таких, как таблицы. Так же, как и для кода, для часто используемых констант можно выбирать расположение в оперативной памяти, помещая их в секцию “.fastcode”.

(28) Секция “.text” находится и загружается в область “ROM”.

(29) [отсутствует] Секция “.ARM.exidx” используется для обработки исключений языка C++ и показана здесь для полноты картины. Простые (Bare-metal) проекты не могут позволить себе избыточный код таких обработчиков.

(30) Секция “.data” содержит инициализированные данные.

(31) Секция “.data” должна находиться в оперативной памяти и копируется из области размещения в “ROM” по рабочему адресу на этапе начальной загрузки.

(32) Секция “.bss” содержит область неинициализированных данных. Стандарты C/C++ требуют, чтобы данная секция была обнулена перед использованием.

(33) Секция “.bss” размещается только в оперативной памяти.

(34) В секции “.stack” располагаются все стеки. На этапе начальной загрузки эта секция заполняется специальным значением.

(35) Инструменты GNU учитывают, что архитектура ARM использует модель стека, растущего к младшим адресам памяти. Поэтому файл компоновщика указывает только адреса верхушек стеков при их инициализации. “Си”-стек (он же стек SYS) располагается в конце секции “.stack”.

(36) Секция “.stack” размещается в оперативной памяти.

(37) Идентификаторы “_end”, “__end” и “end” используются для указания на начало динамической области памяти, если таковая используется.

(38) [отсутствует] Эта и последующие секции используются отладчиком и не загружаются в целевой контроллер.

Источник: http://embedders.org/blog/teap0t/miro-samek-postroenie-prostykh-sistem-na-arm-kontrollerakh-s-ispolzovaniem-gnu.html?page=0%2C3

Eclipse+AVR+ARM: первые шаги. Часть вторая

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

{ads1}

Откроем окно настроек Eclipse при помощи команды Windows – Preferences:

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

Во-первых, все диалоговые окна в Eclipse имеют изменяемые размеры, поэтому. Если что-то не вмещается в окне — просто растяните его мышью. Иногда при изменении размеров окна внутри него появляются скроллеры — это в том случае, если внутренняя область не может стать меньше, чем допустимо и перестает вмещаться в уменьшенном окне:

Это позволяет не терять функциональность на дисплеях с малым разрешением, хотя делает работу с диалогами и не очень комфортной — тут выбор сделан в пользу универсальности. На дисплее 1024х768 практически всегда можно растянуть любое окно до комфортного размера.

Во-вторых, почти каждое диалоговое окно имеет внутри себя четко различимые области, размер которых так же может меняться! Попробуйте «поерзать» мышкой по краям характерных областей (наверняка вы интуитивно догадаетесь, где надо искать нужное место) и, как только курсор примет соответствующий вид — растяните область мышкой:

На скриншоте я сделал не лучше, а хуже — просто чтобы продемонстрировать саму возможность менять размеры, как хочется.

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

В-третьих, в этом окне настроек, а так же в некоторых других окнах с большим количеством настраиваемых параметров, имеется возможность поиска нужной опции: обратили внимание на поле ввода текста для поика в верхней левой части окна? Если вы помните название нужной вам опции или хотя бы подозреваете, что в ее описании есть какое-то слово, попробуйте ввести его в этом поле — Eclipse тут же ограничит диапазон возможных мест поиска до приемлемого. Например, захотелось вам изменить цвет шрифта. Однозначно, надо искать слова Color и/или Font, попробуем:

По мере ввода текста сразу изменяется вид окна диалога, и к моменту завершения ввода ключевого слова оказывается, что нужный параметр мы уже нашли — остается только щелкнуть по нему! Правда, пока изменять цвет шрифта мы не станем, т. к. занимаемся только обзорным знакомством с системой настроек Eclipse.

{ads2}Да, кстати: в окошке поиска есть кнопочка с ластиком — нажав ее вы сотрете введенное и увидите изначальный ассортимент возможностей. Давайте кратко ознакомимся с основными группами опций.

General – самые глобальные настройки, наиболее общие для всей системы.

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

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

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

С/С++ – группа настроек плугина, отвечающего за поддержку программирвоания на указанных языках. Этот раздел так же впоследствии будет достаточно подробно изучен, так как без него — никуда.

Doxygen – настройки плагина поддержки системы самодокументирования программ. Кое-что об этой системе я уже писал, а об особенностях использования Doxygen в Eclipse я кратко расскажу позже.

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

Install/Update – настройки системы обновлений. По умолчанию активирована система автоматического поиска и установки обновлений, что, с моей точки зрения, явно лишнее — о том, как это отключить поговрим чуть позже.

Remote Systems – настройки удаленного доступа. К сожалению. Как говорится, я не копенгаген в этой теме — не пользовался сам и не очень понимаю, зачем оно нужно. Если кто-либо знает — буду рад дополнить свое повествование.

Run/Debug – настройки запуска и отладки программ. Раздел важный, будем знакомиться обязательно.

Tasks – задачи. Eclipse позволяет некоторым образом планировать работу, и задачи в этом способствуют. Например, если в комментарии к своей программе вы напишите TODO — это будет воспринято, как напоминание о том, что нужно сделать в будущем. Список таких напоминаний будет автоматически создан, и вы сможете в любой момент проконтролировать, не забыли ли вы чего-то…

Team – настройки группового режима работы над проектами. В частности, именно в этой категории настроек спрятаны возможности подключения к CVS или аналогичной системы контроля версий. Для индивидуального разработчика не очень актуальный режим, но многим будет несоменно полезным.

Usage Data Collector – разработчики Eclipse пошил по стопам всяких майкрософтов и тоже пытаются собирать сведения о том, какие модули Eclipse используются, часто ли сбоят и т. п. Короче говоря, вам будет предложено (рано или поздно) подключиться к этой системе сбора информации — я в этом никакого смысла не вижу и всегда отключаю эти функции.

Шаг 3.3: настройки комфортной работы

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

Начнем с отключения лишнего и бесполезного.

Отключаем систему сбора информации:

Снимаем галочку, разрешающую сбор информации — и на этом успокаиваемся.

Отключаем автоматические обновления:

Снова снимаем галочку, чтобы полностью отказаться от автоматики. Я рекомендую это сделать по следующим причинам:

  1. Поиск обновлений расходует трафик, причем иной раз заметно замедляя работу
  2. Внезапно выскакивающее окошко с предложением скачать и установить обновление отнюдь не способствует спокойной работе.
  3. Обновления не всегда оказываются полностью совместимыми с другими, не обновленными частыми системы, и согласившись на автоматическое обновление, вы рискуете посреди важной работы оказаться с неработающей IDE.

Раз в месяц совсем не трудно проверить обновления в ручном режиме при помощи команды меню Help – Check for Updates.

Отключаем проверку орфографии в текстах:

Снова снимаем галочку. Лично я не вижу смысла в том, чтобы Eclipse занимался проверкой орфографии, тем более что словари у него только для английского. Да и вообще, лишнее это в IDE программиста.

Теперь включим и настроем безусловно важное и полезное.

Начнем с категории General

Always run in background – рекомендую отметить эту опцию.

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

В принципе, если эта опция не активирована, и окошко все-таки появится, вы сможете перевести его в фоновый режим (на рисунке — окно проверки обновлений)

но сделав это заранее, вы избавите себя от лишних телодвижений в будущем.

Остальные опции этого раздела включать не стоит — никакой заметной пользы в работе они не дают.

Перейдем глубже по разделам категории General и откровем настройки редактора:

Рекомендую обратить внимание на опцию Allow in-place system editors.

Если она активирована, то файлы, которые Eclips сам не умеет редактировать, будут открываться при помощи системного редактора Windows, но открываться при этом внутри самого Eclipse – по технологии OLE.

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

В настройках текстового редактора рекомендую обратить внимание на следующие опции:

Displayed tab width – отображаемая ширина табуляции. Известно, что символ табуляции обычно заменяет собой 8 обычных сиволов. Так же принято оформлять программы отступами при помощи табулаций. И выходит.

Что многоуровневый код очень быстро «уходит за край» окна редактора, т. к. 8 символов для табуляции быстро «съедают» горизонтальное пространство.

Поэтому Eclipse по умолчанию предлагает изменить ширину табуляции до 4 символов, но если вам это не по душе — введите свое число.

{ads1}

Insert spaces for tabs – замена символа табуляции эквивалентным числом пробелов. Активация этой опции сделает ваш исходник одинаково хорошо отображаемым в любом редакторе, но, естественно, размер файла сильно возрастет, да и редактирование не всегда будет удобным.

Остальное рекомендую оставить так, как показано на рисунке, во всяком случае пока не почувствуете, что вам что-то мешает.

Первичные настройки рабочего пространства:

Отметьте следущие опции: Build automatically (перестраивать автоматически), Refresh automatically (обновлять автоматически), Save automatically before build (сохранять автоматически перед перестроением).

Все эти опции позволят вам не заботиться о том, что ваше рабочее пространство отображает реальное положение вещей. Первая опция при любом изменении настроек и т. п.

изменениях в режимах работы Eclipse автоматически произведет нужные вспомогательные действия, благодаря чему произойдет синхронизация всех затрагиваемых объектов IDE.

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

Остальные опции трогать не стоит, кроме Text file encoding (кодировка текстовых файлов). Эта опция определяет кодировку, в котрой будут сохраняться ваши исходники и другие файлы. Пользователям Windows не стоит менять ее, а в других ОС надо выбрать подходящую.

{ads1}

Продолжение следует…

Источник: https://simple-devices.ru/articles/7/62

Умный дом просто как никогда (часть 2 настройка Контроллера)

Начнем, в этой части (2), нам понадобится:

Железо


Настроенный микрокомпьютер Raspberry Pi 2 Model B + или выше версией

Программное обеспечение


PuTTY клиент для настройки ОС по SSH
WinSCP 5.x.x графический клиент SFTP (SSH File Transfer Protocol) для Windows

Серверную часть для Raspberry Pi  в нашем проекте мы будем использовать от Open Source проекта Mycontroller.orgДанное ПО достаточно активно развивается и имеет прямую поддержку Home Automation Framework от Mysensors.org. Но вы так же множите использовать и другие открытые проекты серверной части, мы остановимся только на этом.Скачаем ПО Mycontroller.org на наш компьютер. На момент написания статьи последняя версия будет 0.0.3.Alpha2, размер в архивном формате zip примерно 21.64 MB.

Нам так же понадобится виртуальная машина Java (на ней работает ПО Mycontroller.org)
Скачаем виртуальную машину Java размер в архивном формате gz примерно 77.77 MB.

Распакуем архив zip на локальный компьютер и запустим WinSCP.
При первом запуске программы, настроим параметры подключения к Rspberry Pi.
Нажмем кнопку Войти

После подключения увидим вот такое окно

Теперь, скопируем наш распакованный архив из директории C:TEMPcontrollermycontroller-dist-standalone-0.0.3.Alpha2-bundle  и скачанный архив виртуальной машины jdk-8u111-linux-arm32-vfp-hflt.tar.gz на RPI в директорию /home/pi

Как говорится “Не отходя от кассы”, сразу проставим разрешение на файлы 
start.sh
stop.sh
Данные файлы нужны для того, чтобы ПО могло запускаться автоматически при запуске микроконтроллера.

Для этого, зайдем в директорию на Raspberry Pi  /home/pi/mycontroller/bin

Выберем фай start.sh, правой кнопкой мыши (или F9) откроем Свойства.

В окне свойств 
в поле Oct проставим заветные цифры 0777, сохраним и повторим туже операцию с файлом stop.sh

Теперь нам надо понастроить наш контроллер из консольного приложения PuTTY клиент.
Там мы установим виртуальную машину Java, пропишим в автозагрузку наше ПО и отключим UART на RPI (для того, чтобы в третьей части, установить наш Raspberry PI nFR24 Add-on).

Запускаем PuTTY клиент.

Жмем кнопку Open и ждем консольного окна…

Набираем в консоле
login pi
password (ваш новый пароль)

далее 
sudo su

raspi-config

Увидим вот такое меню: 

Нам нужен 9 пункт меню Advanced Options Заходим и выбираем пункт A8 SerialВыбираем, что не хотим использовать сериальный порт в нашем проекте ()

На этом все. Выходим из этих меню и в консоле запустим установку виртуальной машины Oracle Java

Запустим Midnight CommanderНабираем mc

Переходим в директорию куда закачали наш архив с VM Java (/home/pi) На клавиатуре жмем F10 и в консольном окне вводим следующее:

sudo tar zxvf jdk-8u111-linux-arm32-vfp-hflt.tar.gz -C /opt
sudo update-alternatives –install /usr/bin/javac javac /opt/jdk1.8.0_111/bin/javac 1
sudo update-alternatives –install /usr/bin/java java /opt/jdk1.8.0_111/bin/java 1

дождемся установки и в конце проверим версию

java -version

Если все прошло удачно, то увидим вот такую строку в консоле

Теперь пропишим наш контроллер в автозагрузку
Снова запустим Midnight Commander набираем mc

Заходим в директорию  /etc и в файлик rc.local (нажать F4) запишим путь к нашему контроллеру и файлу старта.

Все, закончили, делаем перезагрузку системы. Набираем в консоле reboot Дождемся пока система загрузится, запустим браузер и наберем https://192.168.0.30:8443 Java запускается немного неторопливо, по этому придется подождать (секунд 5-10). в результате увидим страницу нашего контроллера.По умолчанию для входа используется Логин: admin Пароль: admin

Документацию по настройке программы можно почитать тут.

Радуемся, изучаем, и ждем 3 часть, в которой будем настраивать наш Raspberry PI nFR24 Add-on.

Источник: http://devicter.blogspot.com/2016/11/2.html

Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2

Продолжение электронной версии статьи из номера №2 за 2016 год журнала Компоненты и технологии. Автор Курниц Андрей. Ссылка на первую часть

Создание, запуск и отладка примитивной программы на Atmel SAM4S микроконтроллере

Теперь, когда на рабочую станцию установлено и настроено программное обеспечение для разработки под Atmel SAM4S микроконтроллеры, можно убедиться в работоспособности системы, создав простейшую программу, которая будет зажигать и гасить светодиод на плате SAM4S-EK.
Чтобы собрать работоспособную программу для микроконтроллера, помимо инструментария GCC необходимы следующие компоненты:

  1. Библиотека CMSIS (Cortex Microcontroller Software Interface Standard) — описывает единый интерфейс взаимодействия с ядром микроконтроллеров ARM Cortex-M — общая для микроконтроллеров ARM Cortex-M различных производителей.
  2. Библиотека для взаимодействия с периферией данного семейства микроконтроллеров — своя для каждого производителя, будь то Atmel, STMicroelectronics, NXP и др.
  3. Скрипт линковщика (linker script) — файл с указаниями о размещении программы во flash-памяти микроконтроллера, а также о размещении в ОЗУ служебных областей (секций): стек, куча и др. Для различных микроконтроллеров с разными объемами памяти используются соответственно различные скрипты линковщика.
  4. Файл syscalls.c — содержит системные функции, необходимые для работы стандартной библиотеки языка C (реализация newlib). Обычно эти функции являются частью операционной системы, для которой предназначена программа. Однако в случае же микроконтроллера, который чаще всего работает без операционной системы, в сборку должен быть включен файл syscalls.c, содержащий в большинстве своем пустые системные функции [10].
  5. Справедливости ради следует отметить, что существует множество операционных систем, разработанных специально для микроконтроллеров.
  6. Код начальной инициализации (startup code) — отвечает за заполнение таблицы векторов прерываний соответствующими обработчиками, в том числе и обработчиком прерывания по сбросу микроконтроллера (reset handler).
  7. Также содержит реализацию обработчика прерывания по сбросу, который обнуляет необходимые секции памяти, инициализирует стандартную библиотеку C и передает управление в точку входа программы — в функцию main().

Библиотека Atmel Software Framework

Для создания программ для своих микроконтроллеров фирма Atmel свободно распространяет библиотеку Atmel Software Framework (сокращенно ASF) для языков C/C+, которая содержит все 5 компонентов из списка выше, необходимых для сборки программы.

Библиотека ASF предоставляет высокоуровневый интерфейс, единый для микроконтроллеров различных семейств и архитектур: megaAVR, AVR XMEGA, AVR UC3 и SAM. Библиотека ASF содержит примеры работы с различными периферийными блоками микроконтроллеров, а также с внешними устройствами, расположенными на различных оценочных платах.

Такое разнообразие поддерживаемых микроконтроллеров отрицательно сказалось на легкости в освоении библиотеки ASF. Библиотека оказалась очень сложной, запутанной и большой по размеру (архив ~400 Мбайт, содержащий более 70000 файлов).

Даже не смотря на то, что библиотеку ASF можно загрузить отдельно [8] и она рассчитана на использование в том числе и компилятора GCC, однако автор не сумел вручную выделить из библиотеки необходимые файлы для создания простейшей программы для микроконтроллера Atmel SAM4S16C. Автор предлагает такой путь: 1.

Чтобы получить минимальный компилируемый проект использовать интегрированную среду разработки Atmel Studio IDE, предназначенную для операционных систем Windows и основанную на среде Microsoft Visual Studio 2013.

2. В дальнейшем «вручную» добавлять необходимые компоненты в полученный проект, копируя их из отдельно загруженной библиотеки ASF.

Среда Atmel Studio IDE

Среда Atmel Studio IDE поставляется бесплатно, загрузить ее можно с официального сайта [9]. Во время установки на компьютере или виртуальной машине под управлением Windows следует выбрать архитектуру ARM и указать необходимость установить библиотеку ASF (рис. 5).

Рис. 5. Особенности установки Atmel Studio IDE.

После установки следует запустить Atmel Studio IDE и создать новый проект, выбрав пункт меню «File -> New -> Project…». Далее следует выбрать тип проекта «GCC C ASF Board Project», как показано на рис. 6.

Рис. 6. Выбор типа проекта в Atmel Studio IDE.

Далее откроется окно выбора аппаратной платформы, для которой будет собираться проект (рис. 7)

Рис. 7. Выбор микроконтроллера

Можно ввести название микроконтроллера, но в данном случае проще задать название оценочной платы. Для этого следует выбрать пункт «Select by Board» и выбрать название «SAM4S-EK» (рис. 7). В списке ниже следует выбрать появившийся пункт с наименованием микроконтроллера «ATSAM4S16C» и нажать «Ok».

После того, как проект будет создан, файлы исходного кода будут размещены в указанном ранее (рис. 6) каталоге (в случае автора c:Usersandrey_kDocumentsAtmel Studio7.0GccBoardProject1GccBoardProject1src). Каталог src теперь можно перенести в операционную систему Linux в каталог проекта, например, в каталог ~/sam/.

Его структура представлена на рис. 8.

Рис. 8. Структура простейшего проекта

Внимание следует обратить на расположение:

  1. Скрипт линковщика — это файл ~/sam/src/ASF/sam/utils/linker_scripts/sam4s/sam4s16/gcc/flash.ld
  2. Код начальной инициализации и таблица векторов прерываний находится в файле ~/sam/src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.c
  3. Файл syscalls.c находится в каталоге ~/sam/src/ASF/sam/utils/syscalls/gcc.

Добавление модуля из библиотеки ASF

На данный момент в проекте отсутствует компонент delay.h, необходимый для получения задержек на точно заданное время (это понадобится для «мигания» светодиодом). Далее показано, как по мере роста проекта добавлять необходимые компоненты из библиотеки ASF — на примере компонента delay.h.

Чтобы его добавить, необходимо скопировать из отдельно загруженного архива библиотеки ASF [8] файл common/services/delay/delay.h и каталог со всеми файлами common/services/delay/sam/ в каталог проекта ~/sam/src/ASF/common/services/delay.
Кроме этого необходимо включить компонент delay.

h в сборку, добавив в конце файла ~/sam/src/asf.h строку:

#include

Как видно, добавление отдельных компонентов из библиотеки ASF в проект не представляет больших трудностей.

Код простейшей программы

Листинг файла main.c приведен ниже:

#include
int main (void) { board_init(); sysclk_init(); while (1) { LED_On(LED1_GPIO); delay_ms(500); LED_Off(LED1_GPIO); delay_ms(500); } return 0;
}

Функция board_init() инициализирует порты ввода/вывода (GPIO) микроконтроллера в соответствии с подключенными к ним внешними электронными компонентами, в том числе настраивает порты ввода/вывода как выходы для включения/выключения расположенных на плате светодиодов. Функция board_init() находится в файле src/ASF/sam/borads/sam4s_ek/init.c. Предоставлена возможность выбирать, какие порты будут проинициализированы, а какие нет — с помощью макроопределений в файле src/config/conf_borad.h.

Функция sysclk_init() отвечает за инициализацию блока тактирования микроконтроллера. После сброса включается встроенный RC-генератор на 4 МГц [12]. Функция sysclk_init() активирует генератор, работающий от внешнего кварцевого резонатора на 12 МГц, а также настраивает блок фазовой автоподстройки частоты PLL, так, чтобы частота тактирования ядра микроконтроллера составляла 120МГц.

Изменить настройки тактирования можно меняя значения макроопределений в файле src/config/conf_clock.h. Далее в бесконечном цикле последовательно вызываются функции включения и выключения светодиодов оценочной платы: LED_On() и LED_Off().

В качестве аргумента передается макроопределение LED1_GPIO, что соответствует зеленому светодиоду, подключенному к порту PA20.

Функции LED_On(), LED_Off() и макроопределение LED1_GPIO определены в исходных файлах в каталоге src/ASF/sam/borads/sam4s_ek/, который содержит помимо прочего описание подключения светодиодов к выводам микроконтроллера.

Вызов функции delay_ms(500), входящей в добавленный ранее модуль delay.

h, приводит к задержке выполнения на 0,5 секунды. Задержка реализована пустыми циклами микроконтроллера, причем нет необходимости заботиться об учете частоты тактирования микроконтроллера — текущая частота учитывается внутри библиотеки ASF после вызова функции sysclk_init().

Сборка с помощью системы автоматизации QBS

Чтобы получить исполняемый файл прошивки необходимо выполнить компиляцию довольно большого количества файлов.

Фирма Atmel предлагает пользоваться файлами makefile, которые представляют собой инструкции компилятору GCC. Автор же предлагает воспользоваться встроенной в Qt Creator средой автоматизации сборки QBS [1].

Для этого придется создать QBS файл проекта, содержащий сведения об исходных файлах, подлежащих компиляции.

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

Текст QBS файла

Источник: http://www.pvsm.ru/mikrokontrollery/118530

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}