• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, может он кому нибудь ещё нужен, не понятно...
 
Сверху Снизу