• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Не работают ets_printf и os_printf

valerivp

Member
Что надо сделать, чтобы работали? - хочу отладочные сообщения SDK
Serial.print работает
 

pvvx

Активный участник сообщества
В SDK на ESP8266 нет Serial.print().
А в Arduino Serial.print не печатает long long (uint64_t). Не доделана.
Также ets_printf и os_printf имеют ошибки и не работают с половиной из стандартных спецификаций переменных:
List of all format specifiers in C programming - Codeforwin
Зачем вам эти бяки? Используйте стандартный printf() из стандартной либы СИ...
 

valerivp

Member
В SDK на ESP8266 нет Serial.print().
А в Arduino Serial.print не печатает long long (uint64_t). Не доделана.
Также ets_printf и os_printf имеют ошибки и не работают с половиной из стандартных спецификаций переменных:
List of all format specifiers in C programming - Codeforwin
Зачем вам эти бяки? Используйте стандартный printf() из стандартной либы СИ...
хочу чтобы работал макрос:
#ifdef DEBUG_ESP_CORE
#define DEBUGV(...) ets_printf(__VA_ARGS__)
#endif
 

pvvx

Активный участник сообщества
хочу чтобы работал макрос:
#ifdef DEBUG_ESP_CORE
#define DEBUGV(...) ets_printf(__VA_ARGS__)
#endif
А что в нем не такого?
Компилятор ругается, что не найдено описание к ets_printf ? Добавьте.

ets_printf не печатает строки из Flash области. Только из RAM.
 

pvvx

Активный участник сообщества
компилятор не ругается, все хорошо

потом уже в консоль порта ничего не выводится.
А кто кроме вас знает, может вы отключили UART выход на пин, изменив его функцию.
А может и сменили процедуру вывода, перепрограммировали UART и т.д. Гадать тут долго.
 

valerivp

Member
Пишу примерно так:

Serial.begin(11200);
Serial.print("xxx"); // выводит
ets_printf("yyy"); // не выводит
 

pvvx

Активный участник сообщества
Пишу примерно так:

Serial.begin(11200);
Serial.print("xxx"); // выводит
ets_printf("yyy"); // не выводит
А как в SDK работает Serial.begin и Serial.print ? Таких функций в SDK нет.
Это функции из Arduino и там UART-ы переназначены. Обращайтесь в другую тему - в Arduino IDE.
И должен работать обычный printf(). И если он не работает - пишите писателю Arduino IDE, чтобы чинил.
 

valerivp

Member
А как в SDK работает Serial.begin и Serial.print ? Таких функций в SDK нет.
Это функции из Arduino и там UART-ы переназначены. Обращайтесь в другую тему - в Arduino IDE.
У меня вопрос не в том, почему Serial. ... работает.
А в том, что надо сделать чтобы ets_printf работала
 

pvvx

Активный участник сообщества
У меня вопрос не в том, почему Serial. ... работает.
А в том, что надо сделать чтобы ets_printf работала
А она не работает в Arduino IDE. Вам же сказано, что она вызовет протектед если вы её запустите и дадите ей вывод строк из Flash.
 

valerivp

Member
А она не работает в Arduino IDE. Вам же сказано, что она вызовет протектед если вы её запустите и дадите ей вывод строк из Flash.
причем тут Arduino IDE? Я использую VisualMicro в качестве IDE.
причем тут "вывод строк из Flash" (я так понимаю это про F("zzz")?)

Может я не корректно задал вопрос.

я хочу чтобы функции ets_printf и os_printf выводили информацию в консоль COM порта.
что надо сделать чтобы они работали?
 

pvvx

