Что за особый язык программирования используется для Arduino?

    Хочется прояснить ситуацию с так называемым «языком программирования Arduino», который «основан на Wiring». Подобные сочетания слов часто встречаются на страничках, посвященных Arduino. На официальном сайте так и пишут: "...is programmed using the Arduino programming language (based on Wiring)". По факту нет никакого особого языка программирования, и фактически программы пишутся на C/C++, а компилируются и собираются с помощью широко известного avr-gcc.
    Все особенности сводятся к тому, что имеется набор библиотек, включающий в себя некоторые функции (вроде pinMode) и объекты (вроде Serial), а при компиляции Вашей программы среда разработки создает временный .cpp файл, в который кроме Вашего кода включается еще несколько строчек, и полученный результат скармливается компилятору а затем линковщику с нужными параметрами.
    Для примера можно создать маленький проект с любым именем, добавить туда минимум кода, например так:
    --- Test.pde ---
    void setup() {
      pinMode(13, OUTPUT);
    }
    
    void loop()
    {
      digitalWrite(13, 1);
      delay(500);
      digitalWrite(13, 0);
      delay(500);
    }
    ---
    

    Если теперь «зашить» полученную программу в Arduino, то в папке с проектом появится папка «applet», а в ней куча файлов. В основном это объектники, содержащие скомпилированные стандартные функции, а также готовая скомпилированная программа в разных форматах (ELF, ROM, HEX). Самым интересным является .cpp файл — это то, во что превратился наш код:
    --- Test.cpp ---
    #include "WProgram.h"     // тут определения всех Arduino ф-ий, констант и т.д.
    void setup();             // объявляют ф-ии setup() и loop(), в которых наша
    void loop();              // программа для Arduino и пишется
    void setup() {            // --- а вот с этого места пошел наш исходник ---
      pinMode(13, OUTPUT);
    }
    
    void loop()
    {
      digitalWrite(13, 1);
      delay(500);
      digitalWrite(13, 0);
      delay(500);
    }                         // здесь наш код кончился, опять пошли "довески"
    
    int main(void)            // здесь как и принято в c/c++ ф-ия main()
    {
    	init();               // в ней вызывается своя инициализация
    
    	setup();              // затем вызывается наш setup()
        
    	for (;;)              // и в бесконечном цикле вызывается наш loop()
    		loop();
            
    	return 0;             // а сюда вообще никогда не попадаем
    }
    ---
    

    На самом деле среда Arduino делает еще какие-то мелкие преобразования исходного кода, например декорирует не латинские символы, выносит все "#include" наверх, может еще какие-то мелочи, но идея остается той же самой.
    Share post

    Comments 2

      0
      Т.е. по сути — еще один препроцессор текста, если я правильно понял вас и документацию на сайте.

      Однако еще один препроцессор — nesC — на фоне Wiring/С смотрится приятнее. Там есть и модули (аналог объектов/компонент), и интерфейсы (как протоколы компонентов). А это означает более приближенную у ООП парадигму написания кода и более естественную модель повторного использования.

      Учитывая, что и там, и там выход препроцессора затем обрабатывается при помощи avr chaintools, есть шанс прикрутить nesC к arduino.

      Надеюсь, на этой неделе руки дойдут :)
        0
        и дошли руки?

      Only users with full accounts can post comments. Log in, please.