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

в 8:15, , рубрики: atmel, cortex-m4, Блог компании Rainbow, микроконтроллеры, микроконтроллеры arm, программирование микроконтроллеров

Продолжение электронной версии статьи из номера №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).
Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2 - 1
Рис. 5. Особенности установки Atmel Studio IDE.

После установки следует запустить Atmel Studio IDE и создать новый проект, выбрав пункт меню «File -> New -> Project…». Далее следует выбрать тип проекта «GCC C ASF Board Project», как показано на рис. 6.
Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2 - 2
Рис. 6. Выбор типа проекта в Atmel Studio IDE.

Далее откроется окно выбора аппаратной платформы, для которой будет собираться проект (рис. 7)
Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2 - 3
Рис. 7. Выбор микроконтроллера

Можно ввести название микроконтроллера, но в данном случае проще задать название оценочной платы. Для этого следует выбрать пункт «Select by Board» и выбрать название «SAM4S-EK» (рис. 7). В списке ниже следует выбрать появившийся пункт с наименованием микроконтроллера «ATSAM4S16C» и нажать «Ok».
После того, как проект будет создан, файлы исходного кода будут размещены в указанном ранее (рис. 6) каталоге (в случае автора c:Usersandrey_kDocumentsAtmel Studio7.0GccBoardProject1GccBoardProject1src).
Каталог src теперь можно перенести в операционную систему Linux в каталог проекта, например, в каталог ~/sam/. Его структура представлена на рис. 8.
Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2 - 4
Рис. 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 <delay.h>

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

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

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

#include <asf.h>
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 файла

import qbs
import qbs.FileInfo
import qbs.ModUtils

Project {
    CppApplication {
        type: ["application", "ucfw" ]
        Depends { name: "cpp" }
        consoleApplication: true
        cpp.positionIndependentCode: false
        cpp.executableSuffix: ".elf"
        cpp.includePaths: [
            "src",

            "src/ASF/common/boards",
            "src/ASF/common/services/clock",
            "src/ASF/common/services/clock/sam4s",
            "src/ASF/common/services/gpio",
            "src/ASF/common/services/gpio/sam_gpio",
            "src/ASF/common/services/ioport",
            "src/ASF/common/services/ioport/sam",
            "src/ASF/common/services/delay",
            "src/ASF/common/services/delay/sam",
            "src/ASF/common/utils",
            "src/ASF/common/utils/interrupt",

            "src/ASF/sam/boards",
            "src/ASF/sam/boards/sam4s_ek",
            "src/ASF/sam/drivers/pio",
            "src/ASF/sam/drivers/pmc",

            "src/ASF/sam/utils",
            "src/ASF/sam/utils/cmsis/sam4s/include",
            "src/ASF/sam/utils/cmsis/sam4s/include/component",
            "src/ASF/sam/utils/cmsis/sam4s/include/instance",
            "src/ASF/sam/utils/cmsis/sam4s/include/pio",
            "src/ASF/sam/utils/header_files",
            "src/ASF/sam/utils/preprocessor",

            "src/ASF/thirdparty/CMSIS/Include",

            "src/config"
        ]        
        cpp.defines: [
            "__SAM4SA16C__",
            "BOARD = SAM4S_EK"
        ]
        cpp.commonCompilerFlags: [
            "-mcpu=cortex-m4",
            "-mthumb",
            "-mfloat-abi=soft"
        ]
        cpp.linkerFlags: [
            "-mcpu=cortex-m4",
            "-mthumb",
            "-mfloat-abi=soft",
            "-Xlinker",
            "--gc-sections"
        ]

        // Оптимизация - только не для отладки.
        Properties {
            condition: qbs.buildVariant === "debug"
            cpp.debugInformation: true
            cpp.optimization: "none"
        }
        Properties {
            condition: qbs.buildVariant === "release"
            cpp.debugInformation: false
            cpp.optimization: "small"
        }

        // Добавляет макроопределение DEBUG, если сборка "Отладка".
        Properties {
            condition: cpp.debugInformation
            cpp.defines: outer.concat("DEBUG")
        }

        // Использовать скрипт линковщика
        cpp.linkerScripts: [
            "src/ASF/sam/utils/linker_scripts/sam4s/sam4s16/gcc/flash.ld"
        ]

        // Группируем файлы с исходным кодом в группу "sources"
        Group {
            name: "sources"
            prefix: "./src/**/"
            files: [
                "*.c",
                "*.cpp",
                "*.h",
                "*.s"
            ]
            cpp.cxxFlags: [ "-std=c++11" ]
            cpp.cFlags: [ "-std=gnu99" ]
            cpp.warningLevel: "all"
        }

        // Группируем скрипты линковщика в группу "ldscripts"
        Group {
            name: "ldscripts"
            prefix: "./src/**/"
            files: "*.ld"
        }

        // В группу "others" попадет файл конфигурации OpenOCD
        Group {
            name: "others"
            prefix: "./**/"
            files: [
                "*.cfg"
            ]
        }

        // Автоматически после успешной сборки:
        // 1. Получение размера прошивки с помощью утилиты size из состава инструментария GCC
        // 2. Создание копии прошивки в популярном формате Intel HEX
        // 3. "Прошивка" в микроконтроллер с помощью программы OpenOCD
        Rule {
            id: flashing

            // Отключить правило для сборки "Отладка"
            condition: qbs.buildVariant === "release"

            inputs: ["application"]

            Artifact {
                fileTags: ["ucfw"]  // !!!Обязательно должен совпадать с полем type итема CppApplication!!!
                filePath: input.baseDir + "/" + input.baseName + ".hex"
            }

            prepare: {
                // Вывести размер
                var sizePath = "arm-none-eabi-size";
                var argsSize = [input.filePath];
                var cmdSize = new Command(sizePath, argsSize);
                cmdSize.description = "Size of sections:";
                cmdSize.highlight = "linker";

                // Создать копию в формате Intel HEX
                var objCopyPath = "arm-none-eabi-objcopy";
                var argsConv = ["-O", "ihex", input.filePath, output.filePath];
                var cmdConv = new Command(objCopyPath, argsConv);
                cmdConv.description = "converting to HEX: " + FileInfo.fileName(input.filePath);
                cmdConv.highlight = "linker";

                // Непосредственно прошивка
                var flashUtilityPath = "openocd";
                var cmd1 = 'flash write_image erase' + ' ' + input.filePath;
                var argsFlash = [
                            "-f", "interface/jlink.cfg",
                            "-f", "board/atmel_sam4s_ek.cfg",
                            "-c", "init",
                            "-c", "halt",
                            "-c", cmd1,
                            "-c", "reset",
                            "-c", "shutdown"];
                var cmdFlash = new Command(flashUtilityPath, argsFlash);
                cmdFlash.description = "flashig to uC: " + FileInfo.fileName(output.filePath);
                cmdFlash.highlight = "linker";

                // Выполнить последовательно все 3 действия
                return [cmdSize, cmdConv, cmdFlash];
            }
        }
    }
}

