Чи має кожна лінія мікроконтролера власну мову програмування / синтаксис?


10

Я запрограмував Arduino і почав програмувати Teensy. Вони схожі на C, але в мові програмування є невеликі нюанси.

Наприклад, в C Arduino ви викликаєте функцію pinMode (pin #, Output / Input) для позначення цифрового контакту або для вихідних сигналів, або для прийому сигналів. У програмі C Teensy ви встановлюєте регістр "DDR", пов'язаний з одним із чотирьох портів (кожен з яких представляє собою набір штифтів), який ви колективно позначаєте як вхід, так і вихід ( синтаксис Teensy IO ).

Мені хотілося б знати, чи не так, коли ви користуєтеся новим для вас мікроконтролером, вам потрібно ефективно вивчити нову «мову». Я вкладаю слово "мова" в лапки, тому що, незважаючи на нюанси в синтаксисі, компоненти та спосіб їх налаштування в програмному забезпеченні принципово еквівалентні, наприклад, поняття портів і штифтів все ще стосується терміналу, з якого можна виводити / вводити цифровий сигнали.

Та сама марність дискурсу: чи є мікроконтролери, які не запрограмовані у програмному забезпеченні, чи завжди буде програмний шар, який використовується для програмування uController? Якщо останній, хто пише / надає документацію на них?


2
Мова програмування для Arduino є C ++ (ні (тільки) C) - або , можливо , тільки підмножина C ++ (або навіть обробка ). Це не зовсім ясно, але це, звичайно, більше, ніж С; наприклад, у нього є класи та визначений користувачем оператор + = .
Пітер Мортенсен

1
Це C ++, він компілюється за допомогою g ++ - avr. Технічно це було б самостійною реалізацією C ++, і вона не включає стандартну бібліотеку C ++ (через необхідні речі, такі як динамічне розподілення пам'яті та виключення). Ви можете використовувати такі мовні функції, як класи та шаблони. Я бачив заміну цифрового набору шаблонів DigitalWrite (), яка досягає тієї ж продуктивності, що й прямий доступ до регістрів, метод Arduino має досить накладні витрати.
r_ahlskog

1
Мова однакова. Це API, який відрізняється. Якщо ви віддалитесь від мікроконтролерів і почнете писати програми для настільних ПК, ви зіткнетесь з абсолютно такими ж проблемами, коли пишете програми C для Windows, Linux та Mac. Навіть якщо ви використовуєте лише POSIX API (який підтримують усі 3 платформи), ви все одно будете мати особливі відмінності платформи, коли хочете зберегти налаштування / налаштування користувача.
slebetman

Відповіді:


3

Мікропроцесори та мікроконтролери зазвичай використовують спільну архітектуру між різними лініями продуктів та виробників. Ці архітектури зазвичай визначають набір команд низького рівня ( набір інструкцій ), загальний для всіх реалізацій. Компілятор AC або C ++ зможе генерувати байт-код, який виконується на всіх, наприклад, процесорах ARM.

Однак архітектура - це лише половина картини. Оскільки є багато конкретних адрес пам'яті, на бортовій периферії, управління пам'яттю та інші деталі реалізації, на які архітектура не звертається

Виробник або третя сторона, як правило, надає колекцію вихідних файлів ( HDK ), які надають визначення, відображення портів та приклад коду. Зазвичай HDK призначений для C і C ++ . Зазвичай HDK матиме демонстраційну дошку, пов'язану з нею (думаю, $ 500 ардуїно). Для підлаштування платформи розробки / зразка для пристрою, який ви проектуєте, часто потрібно багато детальної конфігураційної роботи

Arduino заснований на архітектурі AVR і в основному підтримується Atmel. Arduino створив завантажувач платформи та бібліотеку спрощених функцій та об’єктів C ++ для використання платформи з мінімальними зусиллями. Платформа Arduino і IDE розроблені для любителів з мінімальним обладнанням. Перед ардуїно, PIC виконував аналогічну роль з легким у використанні та дешевим середовищем BASIC.

У професійному середовищі зазвичай ця підтримка надається продавцем / виробником або надається контрактом третій стороні. Вони надають код низького рівня та заголовки, і ви пишете свою заявку цим HDK, у більших організаціях це можна зробити вдома. Останнім часом існує тенденція, що виробники будують відкриту екосистему API / Software навколо своєї платформи, що робить їх таким же простим у використанні прямо з коробки, як ардуїно. Є ще незліченна кількість фішок з дуже малою підтримкою програмування, а більшість знань про платформу заблоковані у корпоративному світі.


14

Мова в цьому випадку абсолютно однакова. У середовищі Arduino трапляються додаткові бібліотеки (просто більше коду С), які "обгортають" доступ до реальних апаратних регістрів (DDRx, PORTx, INx тощо) з дещо більш зручними для користувача функціями. Це збільшує накладні витрати (потрібно виконати більше інструкцій для однієї і тієї ж операції), але збільшує гнучкість, оскільки "просто" написати програму, яка використовує лише ці дзвінки, а потім переспрямовує її на інший чіп (скажімо, ардуїно-мега) і бібліотека буде обробляти правильне відображення всередині країни.

Насправді немає «стандартних» API для дійсно низького доступу через мікросхеми різних постачальників. Однак весь доступ низького рівня робиться однаково - читає і записує на фіксовану адресу пам'яті - тому загальний метод доступу буде подібний між різними частинами, просто деталі та назви будуть різними. Можливо, ви просто надасте заголовкові файли з величезними списками #defines адрес реєстру, поданих на покажчики. Або, можливо, файли заголовків використовуватимуть структури, щоб зберігати впорядковані речі з трохи ієрархією. Деякі виробники можуть також надавати API більш високого рівня. Це може бути дуже корисно для периферійних пристроїв, які складні і важкі в налаштуванні. GPIO дуже простий, але щось на зразок USB-контролера з підтримкою DMA може мати сотні регістрів.

Отже, підсумок - так, вам потрібно буде вивчити деякі нові імена регістрів, але мова все ще є C ++ (або C, збірка, чи, можливо, щось більш езотеричне).


4
Arduino - це не просто C (насправді, C ++) - він має препроцесор, який вносить кілька змін, перш ніж подавати його компілятору C.
Нік Джонсон

Власне, для Arduino це більше, ніж C. Це C ++ (або, можливо, підмножина C ++).
Пітер Мортенсен

Це просто рідний C ++ з бібліотеками Arduino чи щось більше?
kayleeFrye_onDeck

Ардуїно IDE, очевидно, робить додаткову попередню обробку поверх інакше стандартного C ++. Більшість ІДЕ не роблять цього.
alex.forencich

Це в основному C ++, але main()попередньо визначений для вас. Натомість ви отримуєте два вхідні точки: init()і loop()(виправте мене, якщо я помиляюся, але я торкнувся
Ардуїно

5

Ви плутаєте мікроконтролери та компілятори. Мови високого рівня, на які можна запрограмувати будь-який мікрофон, є функцією того, які компілятори доступні для цього мікрофона.

На низькому рівні мікро виконує машинні інструкції, які компілятор отримує для текстового файлу, який ви надаєте йому, який ви вважаєте "програмою". Ви дійсно вказуєте деяку логіку для виконання, і компілятор визначає, як використовувати доступні інструкції машини для реалізації цієї логіки. У цьому випадку те, що ви програмуєте, - це функція компілятора, а не нативний набір інструкцій мікро.

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

Хоча мова високого рівня може бути однаковою для дуже різних мікросхем, інструкції на машині, як правило, лише подібні в сімействі пов'язаних мікросхем. Наприклад, усі мікрочіпи PIC 18 мають однаковий набір інструкцій (в основному), який відрізняється від базового PIC 16 і знову відрізняється від 16-бітових частин, таких як PIC 24 і dsPIC 30 і 33.


1
Асемблер також вирішує мітки для операторів стрибків, що дуже схильне до помилок, коли це робиться вручну.
Піт Бекер

2

Мова програмування все ще є C. Але бібліотека виробника для доступу до апаратних засобів відрізняється. Наскільки я знаю, немає стандарту, тому кожен виробник має свій API. Якщо ви хочете бути портативними між різними виробниками, ви можете представити свій власний абстрактний API для доступу до апаратних засобів із конкретними реалізаціями, які відображають ваш API для конкретних виробників методів.


Насправді це більше C. Це C ++ (або, можливо, підмножина C ++).
Пітер Мортенсен

2

Інші відповіді розрізняють мови високого рівня (наприклад, C ++) та машинний код, хоча я не вважаю, що це визнає недійсним ваше твердження про те, що кожен мікроконтролер має асоційовану "мову".

Різниці в мовних реалізаціях недостатньо великі, щоб їх можна класифікувати як різні мови, хоча я б не вагаючись розмежувати їх на «діалекти». Тут можуть існувати два шари змін.

  1. Бібліотеки обгортки високого рівня можуть бути доступні у виробника чи іншої сторони
  2. Деякі компілятори можуть не видавати код, що відповідає стандарту

Візьмемо ці точки, спостерігаючи за платформою Arduino.

  • Спільнота Arduino надає сильно абстраговані бібліотеки C ++ для мікросхем архітектури AVR. Ці бібліотеки пропонують інший потік управління від того, що можна очікувати від типової програми C ++ (наприклад, приховування main ()).
  • Під кришкою Arduino збирає свій код за допомогою avr-gcc, який випромінює код C / C ++. Однак винятки не підтримуються на чіпах AVR і майже завжди відключені. Якщо така велика функція відсутня, результуюча програма може не діяти так, як "звичайна" програма C ++.

Знаючи це, як ви вирішите, як запрограмувати будь-який довільний мікроконтролер? У вас є кілька варіантів:

  1. Шукайте створені спільнотою бібліотеки та IDE для вашого конкретного чіпа. AVR-мікросхеми іноді розробляються з використанням лише C, але проект Arduino забезпечує більш зручне користування для любителів.
  2. Знайдіть компілятори, які можуть скласти для вашого конкретного чіпа. За допомогою відповідного компілятора, таблиць даних вашого чіпа та деякої кількості терпіння ви зможете написати код дуже близький до металу.

Для довідки, ось список підтримуваних програм для GCC. Ви помітите, що існує підтримка ARM, AVR, MIPS та декількох інших.

Про мікросхеми, які не запрограмовані за допомогою "програмного забезпечення" ...

Можливо, ви захочете заглянути в програмовані на місцях масиви воріт (FPGA)! FPGA управляються зміною значень оглядових таблиць, щоб імітувати логічні ворота. Вона сама по собі не має відповідної форми програмного забезпечення, але все ще розробляється з використанням апаратних мов опису, таких як VHDL та Verilog.


1

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

Ось ще один приклад: ця веб-сторінка використовує англійський алфавіт та англійські слова. Так робить веб-сайт Нью-Йорк Таймс, чи це робить цей веб-сайт часом Нью-Йорк? Ні, вони просто поділяють один і той же алфавіт і мову, але в іншому випадку абсолютно різні.

C - мова програмування загального призначення, яка абстрагує набір інструкцій під ним. Може використовуватися для чистого металу, може використовуватися для створення різних і несумісних між собою операційних систем, може використовуватися для створення відеоігор тощо. Всі вони використовують одну і ту ж основну мову С, деякі загальні функції С і конструкції, а також створені ними функціональні виклики, характерні для цільової програми. Для кожної з тих платформ, про яких ви згадуєте, або інших, може бути набір функцій, які хтось вирішив створити. Так само, як небагатьох людей, включаючи мене, я дав вам таку ж відповідь, але написав її по-іншому. Візьміть 100 програмістів і ізолюйте їх один від одного і дайте їм завдання програмування для вирішення певної проблеми, не обмежуючи повністю їхньої свободи програмування, і ви отримаєте десь від 1 до 100 різних, несумісних між собою рішень, швидше за все, не 1, а декількох загальних тем, залежно від їхньої підготовки та досвіду, а потім імена змінних і назви функцій, які як набір, ймовірно, унікальні для кожної людини. Візьміть ті самі дошки, про які ви вже говорите, і ви побачите, що я, безумовно, маю власний код C, який є несумісним (з функціями arduino), щоб працювати на них, як і на багатьох інших, а також несумісний з іншими платформами. У цьому полягає краса вбудованого програмного забезпечення з голого металу, ви ні в якому разі не обмежуєтесь, вам не доведеться жити в рамках стандартних викликів бібліотеки операційних систем або обмеженого набору правил тощо. Повна свобода. ймовірно, не 1, а кілька загальних тем, залежно від їхньої підготовки та досвіду, а потім імена змінних та назви функцій, які як набір, ймовірно, унікальні для кожної людини. Візьміть ті самі дошки, про які ви вже говорите, і ви побачите, що я, безумовно, маю власний код C, який є несумісним (з функціями arduino), щоб працювати на них, як і на багатьох інших, а також несумісний з іншими платформами. У цьому полягає краса вбудованого програмного забезпечення з голого металу, ви ні в якому разі не обмежуєтесь, вам не доведеться жити в рамках стандартних викликів бібліотеки операційних систем або обмеженого набору правил тощо. Повна свобода. ймовірно, не 1, а кілька загальних тем, залежно від їхньої підготовки та досвіду, а потім імена змінних та назви функцій, які як набір, ймовірно, унікальні для кожної людини. Візьміть ті самі дошки, про які ви вже говорите, і ви побачите, що я, безумовно, маю власний код C, який є несумісним (з функціями arduino), щоб працювати на них, як і на багатьох інших, а також несумісний з іншими платформами. У цьому полягає краса вбудованого програмного забезпечення з голого металу, ви ні в якому разі не обмежуєтесь, вам не доведеться жити в рамках стандартних викликів бібліотеки операційних систем або обмеженого набору правил тощо. Повна свобода. Візьміть ті самі дошки, про які ви вже говорите, і ви побачите, що я, безумовно, маю власний код C, який є несумісним (з функціями arduino), щоб працювати на них, як і на багатьох інших, а також несумісний з іншими платформами. У цьому полягає краса вбудованого програмного забезпечення з голого металу, ви ні в якому разі не обмежуєтесь, вам не доведеться жити в рамках стандартних викликів бібліотеки операційних систем або обмеженого набору правил тощо. Повна свобода. Візьміть ті самі дошки, про які ви вже говорите, і ви побачите, що я, безумовно, маю власний код C, який є несумісним (з функціями arduino), щоб працювати на них, як і на багатьох інших, а також несумісний з іншими платформами. У цьому полягає краса вбудованого програмного забезпечення з голого металу, ви ні в якому разі не обмежуєтесь, вам не доведеться жити в рамках стандартних викликів бібліотеки операційних систем або обмеженого набору правил тощо. Повна свобода.

Ви можете вибрати, і великий відсоток людей, щоб грати в когось іншу пісочницю, а не створювати свою власну, тобто використовувати ардуїно-гуї та їх бібліотеки С.

Ви можете взяти один і той самий ПК та запустити різні версії windows it, linux, bsd та список білизни інших операційних систем, які на певному рівні використовують C, але виклики функцій яких несумісні між собою. Той самий апаратний та несумісний C, який поширюється на різні апаратні засоби, однакова мова, може мати сумісний або несумісний код. Мова жодним чином не робить їх сумісними.

C використовується на цих вбудованих платформах, тому що це звичайна практика, немає іншої мови, яка може замінити C для цього. Перший крок для нового процесора - це збірка, звичайно, потім майже завжди є С наступним, потім, можливо, інші, якщо він достатньо потужний для роботи операційної системи (Linux, bsd тощо). C був винайдений і сподівався вирішити проблему переносу коду на платформи на той час, і поки у вас є операційна система, це компілятор, сумісний з C, що робить код, який запускається в операційній системі, буде робити стандартний файл C операції та printf тощо. Але голий метал - це вже інша історія, немає операційної системи, часто немає поняття файлової системи та дисплея, але, як правило, існує компілятор C, який у своїх коренях перетворює C на цільову мову монтажу.


Власне, для Arduino це більше, ніж C. Це C ++ (або, можливо, підмножина C ++).
Пітер Мортенсен

1

Щоб відповісти на ваше друге запитання, термін "мікроконтролер" означає, що на мікросхемі є процесор і оперативна пам'ять (і, можливо, ROM). Всі мікроконтролери запускають програмне забезпечення - саме тому вони нам подобаються.

Заглиблюючись у перше питання, зауважте, що хоча (майже?) Всі MCU мають компілятор C, основна мова C не підтримує будь-яку інструкцію на кожному процесорі. Наприклад, C має операторів зсуву ліворуч / праворуч, але операторів ліво / праворуч не обертати. Система покажчиків C, природно, не підтримує окремих програмних та адресних просторів даних (як у деяких Гарвардських архітектурах). C не має прямої підтримки SIMD.

У компіляторів є кілька варіантів поводження з цими можливостями:

  1. Розширюйте основну мову, як правило, за допомогою нових ключових слів (наприклад, поблизу та вдалині пам’яті з підказками).

  2. Надайте внутрішні функції (наприклад, __ror () та __rol () для обертання).

  3. Опрацюйте їх в оптимізаторі, щоб послідовності операцій на C збиралися в одну ефективну інструкцію (наприклад, множення / накопичення).

  4. Ігноруйте їх і змушуйте користувача написати код збірки, якщо вони хочуть нестандартні функції.

Наступний рівень вгору - надані виробником файли заголовків, які в основному визначають всі регістри для вас. Ви можете зробити це самостійно, але це великий біль, якщо ви не фахівець з цього MCU.

Нарешті, є бібліотечні функції, що надаються виробником, які обробляють такі дрібниці, як запис у регістрі.

Ваш приклад змішує два рівні. DDR - макрос, який посилається на регістр. Він реалізований як доступ до вказівника, або внутрішня функція компілятора (я забуваю, який). pinMode () - це функція, яка записує в регістр DDR для вас.

Коли ви переходите від однієї лінії MCU до іншої, вам доведеться вивчити нові регістри та нові химерності компілятора. Якщо ви залишаєтесь в одній компанії, ви можете отримати аналогічний API. Різні компанії не діляться API; чому ми допоможемо вам перейти на наших конкурентів? :-)


1

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

C і Forth розроблені свідомо, щоб легко переноситися через різні набори машинного коду.

Отже, якщо ви використовуєте C на Arduino і C на Teensy, ви використовуєте C в обох випадках.

Якби ви використовували Forth на Arduino і Forth на Teensy, ви б використовували Forth в обох випадках.

Іноді додаткові апаратурні засоби спонукають людину (або групу), що переносить мову на нове обладнання, написати якийсь попередньо виготовлений код, що дозволить вам отримати доступ до нових можливостей апаратної платформи, без необхідності писати багато коду низького рівня. себе.

Ці бібліотеки (в С) або словники (у Форті) можуть мати деякі апаратні функції або слова в них.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.