• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

printf

pvvx

Активный участник сообщества
Всё вроде починено с printf. Так-же ещё чего-то накрутил в SDK, но это промежуточная версия - надо долепить bootloader. Из-за него запутался совсем с версиями исходников и что обновлять на git, чтобы хоть собиралось... а то с "бутом" будет много изменений для сокращения ресурсов занимаемой памяти и много менять в разных исходниках...
Для heap ROM выделяется кусок RAM от "end" до кратного 0x1000 адресу. При этом под буфер xprintf отводиться только 1024 байта. Остальное отнимается в придачу, вторым сегментом, до указанной кратности... Прошито в ROM и исправлению не подлежит (ну если все подряд не патчить, а это увеличит код).

SSL теперь помирает в rtlDuino при увеличении длины буферов на ключ... Опять кто-то мимо своей области кидает данные, не предупреждая никого. В Ameba на эти все глупости отвели все 64 кило TCM и ещё нехилые дыры в SRAM, а все адреса таких проделок скрыли в бинарных либах, чтобы было неповадно что-либо изменить.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Нововедения у Ameba Arduino с DiagPrintf:
Код:
/*
    decompiled low_level_io.o
*/
#include ......
//-------------------------------------------------------------------------
// Function declarations
void mode_init();
void HalSerialPutcRtl8195a(int c, int a2, char a3);
signed int DiagPrintf(const char *fmt, ...);
void log_uart_enable_printf();
void log_uart_disable_printf();
//-------------------------------------------------------------------------
// Data declarations
uint32_t backupWarn;
uint32_t backupErr;
uint32_t backupInfo;
int disablePrintf;
// extern _UNKNOWN use_mode;
// extern _UNKNOWN ConfigDebugErr;
// extern _UNKNOWN ConfigDebugInfo;
// extern _UNKNOWN ConfigDebugWarn;

//-----
void mode_init()
{
  use_mode = 1;
}

//-----
void HalSerialPutcRtl8195a(int c)
{
  signed int v3;

  if ( disablePrintf != 1 )
  {
    v3 = 6540;
    do
    {
      if ( !--v3 )
        break;
      a3 = v40003014;
    }
    while ( !(v40003014 & 0x60) );
    if ( c == 10 ) a3 = 13;
    v40003000 = c;
    if ( c == 10 ) v40003000 = a3;
  }
}

//-----
signed int DiagPrintf(const char *fmt, ...)
{
  va_list va;

  va_start(va, fmt);
  if ( disablePrintf != 1 )
    VSprintf(0, fmt, va);
  return 1;
}

//-----
void log_uart_enable_printf()
{
  disablePrintf = 0;
  ConfigDebugErr = backupErr;
  ConfigDebugInfo = backupInfo;
  ConfigDebugWarn = backupWarn;
}

//-----
void log_uart_disable_printf()
{
  disablePrintf = 1;
  backupErr = ConfigDebugErr;
  backupInfo = ConfigDebugInfo;
  backupWarn = ConfigDebugWarn;
  ConfigDebugErr = 0;
  ConfigDebugInfo = 0;
  ConfigDebugWarn = 0;
}
Вставлено в связи со sleep и переходами к экономию питания для RTL8710AF.
Но всё равно не понятно, почему signed int DiagPrintf(), а значение VSprintf не передается. Любят лишний код return 1; :)
 
Сверху Снизу