В случае успешной release сборки (release — т.е. не для отладки, окончательной) QBS файл содержит предписания выполнить следующие действия:

  1. Вывести в консоль сборки размер прошивки,
  2. конвертировать файл прошивки из формата ELF в формат Intel HEX
  3. Загрузить файл в целевой микроконтроллер через адаптер SAM-ICE, используя программу OpenOCD

Заключение

В результате вышеприведенных действий создана экосистема для разработки под микроконтроллеры Atmel SAM4S, полностью состоящая из свободно распространяемых программ. Экосистему несложно модифицировать для использования другого ARM микроконтроллера фирмы Atmel.
Загрузить готовый проект можно по адресу [11]. Для его использования понадобится операционная система Ubuntu или производная от нее (Lubuntu, Kubuntu, Xubuntu) с установленными пакетами:

  • инструментарий GCC для ARM микроконтроллеров [1]
  • среда разработки Qt Creator [1]
  • программа OpenOCD (установка описана выше)

Литература

  1. Курниц А. Разработка для микроконтроллеров STM32 в среде операционной системы Linux // Компоненты и технологии. 2015. № 10.
  2. www.sourceforge.net/projects/openocd
  3. www.we.easyelectronics.ru/CADSoft/ubuntueclipse-code-sourcery-openocd-j-link-arm-ilibystryy-start-dlya-somnevayuschihsya.html
  4. www.microsin.net/programming/arm/openocdmanual-part1.html
  5. www.microsin.net/programming/ARM/openocdmanual-part2.html
  6. www.microsin.net/programming/ARM/openocdmanual-part3.html
  7. www.openocd.org/doc/html/General-Commands.html
  8. www.asf.atmel.com/docs/latest/download.html
  9. www.atmel.com/tools/ATMELSTUDIO.aspx
  10. www.sourceware.org/newlib/libc.html#Syscalls
  11. www.e-kit.ru
  12. www.atmel.com/images/atmel-11100-32-bit%20cortex-m4-microcontroller-sam4s_datasheet.pdf

Автор: Rainbow

Источник

Поделиться новостью

* - обязательные к заполнению поля