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

Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
@pvvx, тут вот обновление 1.5.4 у китайцев вышло, случайно не смотрели, есть в нем что-нибудь стоящее?
Счас не слежу - дача, дети и всё такое... Какой комп летом, если оно у нас короткое?

--------
SDK 1.5.4 на тестовом (неизменном у меня с 1.1.1) примере IoT_Demo:
Различия по используемой памяти для примера IoT_Demo
Код:
В SDK 1.1.1:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8D80|    3456
    rodata|           ReadOnly Data (RAM)|    3FFE8D80|    3FFE9F70|    4592
       bss|      Uninitialized Data (RAM)|    3FFE9F70|    3FFF4378|   41992
      text|            Cached Code (IRAM)|    40100000|    40107466|   29798
irom0_text|           Uncached Code (SPI)|    40240000|    4026DD3C|  187708
Total Used RAM : 50040
Free RAM : 31880
Free IRam : 2988

В SDK 1.1.2:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8D80|    3456
    rodata|           ReadOnly Data (RAM)|    3FFE8D80|    3FFE9F74|    4596
       bss|      Uninitialized Data (RAM)|    3FFE9F78|    3FFF4388|   42000
      text|            Cached Code (IRAM)|    40100000|    401074AA|   29866
irom0_text|           Uncached Code (SPI)|    40240000|    4026DEEC|  188140
Total Used RAM : 50052
Free RAM : 31868
Free IRam : 2920

В SDK 1.2.0:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8D70|    3440
    rodata|           ReadOnly Data (RAM)|    3FFE8D70|    3FFE9F1C|    4524
       bss|      Uninitialized Data (RAM)|    3FFE9F20|    3FFF43E8|   42184
      text|            Cached Code (IRAM)|    40100000|    40106DEA|   28138
irom0_text|           Uncached Code (SPI)|    40240000|    4026F78C|  194444
Total Used RAM : 50148
Free RAM : 31772
Free IRam : 4648
Другая оптимизация:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE905C|    4188
    rodata|           ReadOnly Data (RAM)|    3FFE9060|    3FFEAA94|    6708
       bss|      Uninitialized Data (RAM)|    3FFEAA98|    3FFF30E0|   34376
      text|            Cached Code (IRAM)|    40100000|    401071AA|   29098
irom0_text|           Uncached Code (SPI)|    40240000|    40279E1C|  237084
Total Used RAM : 45272
Free RAM : 36648
Free IRam : 3688

В SDK 1.2.0 (all patch):
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8C2C|    3116
    rodata|           ReadOnly Data (RAM)|    3FFE8C30|    3FFEA6D4|    6820
       bss|      Uninitialized Data (RAM)|    3FFEA6D8|    3FFF2D28|   34384
      text|            Cached Code (IRAM)|    40100000|    40105717|   22295
irom0_text|           Uncached Code (SPI)|    40240000|    4027A5F8|  239096
Total Used RAM : 44320
Free RAM : 37600
Free IRam : 10491

В SDK 1.3.0:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8A3C|    2620
    rodata|           ReadOnly Data (RAM)|    3FFE8A40|    3FFEA1AC|    5996
       bss|      Uninitialized Data (RAM)|    3FFEA1B0|    3FFF22A8|   33016
      text|            Cached Code (IRAM)|    40100000|    401056A3|   22179
irom0_text|           Uncached Code (SPI)|    40240000|    4027B8C0|  243904
Total Used RAM : 41632
Free RAM : 40288
Free IRam : 10607

В SDK 1.4.0:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8778|    1912
    rodata|           ReadOnly Data (RAM)|    3FFE8778|    3FFE94E8|    3440
       bss|      Uninitialized Data (RAM)|    3FFE94E8|    3FFF1630|   33096
      text|            Cached Code (IRAM)|    40100000|    40105A67|   23143
irom0_text|           Uncached Code (SPI)|    40240000|    40274908|  215304
Total Used RAM : 38448
Free RAM : 43472
Free IRam : 9643

В SDK 1.5.0:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8778|    1912
    rodata|           ReadOnly Data (RAM)|    3FFE8778|    3FFE9504|    3468
       bss|      Uninitialized Data (RAM)|    3FFE9508|    3FFF0E90|   31112
      text|            Cached Code (IRAM)|    40100000|    40105B7B|   23419
