Перед тим, як програма Arduino (скетч) потрапить в пам'ять мікроконтролера плати і почне працювати, має відбутися кілька прихованих від очей користувача процесів. Спочатку середовище розробки Arduino IDE виконує невеликі перетворення коду скетчу, щоб він став текстом, повністю сумісним зі стандартом мови C або C ++ (це два найбільш відомих мови програмування в світі мікроконтролерів). Потім отриманий текст програми передається компілятору avr-gcc, який переводить людино-якого читають код програми в об'єктні машинні коди, придатні (після подальшого перетворення - лінковки) для виконання ядром використовуваного мікроконтролера (зазвичай це Atmel AVR ATmega328). Потім об'єктний машинний код скетчу комбінується (цей процес називається лінковкою) з кодом функцій зі стандартних бібліотек Arduino (ці бібліотеки надають безліч функцій, таких як базові digitalWrite () або Serial.print ()). В результаті виходить один файл у форматі Intel HEX [2], який повинен бути записаний в пам'ять мікроконтролера макетної плати Arduino. Зазвичай функцію програмування коду в пам'ять мікроконтролера бере на себе стандартний UART-завантажувач Arduino: код передається завантажувачу через USB-з'єднання з комп'ютером (через спеціальну мікросхему USB-UART, зазвичай компанії FTDI). UART-завантажувач Arduino був спочатку записаний в пам'ять мікроконтролера плати спеціальним ISP-програматором (до речі кажучи, багато дешеві китайські Ardiuno-сумісні плати, які можна купити на ebay, страждають відсутністю прошитого завантажувача).
[Підготовка main sketch file]
[Перетворення main sketch file]
Як уже згадувалося, Arduino IDE робить деякі перетворення над main sketch file (це може бути як один файл на одній вкладці, таки і об'єднані один з одним файли без розширень на кількох закладках) перед передачею коду компілятору avr-gcc.
Спочатку в початок main sketch file приховано додається #include "Arduino.h", або для старих версій (менше ніж 1.0) #include "WProgram.h". Цей заголовки (він знаходиться в каталозі% ARDUINO% / hardware / cores /
Препроцесор - це перший крок в процесі обробки вихідного коду (скетчу), компілятором. Препроцесор компілятора шукає в коді спеціальні ключові слова, що починаються на символ #, що позначає початок директиви компілятора.
Ви напевно не раз зустрічалися з ключовими словами #include при використанні бібліотек. Директива #include говорить препроцесору компілятора вставити в це місце код з файлу заголовка бібліотеки.
Є й інші директиви препроцесора (#define, #if, #else, #error, #pragma і т. Д.), Інформацію по ним Ви можете знайти в керівництві по компілятору [5]. Іноді препроцесор - єдина можливість вирішити задачу, проте синтаксис препроцесора відрізняється від мови C і C ++, і необережне використання директив препроцесора може привести до важко відловлювати помилок.
У файл додаються різні константи (отримані з файлу опису boards.txt і відносяться до обраної платі). Ці константи пов'язані з використовуваним типом мікроконтролера. І нарешті, вміст поточного цільового (target) файлу main.cxx, додається в кінець скетчу. Після всіх цих перетворень файл компілюється компілятором AVR-GCC.
Під target-му тут мається на увазі плата Arduino, для якої компілюється двійковий машинний код. Середовище розробки Arduino підтримує кілька плат з різними микроконтроллерами (в даний час це поки тільки різні мікроконтролери одного сімейства - AVR), тактовою частотою (CPU speed) або завантажувачами. Всі ці настройки платформ задані у файлі налаштувань (preferences.txt).
Деякі настройки можна поміняти в діалозі Налаштування (Preferences) прямо з середовища розробки Arduino. На платформах Windows або Linux це меню File (Файл), на платформі Mac це меню Arduino. Інші настройки повинні бути змінені редагуванням файлу preferences.txt. Місце розташування цього файлу показано в діалоговому вікні Параметри. Це місце повинно бути:
Редагуйте цей файл тільки тоді, коли середовище розробки Arduino не запущено, інакше всі Ваші зміни будуть перезаписані і втрачені, коли Ви завершите роботу з Arduino IDE.
Визначення, які задають вміст меню Board, можна знайти в файлі boards.txt, що знаходиться в піддиректорії hardware / каталогу додатка Arduino IDE. Визначення для меню Burn Bootloader знаходяться в файлі programmers.txt того ж самого каталогу. Щоб створити нову плату або визначення програматора, зробіть копію існуючого, поміняйте префікс, який використовується в ключах властивості (preference keys, наприклад "diecimila." Або "avrisp."), І поміняйте значення, щоб вони підходили до Вашої апаратури. Майте на увазі, що підтримуються тільки певні зміни щодо плат.
Відповідні змінні для налаштувань включають:
Корисна також наступна настройка в main preferences.txt:
build.verbose. потрібно чи ні виводити налагоджувальні (докладні) повідомлення, що описують процес компіляції скетчу (наприклад "false"). Якщо true, то будуть виводитися повністю і командний рядок для кожної виконуваної зовнішньої команди як частини процесу складання.
Примітка: якщо false, то докладні повідомлення про процес компіляції виводитися не будуть, однак Ви можете скасувати цю поведінку для майбутньої процедури компіляції або вивантаження, якщо будете утримувати клавішу Shift, коли робите клік на команді Compile або Upload.
Примітка: у версіях Arduino 0004 і пізніших later, build.extension не використовується - головний файл скетчу завжди обробляється як файл .cpp.
Скетчі компілюються компілятором avr-gcc і avr-g ++ відповідно до змінними файлу boards.txt за обраною платформі (обраної платі Arduino).
Шляхи пошуку для підключення заголовних файлів (include path) включають каталог скетчу, каталог target (% ARDUINO% / hardware / core /
Коли Ви перевіряєте (verify) або вивантажує (upload) скетч, він компілюється в тимчасову системну директорію (наприклад на Mac або Linux це каталог / tmp). Коли Ви робите вивантаження (upload), збірка відбувається в піддиректорію applet / каталогу скетчу (в який Ви можете отримати доступ, вибравши пункт "Show Sketch Folder", т. Е. "Показати папку скетчів" меню "Sketch", "Скетч") .
Цільові файли .c і .cpp компілюються у вихідні файли з розширенням .o, і потрапляють в цю папку, як і головний файл скетчу, і будь-які інші файли .c або .cpp в скетчі або будь-які .c або .cpp файли будь-якої бібліотеки, підключається директивою #include скетчу.
Перед спробою компіляції кожного .c або .cpp робиться спроба повторного використання раніше скомпільованої файлу .o - ця спроба прискорює процес складання. Спеціальний файл .d (від слова dependency, залежність) надає список всіх інших файлів, що підключаються вихідним файлом. Крок компіляції пропускається, якщо файли .o і .d існують, і мають мітку часу новіше, ніж вихідний файл і всі файли списку залежностей. Якщо вихідний файл або будь-який файл зі списку залежностей був змінений, або сталася будь-яка помилка при перевірці файлів, то компілятор запускається як зазвичай, і записує нові файли .o і .d. Після того, як в меню Tools була обрана нова плата, всі файли .c і .cpp будуть перекомпіліровать заново при наступному запуску компіляції.
Потім ці файли .o лінкуются один з одним в статичну бібліотеку, яка потім лінкуются з об'єктним файлом, отриманим від основного файлу скетчу. Причому в вихідний .hex файл потрапить тільки код тих частин бібліотек і об'єктних файлів, які реально використовуються в скетчі, ніж зменшується розмір вихідного файлу.
Файл .hex є заключним результатом компіляції, який вивантажується в плату. Під час процедури перевірки "Verify" файл .hex записується в каталог / tmp (на платформах Mac і Linux) або \ Documents and Settings \ ім'я користувача \ Local Settings \ Temp (на платформі Windows). Під час вивантаження HEX-файл записується в підкаталог applet каталогу скетчу.
Утиліти, що використовуються для реалізації процесу компіляції (в тому числі і компілятор AVR-GCC), знаходяться в каталозі% ARDUINO% / hardware / tools / avr.
Для просунутих програмістів може виявитися корисною утиліта avr-objdump. яка також знаходиться в каталозі tools. Вона дозволяє подивитися, як компілятор перетворив код скетчу в програму, яку виконує мікроконтролер плати. Утиліта avr-objdump генерує лістинг дизассемблера Вашого скетчу, який покаже об'єктний код, перемішаний з відповідними рядками вихідного коду. Лістинг також покаже карту пам'яті (memory map) для всіх змінних, використовуваних у Вашому скетчі. Щоб використовувати avr-objdump, виконайте спочатку компіляцію скетчу, і потім перейдіть в папку каталогу установки Arduino. Потім знайдіть папку, яка містить всі проміжні файли, які використовуються в процесі складання (як було пояснено раніше). Проміжний файл, який використовується утилітою avr-objdump, має розширення .elf. Наприклад, якщо Ви скомпілювали скетч Blink, то зможете побачити висновок компіляції (машинні коди) шляхом запуску з командного рядка наступної команди:
Наступна версія команди додасть в висновок список секції заголовків (допомагає для визначення витрати пам'яті):
Ви також можете створити командний файл (файл з розширенням .bat), який буде виводити лістинг в файл. Додайте шлях до каталогу інсталяції Arduino в наступний рядок, і збережіть це як командний файл:
[Процес вивантаження (Upload)]
Скомпільований двійкового коду скетчу (представлений вихідним файлом у форматі Intel HEX) зазвичай потрапляє в пам'ять мікроконтролера плати за участю завантажувача і утиліти avrdude.
Процес вивантаження також управляється змінними в налаштуваннях плати і основних налаштуваннях. Ці настройки включають:
Також на процес вивантаження впливає файл основних налаштувань (main preferences file):
upload.verbose. потрібно чи ні виводити налагоджувальні (докладні) повідомлення, що описують процес завантаження, т. е. передачі коду завантажувачу плати (за замовчуванням "false", т. е. докладні повідомлення не виводитися будуть).
Примітка: якщо false, то докладні повідомлення про процес вивантаження виводитися не будуть, однак Ви можете скасувати цю поведінку для майбутньої процедури компіляції або вивантаження, якщо будете утримувати клавішу Shift, коли робите клік на команді Compile або Upload.