Arm - це просто (частина 2)

Вчимося говорити з електронікою на одній мові

Не тільки люди один з одним спілкуються на мові, але і люди з комп'ютерами (а мікроконтролери можна теж назвати мікрокомп'ютером) спілкуються на мові, званому мовою програмування. Як і у людей існує безліч мов, українська, англійська, німецька, китайська тощо також існують і різні мови програмування, такі як С, Pascal, Basic, Fortran, Java, PHP і інші.

Кожна мова програмування має свої особливості і в зв'язку з цим для використання в різних застосуваннях перевага віддається різним мовам. Так, наприклад, скриптова мова програмування PHP має багаті можливості по роботі зі строковими даними, і функціями пов'язаними з роботою з текстом, скоєно не підходить для написання програм на МК, оскільки, як і будь-який інший скриптова мова, він вимагає для своєї роботи спеціального встановленого ПО, виконуючого написаний на цій мові код. Таким чином для нас підходять тільки компільовані мови, такі як наприклад С, Pascal, Basic і т.п. Найбільш простим в освоєнні вважається Basic, але в зв'язку з його спрощенням він створює далеко не ідеальний програмний код, в зв'язку з чим, і без того не особливо багаті ресурси мікроконтролера витрачаються занадто марнотратно. Pascal, серед названих трьох мов, є середнім мовою. Найкращим по оптимальності одержуваного коду вважається мову програмування С. Але навіть він не завжди забезпечує потрібного результату, тому також часом використовується Assembler, дана мова являє ні що інше як безпосередня робота з мікро контролером на низькому рівні. З точки зору електроніки, написання програм на ньому можна порівняти з розробкою та складанням підсилювача на транзисторах, а написання програм на мовах високого рівня зі складанням підсилювача на мікросхемах. Написання програм на асемблері є більш трудомістким процесом, але при належному вмінні він дає можливість отримати більш кращі результати по швидкодії і займаним програмою ресурсів. Також як і підсилювач, зібраний на транзисторах, може дати кращі параметри звучання, але тільки в тому випадку якщо цей підсилювач збирається по добре «вилизаної» схемою з правильною розводкою плати і при дотриманні всіх необхідний вимог. Саме з цих причин, найбільш часто вживаним мовою програмування, для написання програм для МК є мова програмування Сі, з яким я і пропоную почати наше знайомство. Ті, хто знайомий з цією мовою, можуть пропустити цю частину і приступити до вивчення наступної частини, оскільки в даному матеріалі відображені тільки базові знання, необхідні для написання програм, описані максимально доступним для початківців мовою.

// і не вважаються частиною програмного коду.

// Вони записуються в одній і більше рядках, і полягають між символами / * і * /

// або в одному рядку, що починається з послідовності //

структура програм

Будь-яка програма, як і пропозиція в нашій мові, складається з різних частин «мови», таких як константи, оператори і змінні. Наприклад, у реченні «Якщо я прийду додому о 18 годині, то встигну подивитися фільм, інакше він закінчиться» є оператор умови «Якщо ..., то встигну ..., інакше ...», константи - «я» і змінна «18 годин». Приблизно ось так цей запис буде виглядати, якщо її записати на мові Сі

// Тут оператор умови «if». в дужках вказується саме умова,

// по виконанню, якого буде виконано дію наступне далі, якщо дій кілька, то вони об'єднуються фігурними дужками.

if (я прийду додому в 18часов) встигну подивитися фільм;

// Якщо умова не виповнилося, то програма виконає умову йде після «else»,

// else не є обов'язковим і може бути відсутнім

змінні

