Функция yield() и ошибка: Error: constant value required

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

Здравствуйте!



При компиляции появляется ошибка "Error: constant value required".

Она исчезает, если из сприпта убрать вызов yield(). Но этот вызов нужен для библиотеки <Scheduler.h>.



Как это исправить?



Привожу листинг вывода при компиляции:

 

 Executing task in folder 210202-083254-uno: C:\Users\khusamov\.platformio\penv\Scripts\pio.exe run <

Processing uno (platform: atmelavr; board: uno; framework: arduino)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via [ICODE]-v, --verbose[/ICODE] option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (3.1.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES:
[LIST]
[*]framework-arduino-avr 5.1.0
[*]toolchain-atmelavr 1.50400.190710 (5.4.0)
[/LIST]
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 9 compatible libraries
Scanning dependencies...  
Dependency Graph
|-- <Scheduler> 0.4.4
|-- <bmp085>
|   |-- <Wire> 1.0  
|-- <dht11> 0.4.1    
|-- <LiquidCrystalRus>
Building in release mode
Compiling .pio\build\uno\src\Meteo_v1.cpp.o
Linking .pio\build\uno\firmware.elf
C:\Users\khusamov\AppData\Local\Temp\ccOWBOlh.s: Assembler messages:
C:\Users\khusamov\AppData\Local\Temp\ccOWBOlh.s:2178: Error: constant value required
lto-wrapper.exe: fatal error: avr-g++ returned 1 exit status
compilation terminated.
c:/users/khusamov/.platformio/packages/toolchain-atmelavr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\uno\firmware.elf] Error 1
=========================================================================================================================================== [FAILED] Took 2.06 seconds ===========================================================================================================================================The terminal process "C:\Users\khusamov\.platformio\penv\Scripts\pio.exe 'run'" terminated with exit code: 1.

Terminal will be reused by tasks, press any key to close it.

Также привожу сам скрипт:

 

#include <Scheduler.h>

int led1 = 13;
int led2 = 12;
int led3 = 11;

void loop2();
void loop3();

void setup() {
  Serial.begin(9600);

  // Setup the 3 pins as OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  // Add "loop2" and "loop3" to scheduling.
  // "loop" is always started by default.
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}

// Task no.1: blink LED with 1 second delay.
void loop() {
  digitalWrite(led1, HIGH);

  // IMPORTANT:
  // When multiple tasks are running 'delay' passes control to
  // other tasks while waiting and guarantees they get executed.
  delay(1000);

  digitalWrite(led1, LOW);
  delay(1000);
}

// Task no.2: blink LED with 0.1 second delay.
void loop2() {
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
}

// Task no.3: accept commands from Serial port
// '0' turns off LED
// '1' turns on LED
void loop3() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '0') {
      digitalWrite(led3, LOW);
      Serial.println("Led turned off!");
    }
    if (c == '1') {
      digitalWrite(led3, HIGH);
      Serial.println("Led turned on!");
    }
  }

  // IMPORTANT:
  // We must call 'yield' at a regular basis to pass
  // control to other tasks.
  yield();
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Это и в реальном скетче такие переносы строк или только тут (на форуме)?

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

BOOM пишет:

Это и в реальном скетче такие переносы строк или только тут (на форуме)?

Не понял...

О каких переносах идет речь???

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

О всех, что Вы в коде представили. 

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

Нормальные переносы. Просто жмешь Enter и новая строка... Что странно вы там увидели - не могу взять в толк. Номер строки что-ли указали бы и более детально описали что не так с переносами... Не понять же вас.

А по существу вопроса есть что сказать?

Или в переносах проблема? )))

Upper
Offline
Зарегистрирован: 23.06.2020

Судя по выводу компиляции вы компилируете для Atduino Uno, и она не поддерживается библиотекой <Scheduler.h>

b707
Offline
Зарегистрирован: 26.05.2017

А судя по коду - не нужен тут Шедулер... Двумя светодиодами независимо можно и в одном ЛУПе мигать. три для этого совершенно ни к чему...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

судя по коду - человек изучает "RTOS" и количество диодов тут не причем, другое дело, что выбрал он не подходящую/неподдерживаемую (малоресурсную) платформу. 

nik182
Offline
Зарегистрирован: 04.05.2015

У меня подобное случалось, когда было несколько библиотек на одно устройство. Даже папочку завёл, куда скидывал по одной библиотеки, пока не компилилось правильно.

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

Upper пишет:

Судя по выводу компиляции вы компилируете для Atduino Uno, и она не поддерживается библиотекой <Scheduler.h>

Спасибо за ответ!

Вопросы:

1) yield не поддерживается на UNO ? 

2) А что посоветуете?

Хотелось не менять Ардуино Уно. Но получить аналог мультизадачности.

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

b707 пишет:

А судя по коду - не нужен тут Шедулер... Двумя светодиодами независимо можно и в одном ЛУПе мигать. три для этого совершенно ни к чему...

Это был пример. Я только приступил к работе и ищу способ мультизадачности на Уно.

В моем скетче я хотел сделать в

- одном потоке вычисления и вывод на экран

- во втором потоке проигрывать звуки и мелодии

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вот тебе аналог асинхронности 

https://github.com/DetSimen/Arduino_TimerList

на аватаре ты, вроде, мальчик умненький, разберешься, поди. Если я ашыпся, то спрашивай, отвечу. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

khusamov пишет:

В моем скетче я хотел сделать в

- одном потоке вычисления и вывод на экран

- во втором потоке проигрывать звуки и мелодии