irom0_text|           Uncached Code (SPI)|    40240000|    40275778|  219000
Total Used RAM : 36492
Free RAM : 45428
Free IRam : 9367

В SDK 1.5.1:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8778|    1912
    rodata|           ReadOnly Data (RAM)|    3FFE8780|    3FFE9514|    3476
       bss|      Uninitialized Data (RAM)|    3FFE9518|    3FFF0E80|   31080
      text|            Cached Code (IRAM)|    40100000|    40105B97|   23447
irom0_text|           Uncached Code (SPI)|    40240000|    40275788|  219016
Total Used RAM : 36468
Free RAM : 45452
Free IRam : 9339

В SDK 1.5.2:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8778|    1912
    rodata|           ReadOnly Data (RAM)|    3FFE8780|    3FFE9514|    3476
       bss|      Uninitialized Data (RAM)|    3FFE9518|    3FFF0E80|   31080
      text|            Cached Code (IRAM)|    40100000|    40105D53|   23891
irom0_text|           Uncached Code (SPI)|    40240000|    402758B8|  219320
Total Used RAM : 36468
Free RAM : 45452
Free IRam : 8895

В SDK 1.5.4:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8778|    1912
    rodata|           ReadOnly Data (RAM)|    3FFE8780|    3FFE9518|    3480
       bss|      Uninitialized Data (RAM)|    3FFE9518|    3FFF0E80|   31080
      text|            Cached Code (IRAM)|    40100000|    4010637B|   25467
irom0_text|           Uncached Code (SPI)|    40240000|    402762A8|  221864
Total Used RAM : 36472
Free RAM : 45448
Free IRam : 7319
IRAM - стало доступно меньше на 1576 байт по сравнению c 1.5.2
irom0_text (код в flash) - стало доступно меньше на 2544 байта по сравнению c 1.5.2
Heap до инициализации SDK - стало доступно меньше на 4 байта по сравнению c 1.5.2

system_deep_sleep_local_2() не исправлена. Стало ещё хуже:
Код:
void system_deep_sleep_local_2(void)
{
    .....
    Cache_Read_Disable();
    .....
    struct rst_info rst_info;
    ets_memset(rst_info, 0, sizeof(rst_info));
    rst_info.reason = REASON_DEEP_SLEEP_AWAKE;
    system_rtc_mem_write(0, &rst_info, sizeof(rst_info));
    IO_RTC_2 = 1<<20; // rtc_enter_sleep()    HWREG(PERIPHS_RTC_BASEADDR, 0x08) = 0x100000;
}
----------
В асм:
----------
    call0    40101634 <system_rtc_mem_write>
    l32r    a8, 40100530 <wdt_feed+0x168>
    memw
    l32r    a9, 4010020c <NmiTimSetFunc+0x20>
    l32i.n    a0, a1, 28
    addi    a1, a1, 32
    s32i    a8, a9, 0x108 // IO_RTC_2 = 1<<20; // срабатывает с задержкой много тактов CPU !
    ret.n // уход CPU в пустую отключенную "кеш" и "протектед" вместо записанного кода rst_info.reason = REASON_DEEP_SLEEP_AWAKE :)
Пишите им в Баунти, чтобы в конце процедуры поставили while(1) - надоело патчить...

Наверно это всё. :)
 
Последнее редактирование:

vad7

Active member
@pvvx, я вот тут подумал - esp8266 выпущено несметное количество, пользователей и проектов/прошивок тоже.
И получается ни кого эта ошибка не трогает?
Сон то, наверняка многие используют, или нет?
Хотя, я вот не использую, ибо не зачем....
 

FGX

Member
в main опечатка есть
Код:
#if DEBUGSOO > 1
            os_printf("HSPI CLK = %u Hz\n", hspi_master_init(0x07070300,1000000)); // 8 bit addr, 8 bit cmd, CS none, SPI MODE 3, SETUP + no HOLD, 1 MHz
            os_printf("Init BMP280...\n");
#else
            hspi_master_init(0x07070300,1000000)); // 8 bit addr, 8 bit cmd, CS none, SPI MODE 3, SETUP + no HOLD, 1 MHz