Всі константи, оператори та ін. Розташовуються під flash пам'яті (ПЗУ, ROM, пам'ять програм), вміст цієї пам'яті не може бути змінено програмою. Для зберігання даних, які змінюються під час виконання програми, використовується оперативна пам'ять (ОЗУ, RAM, пам'ять даних). Всі змінні розташовуються в RAM пам'яті, для створення змінної використовуються ключові слова:

char - створює змінну розміром 1 байт (8 біт), дана змінна може містити 2 8 = 256 значень;

int - розмір створюваної зміною залежить від використовуваної архітектури, так наприклад для МК AVR Atmega8 і йому подібних розмір змінної буде 16 біт, для STM32 він складе 32 біта;

short - створює змінну розміром 16 біт, дана змінна може містити 65536 значень і займає в пам'яті 2 байти;

long - 32 бітна змінна, займає в пам'яті 4 байта і містить 2 32 значень;

float - змінна використовується для чисел з плаваючою точкою (дробових чисел), займає так само 4 байта, але на дії з даним типом змінних необхідно затратити більше число тактів процесора, тобто більше часу.

Для числових змінних існують модифікатори, що позначають знак змінної:

unsigned - вказує на те, що створювана змінна має беззнаковий тип, тобто unsignedchar створить змінну з діапазоном від 0 до 255;

signed - вказує на те, що створювана змінна має знаковий тип, тобто signedchar створить змінну з діапазоном від -128 до +127

Для зберігання строкових даних, а також для зберігання великої кількості однотипних даних зручно використовувати масиви даних. До всього масиву цілком можна звертатися по одному імені. Крім того, можна вибирати будь-який елемент масиву за індексом елемента. Для цього необхідно задати індекс, який вказує на його відносну позицію. Число елементів масиву призначається при його визначенні і надалі не змінюється. Якщо масив оголошений, то до будь-якого його елементу можна звернутися в такий спосіб: вказати ім'я масиву та індекс елемента в квадратних дужках.

unsigned char array_name [10]

Будь-які змінні, а також функції та константи повинні вибиратися з урахуванням наступних правил:

1. Вони повинні починатися з літери латинського алфавіту (а. Z, А. Z) або з символу підкреслення «_».

2. У них можуть використовуватися літери латинського алфавіту, символ підкреслення і цифри (0. 9). Використання інших символів заборонено.

3. У мові Сі букви нижнього регістра (а. Z), що застосовуються в ідентифікаторах, відрізняються від букв верхнього регістру (А. Z). Це означає, що визначається одним із таких вважаються різними: name, NaMe, NAME і т.д.

4. Вони можуть мати довжину відповідно до стандарту ANSIC що не перевищує 32 символів.

5. Ідентифікатори для нових об'єктів не повинні збігатися з ключовими словами мови і іменами стандартних функцій з бібліотеки.

Якщо перед значенням числа додано вираз «0х», це означає що дане число записано в шістнадцятковому вигляді, наприклад 0х12.

Спробуємо створити кілька змінних.

/ * Наприклад, якась змінна може змінюватися в діапазоні від 0 до 100,
вона не перевищує розмірності 1 байта, і має тільки позитивні значення,
значить, для неї підходить тип unsignedchar * /

unsigned char imja_peremennaya1;

/ * Якщо ми захочемо створити змінну, що змінюється в діапазоні, наприклад, від 50 до 1000 нам необхідно оголосити її як unsignedshort. не дивлячись на те, що вона також входить і в діапазон unsignedlong. Її також можливо оголосити типом unsignedlong. але це не раціонально, оскільки при цьому буде зарезервована більша область пам'яті, ніж потрібно для даної змінної * /

unsigned short imja_peremennaya2;

signed int imja_peremennaya3;

/ * Масиви визначаються так само, як і змінні, але додатково в квадратних дужках вказується розмір масиву * /

/ * Даний масив являє набір з 100 змінних типу unsigned int мають ім'я imja_massiva. При зверненні до масиву необхідно в квадратних дужках вказати номер елемента, до якого відбувається звернення. * /

/ * Ініціалізувати рядок можна наступним чином: * /

// У квадратних дужках вказується резервовану в ОЗУ місце

/ * Слід пам'ятати, що будь-який рядок повинна закінчуватися байтом рівним 0, це є ознакою кінця рядка * /