Чи передбачено налаштування та цикл для зручності?


13

Ескізи Ардуїно, як правило, мають функцію a setupі loop. Чи передбачені ці функції лише для зручності чи вони насправді мають спеціальні цілі? (наприклад: чи деякі операції заборонені або дозволені в налаштуваннях і циклі)

Ці дві частини кодового еквівалента:

Класичний

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}

Без петлі

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    while(true) {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);
    }
}


void loop() {
}

Чи можливо записати код без установки або циклу, передбачивши, наприклад, mainметод чи іншу точку введення?

Відповіді:


10

Ці фрагменти коду майже однакові.

Якщо ви подивитеся на вихідний код Arduino, ви побачите:

setup();

for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
}

(Я не впевнений, що serialEventRun()робить.)

Я не думаю, що ви можете «перевантажувати» mainдекларацію функції. Також зауважте, що основна функція дзвінків init, яка, наприклад, налаштовує таймери, millis()тощо, буде працювати.


9

Чи передбачені ці функції лише для зручності чи вони насправді мають спеціальні цілі?

Бібліотеки Arduino ведуть невеликий домоводство loop(), пов'язане з серійною обробкою .

Ці дві частини кодового еквівалента:

Тільки якщо ви ніколи не використовуєте серійні події.

Чи можливо записати код без установки або циклу, надаючи, наприклад, основний метод або іншу точку введення?

Не суворо використовуючи бібліотеки Arduino через IDE; лінкер поскаржиться або на повторювані mainвизначення, або на відсутні, setupабо на loopвизначення.


2

Чи можливо записати код без установки або циклу, надаючи, наприклад, основний метод або іншу точку введення?

Востаннє, коли я використовував IDE, у вас міг бути проект без файлу .ino/ .pdeфайл, лише .cppфайли; так як саме керування функцією .inoa .cppвизначає mainфункцію, якщо ви обійдете цей крок, то ви можете визначити свій власний main.

Якщо IDE більше не дозволяє цього (як я чув), ви все одно можете зробити те ж саме, наприклад, на основі Makefile-побудови поза IDE, не відмовляючись від бібліотек Arduino. Мені відомі застереження:

  • Ви повинні, #include "Arduino.h"якщо хочете отримати доступ до функцій бібліотеки.
  • Вам слід зателефонувати, init()якщо ви хочете, щоб бібліотека налаштувала периферійні пристрої так, як ви звикли.
  • Ви повинні поставити serialEventкод, який Гербен вказує у вашій основній версії, якщо ви хочете працювати з serialEventобробником (але вам це, мабуть, не потрібно, якщо ви хочете написати свій основний цикл).

1

Ескізи Ардуїно зазвичай мають функцію настройки та циклу. Чи передбачені ці функції лише для зручності чи вони насправді мають спеціальні цілі?

Вони вводять додатковий виклик функції, initякий ініціалізує таймери, які пускають millis, microsі delayпрацюють без додаткових зусиль. Крім цього, немає.

Цей код компілюється (і працює) під IDE:

int main ()
  {
  }

Ефективно IDE генерує такий код:

int main ()
  {
  init ();  // set up timers
  setup (); // your own initialization
  while (true)
    loop ();  // stuff you want to keep doing
  }

З того часу вони поспілкувалися з цим, як сказав Ігнасіо Васкес-Абрамс, але в основному це можна ігнорувати. Немає нічого особливо особливого в setupі loop.

Ви можете використовувати так, mainяк я показав вище. Ви можете робити все, setupякщо хочете. Ви можете робити все, loopякщо захочете (якщо з нього ніколи не повернетесь).

Пам'ятайте, ви маєте справу з компілятором C ++. Функції не мають якогось магічного значення залежно від їх імен.

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