#endif
Лишняя скобка hspi_master_init(0x07070300,1000000));
 

vad7

Active member
@pvvx, после последних изменений, что-то "измеритель" Vdd сильно врать стал - при реальных 3.37 показывает 3.14.
Раньше 3.4 V показывал.
 

pvvx

Активный участник сообщества
@pvvx, после последних изменений, что-то "измеритель" Vdd сильно врать стал - при реальных 3.37 показывает 3.14.
Раньше 3.4 V показывал.
Там же калибровка есть в ~sys_ucnst_0~... Зависит от наличия резистора и его номинала на входе АЦП -> от типа модуля.
Ещё сделал изменения в установке параметров АЦП в частных делителях счетчиков SAR. Был множитель на 10, а в новом SDK от китайцев на 11 (перепроверял дизасм):
- SAR_TIM2 = (SAR_TIM2 & 0xFF000000) | (clk_div * 11 + ((clk_div * 3 - 1) << 8) + ((clk_div * 10 - 1) << 16) - 1);
+ SAR_TIM2 = (SAR_TIM2 & 0xFF000000) | (clk_div * 11 + ((clk_div * 3 - 1) << 8) + ((clk_div * 11 - 1) << 16) - 1);
 
Последнее редактирование:
Уважаемый PVVX ! У меня есть простой (наверное глупый) вопрос:
Когда я в проекте объявляю переменные вот так:
Код:
typedef struct t_COND_SWING {
        uint8 temp1;  // температура генератора
        uint8 temp2;  // температура окружающей среды
        uint16 power; // мощность линии
        uint8 volt;  // напряжение в линии
        uint16 moto_time1;  // моточасы текущей работы
        uint32 moto_time2; //моточасы общие
        uint8 min; // минуты
        uint8 h_; // часы
        uint8 day; // число
        uint8 date; // месяц
        uint8 e_; // год
        uint8 power_status; // состояние линии. Работает 0-от генератора . 1-от сети
        uint8 gen_status;   // состояние генератора 0-выкл. 1-запуск. 2-включен.

        uint8 del_str;
        uint8 pro_str;
        uint8 pr_dstr;
        uint8 hot_1__;
        uint8 hot_2__;
        uint8 tim_pwr;

        uint8 status1_gen;
        uint8 status2_gen;
        uint8 status3_gen;
}COND_SWING;
Где эта область находится? Во флешь 25х? Или в RAM ESP8266 ? И есть вообще в ESP8266 RAM ?
Простите заранее за глупые вопросы ...

Просто хочу знать на сколько хватит модуля , вернее флешь , ведь если используется память из флешь то у нее не такая и большая долговечность...
 

AlexMelven

New member
я так понимаю, пока это только объявленный тип и он нигде не хранится, кроме как в текстовом файле компьютера. А вот потом, когда вы объявите переменную этого типа - то будет использоваться ОЗУ тем или иным образом. Если явно объявите - то компилятор зарезервирует место сразу, если объявите указатель на переменную такого типа, то нужно будет выделять память перед использованием. Переменные в флеши - такое врядли бывает.
 

AlexMelven

New member
флешь можно использовать только вызывая процедуры - стереть сектор, записать в сектор, читать сектор. Если сектор не стирать, то поверх нуля единицу уже не запишешь. Данный тип флеши побайтно стирать нельзя, только посекторно. Можно еще целую флешку стереть (это вроде делает сама флешка по микрокоманде). Все настройки, которые хранятся в флеши - разные там SSID, пароль и прочая - именно так и сохраняются.
 

alexsmd

New member
Здравствуйте, а зачем в прошивку ввели механизм оверлеев? какую функцию они выполняют?
 

AlexMelven

New member
pvvx, почитал доку по SNTP - время приходит в секундах от 1900 года. Зона не учитывается, вводится пользователем и время с учетом зоны вычисляется на последнем этапе - когда нужно его получить. Вопрос - почему в вебсвалке время SNTP отображается корректно, ведь московское время это UTP+3, а насколько я вижу, переменная sntp_time_zone никем не инициализируется и остается равной нулю? И в то же время, если ее сделать +3 - то время станет не корректным, т.к. при вызове функции get_sntp_time() учитывается sntp_time_zone.
Кстати, часы сломаются в 2036-м году, т.к. эпоха тут не учитывается. Хотя наверное это тоже уже проблема того, кто обрабатывает окончательно секунды - он то должен знать что сейчас не 19-й век, а 20-й и делать соответствующую корректировку..
Хм, похоже сам и ответил на свой вопрос - время корректно отображается, т.к. используется функция Date(), которая должно быть использует установленное значение зоны в виндовс компьютера.
 