Активный участник сообщества
причем тут Arduino IDE? Я использую VisualMicro в качестве IDE.
VisualMicro - это оболочка для Arduino IDE и ничего общего с SDK не имеет.
причем тут "вывод строк из Flash" (я так понимаю это про F("zzz")?)
Может я не корректно задал вопрос.
Именно.
Есть разное распределение памяти. ets_printf описана в ROM чипа и работает только с RAM. Компилятор для Arduino IDE может размещать строки в области "кешируемой" Flash. Туда доступ у CPU только 32-х битными словами по кратным 4-м адресам. Другие обращения туда и в IRAM вызовут "протектед".
Переписывайте и переназначайте ets_printf на свою функцию.
я хочу чтобы функции ets_printf и os_printf выводили информацию в консоль COM порта.
Хотите дальше. :)
что надо сделать чтобы они работали?
Переписать всё изначально.
Конкретнее исправлять Arduino IDE ESP8266 и приводить её к нормальному виду. Пишите горе писателю Arduino IDE ESP8266.
На любом другом чипе в Arduino такое работает без проблем:
Снимок78.gif
 

pvvx

Активный участник сообщества
Это у него паранойя. Ненавидит pvvx Ардуину, вот и мерещится она ему повсюду. Может из окна выпрыгнуть с воплем "Ардуино идет!". :D
Вы опять ошиблись. vMicro - это плагин для Ardunio в VS. :p
А тут тема про "SDK и создание собственных прошивок". Базовые SDK от Espressif не имеют поддержки C++ и Arduino.
Ответ ТС дан - использовать стандартные функции, работающие и в СИ и в C++ = printf.
Если она не работает в среде, то это значит, что среда не поддерживает стандартные функции...
Пример приведен.
Ваша злость ко всему миру плодит ложь. В моих вариантах Arduino printf работает. :p
Так что выражайтесь корректнее, если вам нравятся недоделанная Arduino IDE для ESP8266. :)
 

valerivp

Member
Вы опять ошиблись. vMicro - это плагин для Ardunio в VS. :p
А тут тема про "SDK и создание собственных прошивок". Базовые SDK от Espressif не имеют поддержки C++ и Arduino.
Ответ ТС дан - использовать стандартные функции, работающие и в СИ и в C++ = printf.
Если она не работает в среде, то это значит, что среда не поддерживает стандартные функции...
Пример приведен.
Ваша злость ко всему миру плодит ложь. В моих вариантах Arduino printf работает. :p
Так что выражайтесь корректнее, если вам нравятся недоделанная Arduino IDE для ESP8266. :)
Уважаемый pvvx, Вы в других темах давали мне дельные комментарии и решения. Нет проблемы в том что ответа на этот мой вопрос вы не знаете.
но может кто-то другой знает.

В этой теме вопрос такой:

Вопрос: что надо сделать чтобы работали функции ets_printf и os_printf

не не нужны никакие другие варианты вывода в порт. В данной задаче нужны именно эти. Потому что для вывода отладочных сообщений в библиотеках ардуино для ESP используются именно эти функции. Холивар за Ардуино и против - это холивар. Каждый имеет право на свое мнение.

Я могу переписать часть библиотек, заменив в них печать на Serial.print. Но может есть решение с имеющимися функциями?
 

Алексей.

Active member
причем тут Arduino IDE? Я использую VisualMicro в качестве IDE.
Arduino IDE в данном случае следует понимать не как среду разработки, а как набор библиотек которые изначально предполагались использовать в этой среде.
Смотрим исходники библиотек, в HardwareSerial.cpp находим тот самый сериал, который Вы используете HardwareSerial Serial(UART0);
Смотрим реализацию begin
Код:
void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin)
{
    if(uart_get_debug() == _uart_nr) {
        uart_set_debug(UART_NO);
    }
    if (_uart) {
        free(_uart);
    }
    _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin);
    _peek_char = -1;
}
если номер отладочного уарта совпадает с тем, который нужно использовать, то выполняется uart_set_debug(UART_NO);
смотрим uart.c
Код:
void uart_set_debug(int uart_nr)
{
    s_uart_debug_nr = uart_nr;
    switch(s_uart_debug_nr) {
    case UART0:
        system_set_os_print(1);
        ets_install_putc1((void *) &uart0_write_char);
        break;
    case UART1:
        system_set_os_print(1);
        ets_install_putc1((void *) &uart1_write_char);
        break;
    case UART_NO:
    default:
        system_set_os_print(0);
        ets_install_putc1((void *) &uart_ignore_char);
        break;
    }
}
для случая UART_NO выполняется system_set_os_print "Function: Turn on/off print logFunction" с параметром 0 "0x00 : print function off"
и как ни странно перенаправление вывода ets_install_putc1 в фейковую uart_ignore_char

