• Система автоматизации с открытым исходным кодом на базе 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; :)
 
Сверху Снизу