Последнее редактирование:

PycLan

New member
@pvvx, Добрый день!
Такой вопрос, есть новее более стабильная версия по сравнению с 1.4.1. на которую можно было бы перейти?
В основном использую GET и POST. Так эта версия вроде как относительно стабильная, но иногда
бывают какие-то перезагрузки ESP при активной работе COM и WEB (не связанные с ЭМС).
 

alexsmd

New member
Хочу передать для себя оверлей iointr.ovl из темы - http://esp8266.ru/forum/threads/ne-poluchaetsja-sobrat-proekty-ot-pvvx-pod-linux.926/#post-14214
У меня как раз есть две кнопки на которые вешаются прерывания.
Суть, когда кнопка нажата gpio ловит нижний фронт по прерыванию, инверсирует константу состояния реле, посылает короткий импульс с другого gpio на реле.

Как мне послать короткий импульс с помощью gpio?
Как мне поменять gpio4 & gpio5 на свои gpio?

Код:
Код:
/*
*     gpio_isr.c
*    По просьбе трудящихся.
*      Author: PV`
*/
#include "user_config.h"
#include "bios.h"
#include "hw/esp8266.h"
#include "hw/eagle_soc.h"
#include "user_interface.h"
#include "flash_eep.h"
#include "web_iohw.h"
#include "gpios_intr.h"

#include "ovl_sys.h"

#define GPIO_TEST1 mdb_buf.ubuf[80] // по умолчанию GPIO4 - нужно GPIO12 - состояние выключателя может быть 1 или 0
#define GPIO_TEST2 mdb_buf.ubuf[81] // по умолчанию GPIO5 - нужно GPIO14 - состояние выключателя может быть 1 или 0
#define GPIO_INTR_INIT mdb_buf.ubuf[82] // флаг =1 - драйвер работает, =0 остановлен


ETSEvent GPIOs_intr_taskQueue[GPIOs_intr_TASK_QUEUE_LEN] DATA_IRAM_ATTR;

uint32 GPIO_INT_init_flg DATA_IRAM_ATTR;
uint32 GPIO_INT_Count1, GPIO_INT_Count2 DATA_IRAM_ATTR;
uint32 GPIO_INT_Counter1 = 0, GPIO_INT_Counter2 = 0;