Вы не используете ардуино-иде, но почему то используете ардуино-иде компоненты, а посмотреть в исходники не хотите, жаль.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Уважаемый pvvx, Вы в других темах давали мне дельные комментарии и решения. Нет проблемы в том что ответа на этот мой вопрос вы не знаете.
но может кто-то другой знает.

В этой теме вопрос такой:

Вопрос: что надо сделать чтобы работали функции ets_printf и os_printf

не не нужны никакие другие варианты вывода в порт. В данной задаче нужны именно эти. Потому что для вывода отладочных сообщений в библиотеках ардуино для ESP используются именно эти функции. Холивар за Ардуино и против - это холивар. Каждый имеет право на свое мнение.

Я могу переписать часть библиотек, заменив в них печать на Serial.print. Но может есть решение с имеющимися функциями?
Холивар заводит =AK=, а вы этому поддаетесь.
Я вам ответил по существу, что должно работать в C++.
ets_printf не рабочая функция. Исправить её невозможно, т.к. она находиться в ROM! Переписать на свою - без проблем.

Функция printf должна выводить по умолчанию в cout.
Так-же должны работать все другие стандартные функции.
Пример:
Код:
#include <iostream>
using namespace std;

void setup() {
  Serial.begin();
  Serial.print("\r\nSerial: Hello, world!\r\n");
  printf("Printf: Hello, world!\r\n");
  cout << "std: Hello, world!" << endl;
  cerr << "cerr: Hello, world!" << endl;
  puts("puts: Hello, world!\r\n");
}
void loop() {
  delay(1000);
}
Снимок79.gif
#ifdef DEBUG_ESP_CORE
#define DEBUGV(...) printf(__VA_ARGS__)
#endif
Если как-то подключите ets_printf, указав ей процедуру вывода, то получив ошибки начнете спрашивать, почему у вас ошибки в программе :)

ets_printf имеет такие ошибки:
  • не работает со всеми областями памяти - вызывает "протектед"
  • при выводе форматных строк делает ошибки с выводом чисел
  • глухо виснет (вызывает WDT), если с UART отключен CLK или если у UART включены RTS/CTS.
 
Последнее редактирование:

Алексей.

Active member
pvvx, TC не нужен printf
что надо сделать чтобы работали функции ets_printf и os_printf
Разве Вы еще не поняли? нужны ets_printf и os_printf вот так и никак иначе.
Посмотрите в топик, ключевое слово "отладочные сообщения SDK"
вызывая Serial.begin он их блокирует и хочет чтоб они выводились, а Вы всё про printf
 
Последнее редактирование:

pvvx

Активный участник сообщества
pvvx, TC не нужен printf

Разве Вы еще не поняли? нужны ets_printf и os_printf вот так и никак иначе.
Тогда пусть пишет сам эти функции, а не выпрашивает решение как их написать. :)
для случая UART_NO выполняется system_set_os_print "Function: Turn on/off print logFunction" с параметром 0 "0x00 : print function off"
и как ни странно перенаправление вывода ets_install_putc1 в фейковую uart_ignore_char
Но это не спасает ets_printf от описанных ошибок и совершенно не оптимально, т.к. строки к ней размещаются в RAM (rodata) и динамическом включении/отключении через замену процедуры вывода приводит к падению производительности. Отключать надо саму процедуру, а не её вывод.
 
Последнее редактирование:

Алексей.

Active member
одним вызовом system_set_os_print(0) отключают вывод лога и не понятно для чего подменяют функцию вывода, лог то уже заблокировали, зачем перенаправлять os_printf, может он кому нибудь ещё нужен, не понятно...
 
Сверху Снизу