И всё это на 2К ОЗУ и 16 МГц 8-ми битного процессора. MP3 на ходу не нужно раскодировать? Может еще цветомузыку в тон? ...вспомнился Лавров, к чему бы это? Видать наданапицца!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wdrakula пишет:

Видать наданапицца!

Сёдня пятница, сам  ох велел. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

wdrakula пишет:

Видать наданапицца!

Сёдня пятница, сам  ох велел. 

Ох, Диду! Как тонко ты понимаешь самую суть момента! Я, мля так промерз чичаз - пальцы посинели, ацкий трактор заводил - который снегоуборщик - тут в мск снег всю ночь шел,  шоп ево!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А я вчера с пепелацем наёпся. в полдвенаццатого ночи вытек нахрен весь тосол и я кое как дотянул до круглосуточной СТО. 

сёдня тож напьюсь. 

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

wdrakula пишет:

И всё это на 2К ОЗУ и 16 МГц 8-ми битного процессора. MP3 на ходу не нужно раскодировать? Может еще цветомузыку в тон? ...вспомнился Лавров, к чему бы это? Видать наданапицца!

Какая еще цветомузыка? Какое MP3? Что вы выдумываете??? ))))) Вы на форуме ардуинщиков, а не Малины находитесь, все-таки))

Под музыкой и звуками я имею ввиду пищалку. Обычный пассивный зуммер. Не надо выдумывать!

Вы по существу вопроса можете что-то конкретное посоветовать? ))

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

DetSimen пишет:

вот тебе аналог асинхронности 

https://github.com/DetSimen/Arduino_TimerList

на аватаре ты, вроде, мальчик умненький, разберешься, поди. Если я ашыпся, то спрашивай, отвечу. 

Спасибо, буду разбираться!

Про "мальчика" отдельное спасибо! Не думал что в 46 лет буду так молодо выглядеть)))

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

Еще разок. Мне нужно в два потока соорудить нечто, что я назвал Метеостанцией. Это для разминки придумал себе хоть какой-то проект.

В одном потоке я планирую сделать опрос датчиков, вычисления и вывод на экран. Это уже работает.

В другом потоке я планирую музыку и звуковые оповещения через пассивный зуммер. Например звуковое оповещение, что превышена норма по какому-то датчику. А музыка например при включении МК. Эта задача у меня для опробирование возможностей Ардуино.

А вы тут про что-то странное пишите... 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

khusamov пишет:

Под музыкой и звуками я имею ввиду пищалку. Обычный пассивный зуммер. Не надо выдумывать!

Вы по существу вопроса можете что-то конкретное посоветовать? ))

Ну по существу, так по существу:

В микроконтроллере нет такого устройства как "пассивный зуммер". Есть порты ввода/вывода, которыми можно управлять либо аппаратным таймером либо программно - процессором.

Так вот, для первого варианта (аппаратной генерации таймером) многозадачность не нужна, а для второго варианта получение вменяемых звуков в условиях многозадачности невозможно.

Другими словами, реализация в виде многозадачности не соответствует физической постановке задачи.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

khusamov пишет:

Еще разок. Мне нужно в два потока соорудить нечто, что я назвал Метеостанцией. Это для разминки придумал себе хоть какой-то проект.

В одном потоке я планирую сделать опрос датчиков, вычисления и вывод на экран. Это уже работает.

В другом потоке я планирую музыку и звуковые оповещения через пассивный зуммер. Например звуковое оповещение, что превышена норма по какому-то датчику. А музыка например при включении МК. Эта задача у меня для опробирование возможностей Ардуино.

А вы тут про что-то странное пишите... 

Еще раз: многозадачность для этого не нужна. Ппервую задачу выполняете в основном цикле, а управление звуком реализуете в прерывании: для генерации тона используете аппаратный таймер, а для речевых сообщений - аппаратный mp3-плеер. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

khusamov пишет:

Вы по существу вопроса можете что-то конкретное посоветовать? ))

Учиться программировать. По существу вопроса, в 8ми битном контроллере, с 2К ОЗУ нет и не может быть никакой многозадачности. RTOS собирают для таких ИСКЛЮЧИТЕЛЬНО в учебных целях и как курьёз: "Зацени как я умею!".

Есть множество способов запустить мигание или мелодию на простом зуммере на фоне выполнения како-то задачи - в твоем случае метеостанции. К примеру переключать тона по таймеру каждую четверть, а тон задавать другим таймером. В Уно/Нано стоит контроллер Atmega328 в нём целых три таймера ;))).

Я поясню реакцию сообщества: каждый месяц прибегает новичок с МЕГА идеей ;))) о том, как привить многопоточность в микроконтроллер. Это давно стало предметом шуток и насмешек. Мог бы, прежде чем постить, что-то почитать в сети про многопоточность на МК. Так что сам виноват - в некотором роде.

Если трудно научиться писать для МК, то просто купи помощнее, тот же СТМ32, для него уже есть реализации RTOS.

-----------------

А по возрасту - ты вполне вписываешься в нашу маленькую компанию - тут всем около 50, мне, к примеру, 51. ;)) Спрашивай, расскажем как писать под МК, но не ищи многопоточность на Уно/Нано, ОК? ;)))))))

khusamov
khusamov аватар
Offline
Зарегистрирован: 25.09.2013

Ок))

Спасибо за советы. Похоже что-то упустил (прерывания например). Пойду дальше курить мануалы.

Green
Offline
Зарегистрирован: 01.10.2015

Из серии "слона то я и не приметил"). Но, хорошо то, что хоть не стесняетесь в этом признаться.