static void GPIOs_intr_handler(void)
{
    uint32 gpio_status = GPIO_STATUS;
    GPIO_STATUS_W1TC = gpio_status;
    if(gpio_status & (1<<GPIO_TEST1)) {
        system_os_post(GPIOs_intr_TASK_PRIO, GPIOs_intr_SIG_SAVE, 1);
        gpio_pin_intr_state_set(GPIO_TEST1, GPIO_PIN_INTR_NEGEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE ?
    }
    if(gpio_status & (1<<GPIO_TEST2)) {
        system_os_post(GPIOs_intr_TASK_PRIO, GPIOs_intr_SIG_SAVE, 2);
        gpio_pin_intr_state_set(GPIO_TEST2, GPIO_PIN_INTR_NEGEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE ?
    }
}

static void ICACHE_FLASH_ATTR task_GPIOs_intr(os_event_t *e)
{
    switch(e->sig) {
        case GPIOs_intr_SIG_SAVE:
            if(e->par == 1) {
                write_user_const(1, GPIO_INT_Counter1=1); // Запись пользовательских констант (0 < idx < 4)
                // ф-я подаем на порт х высокий испульс
            }
            else if(e->par == 2) {
                write_user_const(2, GPIO_INT_Counter2=1); // Запись пользовательских констант (0 < idx < 4)
                // ф-я подаем на порт х высокий испульс
            }
            break;
    }
}

void ICACHE_FLASH_ATTR init_GPIOs_intr(void)
{
    if(GPIO_TEST1 == GPIO_TEST2 || GPIO_TEST1 > 15 || GPIO_TEST1 > 15) {
        GPIO_TEST1 = 12;
        GPIO_TEST2 = 14;
    }
//    ets_isr_mask(1 << ETS_GPIO_INUM); // запрет прерываний GPIOs
    // чтение пользовательских констант (0 < idx < 4) из записей в Flash
    GPIO_INT_Counter1 = read_user_const(1);
    GPIO_INT_Counter2 = read_user_const(2);

    system_os_task(task_GPIOs_intr, GPIOs_intr_TASK_PRIO, GPIOs_intr_taskQueue, GPIOs_intr_TASK_QUEUE_LEN);

    uint32 pins_mask = (1<<GPIO_TEST1) | (1<<GPIO_TEST2);
    gpio_output_set(0,0,0, pins_mask); // настроить GPIOx на ввод
    set_gpiox_mux_func_ioport(GPIO_TEST1); // установить функцию GPIOx в режим порта i/o
    set_gpiox_mux_func_ioport(GPIO_TEST2); // установить функцию GPIOx в режим порта i/o
//    GPIO_ENABLE_W1TC = pins_mask; // GPIO OUTPUT DISABLE отключить вывод в портах
    ets_isr_attach(ETS_GPIO_INUM, GPIOs_intr_handler, NULL);
    gpio_pin_intr_state_set(GPIO_TEST1, GPIO_PIN_INTR_NEGEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE ?
    gpio_pin_intr_state_set(GPIO_TEST2, GPIO_PIN_INTR_NEGEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE ?
    // разрешить прерывания GPIOs
    GPIO_STATUS_W1TC = pins_mask;
    ets_isr_unmask(1 << ETS_GPIO_INUM);
    GPIO_INTR_INIT = 1;
    GPIO_INT_init_flg = 1;
    os_printf("GPIOs_intr init (%d,%d) ", GPIO_TEST1, GPIO_TEST2);
}

void ICACHE_FLASH_ATTR deinit_GPIOs_intr(void)
{
    if(GPIO_INT_init_flg) {
        ets_isr_mask(1 << ETS_GPIO_INUM); // запрет прерываний GPIOs
        gpio_pin_intr_state_set(GPIO_TEST1, GPIO_PIN_INTR_DISABLE);
        gpio_pin_intr_state_set(GPIO_TEST2, GPIO_PIN_INTR_DISABLE);
//        ets_isr_attach(ETS_GPIO_INUM, NULL, NULL);
        GPIO_INTR_INIT = 0;
        GPIO_INT_init_flg = 0;
        os_printf("GPIOs_intr deinit (%d,%d) ", GPIO_TEST1, GPIO_TEST2);
    }
}
//=============================================================================
//=============================================================================
int ovl_init(int flg)
{
    if(flg == 1) {
        if(GPIO_INT_init_flg) deinit_GPIOs_intr();
        init_GPIOs_intr();
        return 0;
    }
    else {
        deinit_GPIOs_intr();
        return 0;
    }
}
 

sharikov

Active member
Не проходит авторизация к страницам protected в мобильном Firefox 47
Устройство на андроид 2.3.6, его штатный браузер авторизацию успешно проходит но он очень старый и не показывает графики в разделе debug and test.
В последней версии FF вообще перемудрили с авторизацией, десктопный 47.0 перестал авторизоваться на роутере dlink, приходится пользоваться ie древней версии.

UPD: если логин/пароль вводить в адресной строке тозаходит
http://ESP8266:0123456789@192.168.4.1/protected/debug.htm
Графики однако не отрисовывает - бежит пустая координатная сетка.
 
Последнее редактирование:

Victor

Administrator
Команда форума
Скажите, @pvvx
эта строка
Код:
os_printf("phy ver: %d, pp ver: %d.%d\n\n", (*((volatile uint32 *)0x6000107C))>>16, ((*((volatile uint32 *)0x600011F8))>>8)&0xFF, (*((volatile uint32 *)0x600011F8))&0xFF);
из esp8266web/startup.c at master · pvvx/esp8266web · GitHub
позволяет узнать версии библиотек только из вашего SDK ?
Как получить эти константы и для других библиотек стандартного SDK от Espressif, чтобы было видно применен ли очередной патч SDK в текущей сборке
 
Сверху Снизу