Функция yield() и ошибка: Error: constant value required
- Войдите на сайт для отправки комментариев
Чт, 04/02/2021 - 22:26
Здравствуйте!
При компиляции появляется ошибка "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(); }
Это и в реальном скетче такие переносы строк или только тут (на форуме)?
Это и в реальном скетче такие переносы строк или только тут (на форуме)?
Не понял...
О каких переносах идет речь???
О всех, что Вы в коде представили.
Нормальные переносы. Просто жмешь Enter и новая строка... Что странно вы там увидели - не могу взять в толк. Номер строки что-ли указали бы и более детально описали что не так с переносами... Не понять же вас.
А по существу вопроса есть что сказать?
Или в переносах проблема? )))
Судя по выводу компиляции вы компилируете для Atduino Uno, и она не поддерживается библиотекой <Scheduler.h>
А судя по коду - не нужен тут Шедулер... Двумя светодиодами независимо можно и в одном ЛУПе мигать. три для этого совершенно ни к чему...
судя по коду - человек изучает "RTOS" и количество диодов тут не причем, другое дело, что выбрал он не подходящую/неподдерживаемую (малоресурсную) платформу.
У меня подобное случалось, когда было несколько библиотек на одно устройство. Даже папочку завёл, куда скидывал по одной библиотеки, пока не компилилось правильно.
Судя по выводу компиляции вы компилируете для Atduino Uno, и она не поддерживается библиотекой <Scheduler.h>
Спасибо за ответ!
Вопросы:
1) yield не поддерживается на UNO ?
2) А что посоветуете?
Хотелось не менять Ардуино Уно. Но получить аналог мультизадачности.
А судя по коду - не нужен тут Шедулер... Двумя светодиодами независимо можно и в одном ЛУПе мигать. три для этого совершенно ни к чему...
Это был пример. Я только приступил к работе и ищу способ мультизадачности на Уно.
В моем скетче я хотел сделать в
- одном потоке вычисления и вывод на экран
- во втором потоке проигрывать звуки и мелодии
вот тебе аналог асинхронности
https://github.com/DetSimen/Arduino_TimerList
на аватаре ты, вроде, мальчик умненький, разберешься, поди. Если я ашыпся, то спрашивай, отвечу.
В моем скетче я хотел сделать в
- одном потоке вычисления и вывод на экран
- во втором потоке проигрывать звуки и мелодии
И всё это на 2К ОЗУ и 16 МГц 8-ми битного процессора. MP3 на ходу не нужно раскодировать? Может еще цветомузыку в тон? ...вспомнился Лавров, к чему бы это? Видать наданапицца!
Видать наданапицца!
Сёдня пятница, сам ох велел.
Видать наданапицца!
Сёдня пятница, сам ох велел.
Ох, Диду! Как тонко ты понимаешь самую суть момента! Я, мля так промерз чичаз - пальцы посинели, ацкий трактор заводил - который снегоуборщик - тут в мск снег всю ночь шел, шоп ево!
А я вчера с пепелацем наёпся. в полдвенаццатого ночи вытек нахрен весь тосол и я кое как дотянул до круглосуточной СТО.
сёдня тож напьюсь.
И всё это на 2К ОЗУ и 16 МГц 8-ми битного процессора. MP3 на ходу не нужно раскодировать? Может еще цветомузыку в тон? ...вспомнился Лавров, к чему бы это? Видать наданапицца!
Какая еще цветомузыка? Какое MP3? Что вы выдумываете??? ))))) Вы на форуме ардуинщиков, а не Малины находитесь, все-таки))
Под музыкой и звуками я имею ввиду пищалку. Обычный пассивный зуммер. Не надо выдумывать!
Вы по существу вопроса можете что-то конкретное посоветовать? ))
вот тебе аналог асинхронности
https://github.com/DetSimen/Arduino_TimerList
на аватаре ты, вроде, мальчик умненький, разберешься, поди. Если я ашыпся, то спрашивай, отвечу.
Спасибо, буду разбираться!
Про "мальчика" отдельное спасибо! Не думал что в 46 лет буду так молодо выглядеть)))
Еще разок. Мне нужно в два потока соорудить нечто, что я назвал Метеостанцией. Это для разминки придумал себе хоть какой-то проект.
В одном потоке я планирую сделать опрос датчиков, вычисления и вывод на экран. Это уже работает.
В другом потоке я планирую музыку и звуковые оповещения через пассивный зуммер. Например звуковое оповещение, что превышена норма по какому-то датчику. А музыка например при включении МК. Эта задача у меня для опробирование возможностей Ардуино.
А вы тут про что-то странное пишите...
Под музыкой и звуками я имею ввиду пищалку. Обычный пассивный зуммер. Не надо выдумывать!
Вы по существу вопроса можете что-то конкретное посоветовать? ))
Ну по существу, так по существу:
В микроконтроллере нет такого устройства как "пассивный зуммер". Есть порты ввода/вывода, которыми можно управлять либо аппаратным таймером либо программно - процессором.
Так вот, для первого варианта (аппаратной генерации таймером) многозадачность не нужна, а для второго варианта получение вменяемых звуков в условиях многозадачности невозможно.
Другими словами, реализация в виде многозадачности не соответствует физической постановке задачи.
Еще разок. Мне нужно в два потока соорудить нечто, что я назвал Метеостанцией. Это для разминки придумал себе хоть какой-то проект.
В одном потоке я планирую сделать опрос датчиков, вычисления и вывод на экран. Это уже работает.
В другом потоке я планирую музыку и звуковые оповещения через пассивный зуммер. Например звуковое оповещение, что превышена норма по какому-то датчику. А музыка например при включении МК. Эта задача у меня для опробирование возможностей Ардуино.
А вы тут про что-то странное пишите...
Еще раз: многозадачность для этого не нужна. Ппервую задачу выполняете в основном цикле, а управление звуком реализуете в прерывании: для генерации тона используете аппаратный таймер, а для речевых сообщений - аппаратный mp3-плеер.
Вы по существу вопроса можете что-то конкретное посоветовать? ))
Учиться программировать. По существу вопроса, в 8ми битном контроллере, с 2К ОЗУ нет и не может быть никакой многозадачности. RTOS собирают для таких ИСКЛЮЧИТЕЛЬНО в учебных целях и как курьёз: "Зацени как я умею!".
Есть множество способов запустить мигание или мелодию на простом зуммере на фоне выполнения како-то задачи - в твоем случае метеостанции. К примеру переключать тона по таймеру каждую четверть, а тон задавать другим таймером. В Уно/Нано стоит контроллер Atmega328 в нём целых три таймера ;))).
Я поясню реакцию сообщества: каждый месяц прибегает новичок с МЕГА идеей ;))) о том, как привить многопоточность в микроконтроллер. Это давно стало предметом шуток и насмешек. Мог бы, прежде чем постить, что-то почитать в сети про многопоточность на МК. Так что сам виноват - в некотором роде.
Если трудно научиться писать для МК, то просто купи помощнее, тот же СТМ32, для него уже есть реализации RTOS.
-----------------
А по возрасту - ты вполне вписываешься в нашу маленькую компанию - тут всем около 50, мне, к примеру, 51. ;)) Спрашивай, расскажем как писать под МК, но не ищи многопоточность на Уно/Нано, ОК? ;)))))))
Ок))
Спасибо за советы. Похоже что-то упустил (прерывания например). Пойду дальше курить мануалы.
Из серии "слона то я и не приметил"). Но, хорошо то, что хоть не стесняетесь в этом признаться.