Конфликт delay и printf

faraddin
Offline
Зарегистрирован: 11.08.2013

Пишу программу под pcDuino. Если написать код, состоящий из одной только команды printf (текст) то в консоли спокойно выводится текст, но стоит добавить в программу delay (), текст выводиться в консоль тут же перестает, при этом программа работает, "диодики мигают" с нужной задержкой..

Что такое может быть? 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Глючный код опубликуйте, потому как у народа всё работает.

    // wait 1000 milliseconds
    delay(1000) ;

    // calculate seconds as a floating point value
    seconds = (float) millis() /1000.0 ;

    // report seconds since starting
    printf("Alive %.3f sec", seconds ) ;

http://playground.arduino.cc/Main/Printf

faraddin
Offline
Зарегистрирован: 11.08.2013
void loop () {

  printf ("text\n");

} - работает;


void loop () {
 
 printf ("text\n");
 delay (1000);

} - не работает (вернее код то работает, все кроме printf() );
leshak
Offline
Зарегистрирован: 29.09.2011

А вы ссылочку, которую вам дал Калапуций внимательно читали?

The avr-gcc C library, avr-libc, provides the printf() family of functions. You can use them in Arduino sketches after some preparation

И ниже дан рецепт что именно нужно сделать, что-бы printf Нормально работал в ардуино.

Если, конечно вас не смущает "printf() makes your executable object ~1000 bytes larger"

faraddin
Offline
Зарегистрирован: 11.08.2013

У меня слишком начальный уровень знания C++, по этому я не смог, из данной ссылки, понять как именно влияет delay на printf, и почему без delay printf работает.

Тот же код Клапуция работает только если удалить delay();

Напомню, что это не arduino, а pcDuino. Если не сложно, объясните простыми словами..

printf() makes your executable object ~1000 bytes larger - что это такое? у меня а пкдуино доступно более 180Мб памяти.

leshak
Offline
Зарегистрирован: 29.09.2011

>и почему без delay printf работает

У меня - не работает (если не сделать описанных в ссылке танцев) . Так что у вас "работает" скорее "чудом" (случайное стечение обстоятельств, состояния памяти и проч). И "любой чих" - поломает эту чудо. Что и сделал delay(). Да вообще что угодно может привести к этому (размер скетча, количество переменных и т.д. и т.п.).

Так что не тратье время на попытки понять "почему delay() ломает", лучше займитесь "как правильно пользоватся printf ". 

В ссылке - есть все необходимое. И как сам printf заставить, и как "обходится без него" (первый пример). Можно еще воспользоватся функцией sprintf для формирование строки в какую-нибудь переменную, скажем str, а потом делать ее вывод с помощью Serial.print

Только.... учитывайте что у ардуины, для экономии места printf/sprintf - кастрированные. Далеко не все "фичи" форматирования поддерживают. В частности строки и целые числа вывести - пожалуста. А вот для float - увидите знаки вопроса вместо цифр :(

>Напомню, что это не arduino, а pcDuino

Другой процессор, другая архитектура... У вас есть два варианта: либо надеятся что они все библиотеки "портировали" в виде наиболее близком к дуине, либо у них на форумах спрашивать "как правильно пользоватся printf"  (как настроить стандартный stdout)

Вообщем возмите пример по ссылке Калапуция, запустите его. Там delay() уже есть. Если заработает - вам повезло, нет - ищите аналогичный пример-статью для вашей платы/камня.

faraddin
Offline
Зарегистрирован: 11.08.2013

leshak пишет:

Вообщем возмите пример по ссылке Калапуция, запустите его. Там delay() уже есть. Если заработает - вам повезло, нет - ищите аналогичный пример-статью для вашей платы/камня.

Первым делом проверил, никакого эффекта. А доля pcDuino и соответсвенно форумов под него, не смотря на смешную стоимость (в сравнении с raspberry pi + arduino + доставка), просто никакая.. Ладно, может где и отыщется ответ.

leshak
Offline
Зарегистрирован: 29.09.2011

> Ладно, может где и отыщется ответ.

Все это конечно мое глубокое IMHO, но в микроконтроллерах, когда у нас нет оболочки в ввиде OS, само понятие "стандартный поток вывода" - очень притянуто за уши. Можно принять что "нет у нас stdout" и все. Следовательно и printf у нас всякие - вне закона.

Можно конечно, как по ссылке Калапуция, извратится и пинками заставить его работать... но это немного противоестественно. Попытки перенести привычки "большого брата" на микроконтроллер.

Более "идеологично", в данном случае, было-бы

1. Выделить переменную буфер - под формирование строк
2. Заполнить ее с помощью sprintf
3. Отправить ее "штатным" средствами куда нам нужно Serial.print, LCD.print, SD.write и т.п.

А по поводу pcDuino....

Ну собственно, "при такой моще". Там и языки нужно использовать соответсвующие. Зачем жаться в обрезанные языковые варианты ардуины. У ардуины - аскетичность средств понятна. Ресурсов мало.

А если ваша плата позволяет полноценную ось пустить, то.... что же вы мучаете себя как при царском режиме? :) Питоны, Java, PHP, возможно .NET, полноценная C++ - все это должно быть у вас доступно :)

Хотя... если честно я сам наступил в эти грабли :) Fez Panda II взял. Уже второй год пылится. И язык мощней (C#), и ресурсов валом... и средства разработки удобней (есть отладчик и т.п.). Только: библиотек и сообщества - намного меньше (хотя есть). И главное - так и не придумал "а зачем эта моща?" :)

Для чего-то "легкого" типа "пощелкать релешками/диодами/прочитать датчик" - дуины с головой хватает.  Воротить крутое UI с тач.экранами?  Так планшет китаезный дешевле на андроиде. Какие-то нейронные сети-распознавание-обработка видео? Так в любом случае комп понадобится.

Вообщем ниша DUE и тому подобных плат - лично мне совершенно не понятна.