Програмування і налагодження мікроконтролерів 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:\Users\andrey_k\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src).
Каталог 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 <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: "ні"
}
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"
]

// Групуємо файли з вихідним кодом до групи "джерела"
Group {
name: "джерела"
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


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.