Я запрограммировал Arduino и начал программировать Teensy. Они похожи на C, но в языке программирования есть небольшие нюансы.
Например, в C Arduino вы вызываете функцию pinMode (pin #, Output / Input) для обозначения цифрового вывода либо для выходных сигналов, либо для получения сигналов. В C Teensy вы устанавливаете регистр «DDR», связанный с одним из четырех портов (каждый из которых представляет собой набор выводов), которые вы вместе обозначаете как вход или выход ( синтаксис Teensy IO ).
Я хотел бы знать, если вы используете новый для вас микроконтроллер, вам нужно эффективно выучить новый «язык». Я поместил слово «язык» в кавычки, потому что, несмотря на нюансы в синтаксисе, компоненты и то, как они настроены в программном обеспечении, в основном эквивалентны, например, понятие портов и выводов по-прежнему относится к терминалу, из которого можно выводить / вводить цифровой сигналы.
В том же напрасном разговоре: существуют ли микроконтроллеры, которые не запрограммированы в программном обеспечении, или всегда будет программный уровень, используемый для программирования uController? Если последнее, кто пишет / предоставляет документацию для них?
источник
Ответы:
Микропроцессоры и микроконтроллеры обычно используют общую архитектуру для разных линий продуктов и производителей. Эти архитектуры обычно определяют набор команд низкого уровня ( набор команд ), общий для всех реализаций. Компилятор AC или C ++ сможет генерировать исполняемый байт-код на всех, например, процессорах ARM.
Однако архитектура - это только половина картины. Поскольку существует много конкретных адресов памяти, встроенных периферийных устройств, управления памятью и других деталей реализации, которые архитектура не учитывает
Производитель или третья сторона обычно предоставляют набор исходных файлов ( HDK ), которые предоставляют определения, сопоставления портов и пример кода. Обычно HDK для C и C ++ . Как правило, HDK имеет демонстрационную плату, связанную с ним (например, $ 500 arduino). Часто для настройки платформы разработки / примера под устройство, которое вы разрабатываете, часто требуется много подробных настроек.
Arduino основан на архитектуре AVR и в основном поддерживается Atmel. Arduino создал загрузчик платформы и библиотеку упрощенных функций и объектов C ++, чтобы вы могли использовать платформу с минимальными усилиями. Платформа Arduino и IDE предназначены для любителей с минимальным оснащением. До появления Arduino PIC выполнял аналогичную роль с простой в использовании и дешевой средой BASIC.
В профессиональной среде, как правило, эта поддержка предоставляется поставщиком / производителем или предоставляется третьей стороне. Они предоставляют код низкого уровня и заголовки, и вы пишете свое приложение с этим HDK, в больших организациях это можно сделать своими силами. В последнее время производители стали создавать открытую экосистему API / Software вокруг своей платформы, которая делает их такими же простыми в использовании, как и Arduino. По-прежнему существует бесчисленное количество микросхем с очень незначительной поддержкой программирования, и большая часть знаний о платформе заперта в корпоративном мире.
источник
Язык в этом случае точно такой же. В среде Arduino есть несколько дополнительных библиотек (просто больше кода C), которые «оборачивают» доступ к фактическим аппаратным регистрам (DDRx, PORTx, INx и т. Д.) С немного более удобными для пользователя функциями. Это увеличивает накладные расходы (необходимо выполнить больше инструкций для одной и той же операции), но увеличивает гибкость, поскольку «просто» написать программу, использующую только эти вызовы, а затем перенастроить ее для другого чипа (скажем, мега-Arduino) и библиотека будет обрабатывать правильное отображение внутри.
На самом деле не существует никаких «стандартных» API-интерфейсов для действительно низкоуровневого доступа к чипам разных производителей. Однако весь низкоуровневый доступ выполняется одинаково - чтение и запись по фиксированным адресам памяти - поэтому общий метод доступа будет одинаковым для разных частей, только детали и имена будут разными. Возможно, кто-то просто предоставит заголовочные файлы с огромными списками адресов регистров #defines, приведенных к указателям. Или, возможно, заголовочные файлы будут использовать структуры, чтобы организовать вещи с некоторой иерархией. Некоторые производители также могут предоставлять API более высокого уровня. Это может быть очень полезно для периферийных устройств, которые являются сложными и сложными в настройке. GPIO очень прост, но что-то вроде USB-контроллера с поддержкой DMA может иметь сотни регистров.
Таким образом, суть в том, да, вам нужно будет выучить несколько новых имен регистров, но язык все еще C ++ (или C, сборка, или, возможно, что-то более эзотерическое).
источник
main()
предопределенным для вас. Вместо этого вы получаете две точки входа:init()
иloop()
(поправьте меня, если я ошибаюсь, но я только коснулся Ардуино с 20-Вы путаете микроконтроллеры и компиляторы. Языки высокого уровня, на которых вы можете запрограммировать любой конкретный микро, зависят от того, какие компиляторы доступны для этого микро.
На низком уровне микро выполняет машинные инструкции, которые компилятор выводит для текстового файла, который вы даете ему, который вы считаете «программой». Вы действительно указываете какую-то логику для выполнения, и компилятор выясняет, как использовать доступные машинные инструкции для реализации этой логики. В этом случае то, что вы программируете, является функцией компилятора, а не нативного набора команд micro.
Вы можете запрограммировать микро, указав родные инструкции напрямую. Это делается с использованием ассемблера. Как и компилятор, ассемблер - это переводчик, который берет текстовый файл, который вы пишете, и в результате выдает машинные инструкции. Разница в том, что в этом случае вы указываете эти машинные инструкции напрямую. Каждой инструкции присваивается имя, и вы пишете эти имена вместо двоичных кодов операций, но вы по-прежнему указываете инструкции напрямую. Ассемблер выполняет основную работу по выяснению точного двоичного кодирования каждой инструкции из имени и опций, которые вы пишете в текстовом файле.
Хотя язык высокого уровня может быть одинаковым для очень разных микро, машинные инструкции обычно похожи только в семействе смежных микро. Например, все микросхемы PIC 18 имеют одинаковый набор инструкций (в основном), который отличается от базового PIC 16 и снова отличается от 16-битных частей, таких как PIC 24 и dsPIC 30 и 33.
источник
Язык программирования по-прежнему C. Но библиотека производителя для доступа к оборудованию отличается. Насколько я знаю, стандарта нет, поэтому у каждого производителя свой API. Если вы хотите быть переносимыми между разными производителями, вы можете захотеть ввести свой собственный абстрактный API для доступа к оборудованию с конкретными реализациями, которые сопоставляют ваш API со специфическими для производителя методами.
источник
В других ответах проводится различие между языками высокого уровня (такими как C ++) и машинным кодом, хотя я не считаю, что это делает недействительным ваше утверждение о том, что у каждого микроконтроллера есть связанный «язык».
Различия в языковых реализациях не настолько велики, чтобы их можно было классифицировать как разные языки, хотя я без колебаний разделил бы их на «диалекты». Здесь могут существовать два слоя изменений.
Давайте рассмотрим эти моменты, наблюдая за платформой Arduino.
Зная это, как вы решаете, как запрограммировать любой произвольный микроконтроллер? У вас есть несколько вариантов:
Для справки вот список поддерживаемых бэкэндов для GCC. Вы заметите, что есть поддержка ARM, AVR, MIPS и некоторых других.
О чипах, которые не запрограммированы с помощью "программного обеспечения" ...
Возможно, вы захотите взглянуть на программируемые пользователем вентильные матрицы (FPGA)! Управление ПЛИС осуществляется путем изменения значений справочных таблиц для имитации логических элементов. По сути, он не имеет соответствующей формы программного обеспечения, но все еще разрабатывается с использованием языков описания оборудования, таких как VHDL и Verilog.
источник
Я смотрю на одну печатную плату и вижу некоторые устройства для поверхностного монтажа, некоторые резисторы, конденсаторы и светодиоды. Означает ли это, что, поскольку одна из этих плат является видеокартой, все платы с резисторами и конденсаторами, а также несколькими слоями и трассами являются видеокартами? Неа.
Вот еще один пример, эта веб-страница использует английский алфавит и английские слова. Так что же делает сайт Нью-Йорк Таймс, делает ли он этот сайт Нью-Йорк Таймс? Нет, они просто используют один и тот же алфавит и язык, но в остальном они совершенно разные.
C - это язык программирования общего назначения, который абстрагирует набор инструкций под ним. Может использоваться для чистого металла, может использоваться для создания различных и несовместимых друг с другом операционных систем, может использоваться для создания видеоигр и т. Д. Все из которых используют один и тот же базовый язык C, некоторые общие функции и конструкции C, а также Созданные ими вызовы функций, специфичные для целевого приложения. Для каждой из упомянутых вами платформ или других может быть набор функций, которые кто-то решил создать. Также как кучка людей, включая меня, дали вам тот же ответ, но написали его по-другому. Возьмите 100 программистов, изолируйте их друг от друга и дайте им задачу программирования для решения конкретной проблемы, не ограничивая полностью их свободу программирования, и вы получите от 1 до 100 различных, несовместимых друг с другом решений, вероятно, не 1, а несколько общих тем в зависимости от их обучения и опыта, а затем имена переменных и имен функций, которые в виде набора, вероятно, уникальны для каждого человека. Возьмите те же платы, о которых вы уже говорили, и вы обнаружите, что у меня, безусловно, есть свой собственный C-код, который несовместим (с функциями arduino) для запуска на них, как и со многими другими, а также несовместим с другими платформами. В этом и заключается прелесть встроенного программирования на «голое железо», вы никоим образом не ограничены, вам не нужно жить в рамках вызовов стандартных библиотек операционных систем или ограниченного набора правил и т. Д. Полная свобода. скорее всего, не 1, а несколько общих тем в зависимости от их подготовки и опыта, а затем имена переменных и имен функций, которые в виде набора, вероятно, уникальны для каждого человека. Возьмите те же платы, о которых вы уже говорили, и вы обнаружите, что у меня, безусловно, есть свой собственный C-код, который несовместим (с функциями arduino) для запуска на них, как и со многими другими, а также несовместим с другими платформами. В этом и заключается прелесть встроенного программирования на «голое железо», вы никоим образом не ограничены, вам не нужно жить в рамках вызовов стандартных библиотек операционных систем или ограниченного набора правил и т. Д. Полная свобода. скорее всего, не 1, а несколько общих тем в зависимости от их подготовки и опыта, а затем имена переменных и имен функций, которые в виде набора, вероятно, уникальны для каждого человека. Возьмите те же платы, о которых вы уже говорили, и вы обнаружите, что у меня, безусловно, есть свой собственный C-код, который несовместим (с функциями arduino) для запуска на них, как и со многими другими, а также несовместим с другими платформами. В этом и заключается прелесть встроенного программирования на «голое железо», вы никоим образом не ограничены, вам не нужно жить в рамках вызовов стандартных библиотек операционных систем или ограниченного набора правил и т. Д. Полная свобода. Возьмите те же платы, о которых вы уже говорили, и вы обнаружите, что у меня, безусловно, есть свой собственный C-код, который несовместим (с функциями arduino) для запуска на них, как и со многими другими, а также несовместим с другими платформами. В этом и заключается прелесть встроенного программирования на «голое железо», вы никоим образом не ограничены, вам не нужно жить в рамках вызовов стандартных библиотек операционных систем или ограниченного набора правил и т. Д. Полная свобода. Возьмите те же платы, о которых вы уже говорили, и вы обнаружите, что у меня, безусловно, есть свой собственный C-код, который несовместим (с функциями arduino) для запуска на них, как и со многими другими, а также несовместим с другими платформами. В этом и заключается прелесть встроенного программирования на «голое железо», вы никоим образом не ограничены, вам не нужно жить в рамках вызовов стандартных библиотек операционных систем или ограниченного набора правил и т. Д. Полная свобода.
Вы можете выбрать, как это делают многие, играть в чужой песочнице, а не создавать свою собственную, то есть использовать графический интерфейс arduino и их библиотеки C.
Вы можете взять один и тот же компьютер и запустить разные версии windows it, linux, bsd и список других операционных систем, которые на каком-то уровне используют C, но чьи вызовы функций несовместимы друг с другом. Одинаковое оборудование и несовместимый C, который распространяется на другое оборудование, на одном языке, может иметь совместимый или несовместимый код. Язык никоим образом не делает их совместимыми.
C используется на этих встроенных платформах, потому что это обычная практика, нет другого языка, который мог бы заменить C для этого. Первый шаг для нового процессора - это, конечно, сборка, затем почти всегда следующий C, затем, возможно, другие, если он достаточно мощный для запуска операционной системы (linux, bsd и т. Д.). C был изобретен и надеялся решить на тот момент проблему переноса кода между платформами, и, пока у вас есть операционная система, как в случае C-совместимого компилятора, создающего код, который запускается в операционной системе, будет выполнять стандартный файл C операции и printf и тому подобное. Но голый металл - это отдельная история: нет операционной системы, часто нет понятия ни о файловой системе, ни о дисплее, но по общепринятой практике, скорее всего, есть компилятор C, который в своих корнях превращает C в целевой язык ассемблера.
источник
Чтобы ответить на ваш второй вопрос, термин «микроконтроллер» подразумевает, что чип имеет на борту ЦП и ОЗУ (и, возможно, ПЗУ). Все микроконтроллеры работают на программном обеспечении - вот почему они нам нравятся.
Если углубиться в первый вопрос, отметим, что хотя (почти?) Все MCU имеют компилятор C, базовый язык C поддерживает не все инструкции на каждом процессоре. Например, в C есть операторы сдвига влево / вправо, но нет операторов поворота влево / вправо. Система указателей C естественно не поддерживает отдельные адресные пространства программ и данных (как в некоторых Гарвардских Архитектурах). C не имеет прямой поддержки SIMD.
Компиляторы имеют несколько вариантов работы с этими функциями:
Расширяйте базовый язык, обычно с новыми ключевыми словами (например, рядом и далеко для постраничных воспоминаний).
Предоставить встроенные функции (например, __ror () и __rol () для вращения).
Работайте с ними в оптимизаторе так, чтобы последовательности операций C были скомпилированы в одну эффективную инструкцию (например, умножение / накопление).
Игнорируйте их и заставьте пользователя писать код сборки, если им нужны нестандартные функции.
Следующий уровень - это предоставленные производителем заголовочные файлы, которые в основном определяют все регистры для вас. Вы можете сделать это сами, но это большая боль, если вы не являетесь экспертом в этом MCU.
Наконец, есть предоставляемые производителем библиотечные функции, которые обрабатывают такие мелочи, как запись в регистр.
Ваш пример смешивает два уровня. DDR - это макрос, который ссылается на регистр. Он реализован как указатель доступа или встроенная функция компилятора (я забыл, какая). pinMode () - это функция, которая пишет для вас в регистр DDR.
Когда вы переходите от одной строки MCU к другой, вам придется изучать новые регистры и новые особенности компилятора. Если вы останетесь в той же компании, вы можете получить аналогичный API. Разные компании не делятся API; Почему мы помогаем вам перейти на наших конкурентов? :-)
источник
Микроконтроллеры часто имеют разные микрокоды на аппаратном уровне. Чтобы избавить нас от ввода машинного кода (т. Е. Инструкций в форме чисел - каждая из которых представляет необработанный микрокод микроконтроллера) или в символическом ассемблере (который обеспечивает мнемоническую метку для каждой инструкции машинного кода), используются переносные языки высокого уровня.
C и Forth разработаны специально для того, чтобы их можно было легко переносить между различными наборами машинных кодов.
Поэтому, если вы используете C на Arduino и C на Teensy, вы используете C в обоих случаях.
Если бы вы использовали Forth на Arduino и Forth на Teensy, вы бы использовали Forth в обоих случаях.
Иногда дополнительные аппаратные средства побуждают человека (или группу), переносящего язык на новое аппаратное обеспечение, написать некоторый заранее изготовленный код, чтобы позволить вам получить доступ к новым возможностям аппаратной платформы, без необходимости писать много низкоуровневого кода. себя.
Эти библиотеки (в C) или словари (в Forth) могут содержать некоторые аппаратные функции или слова.
источник