Почему такая большая разница в размере двоичного кода?

Тема в разделе "Arduino & Shields", создана пользователем pyro, 16 дек 2012.

  1. pyro

    pyro Гик

    Вот две программы, выполняющие одно и тоже, но размер первой 1 076 байт, а второй - 214 байт.
    Код (Text):
    void setup()
    {
      pinMode(13, OUTPUT);
    }
    void loop()
    {
      digitalWrite(13, HIGH);
      delay(1000);
      digitalWrite(13, LOW);
      delay(1000);
    }

    Код (Text):
    #include <avr/io.h>
    #include <avr/delay.h>
    int main(void)
    {        
      DDRB = 0xff;     
      while (1)
      {                        
        PORTB = 0b00100000;                    
        _delay_ms(1000);                       
        PORTB = 0b00000000;                    
        _delay_ms(1000);               
      }  
    }
     
  2. Dmitriy Kunin

    Dmitriy Kunin Гик

    Это плата за удобство програмирования, для тех людей, которым собственно и адресована плата Ардуино вместе с IDE и стандартной библиотекой.
    Проект Ардуино задуман, как удобный конструктор, для людей которым надо помигать парой светодиодов, и покрутить одним моторчиком или сервоприводом. Заботиться о занятой памяти и быстродействии не приходится, и так хватает с запасом.
    Задача Ардуино вовлечь в электронику и програмирование людей креативных, но далёких от техники, второй вариант записи их просто отпугнёт.
    Когда мне понадобилось быстро помигать восьмью светодиодами, уменя случился ступор, я смотрел на референсную реализацию языка програмирования для Ардуино, и думал, наверно это возможно, но очень трудно. Ведь главное отличие второго варианта, что можно писать одновременно состояние всего порта, всех восьми светодиодов, мне так думать проще, но я железячник.
     
  3. Dmitriy Kunin

    Dmitriy Kunin Гик

    Небольшое дополнение, если пользоваться прямой записью в порт, придётся читать документацию по контроллеру и плате Ардуино. Не все выводы всех портов контроллера равнозначны и равноценны, в некоторые нельзя писать, поэтому найти целиком доступный порт, все 8 выводов задача не простая :)
    А два порта рядом, увы нельзя совсем, а было-бы так удобно...
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    В дополнение к сказанному Дмитрием. Простые функции вроде `pinMode`, `digitalWrite` при компиляции тянут за собой большую портянку функций, используемых библиотекой Wiring/Arduino. Использовав их единожды вы тянете за собой overhead фиксированного размера.

    Написанная с помощью wiring, да, будет больше в размере, но её размер не будет расти так драматично, как в простых примерах вроде того, что вы привели.