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

Нагрев NodeMCU и SDK

Noperkon

New member
delay(1) + for(...) - не греется
Но я не уверен что оптимизатор вообще пропускает пустой цикл.
 

enjoynering

Well-known member
там вроде пишут если даже вызвать delay(1) в setup эффект тот же - низкое потребление. не могли бы вы проверить?


Код:
#include <ESP8266WiFi.h>

void setup()
{
    delay(1);
    WiFi.mode( WIFI_STA );
    WiFi.begin( "********", "********" );
}

void loop()
{
  //empty
}
в общем это баг-фича от китайцев
So it is something in the core libraries (or SDK) which is changing something to have this effect.
аименно с SDK os_timer из /cores/esp8266/core_esp8266_wiring.cpp
Код:
void delay(unsigned long ms) {
    if(ms) {
        os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0);
        os_timer_arm(&delay_timer, ms, ONCE);
    } else {
        esp_schedule();
    }
    esp_yield();
    if(ms) {
        os_timer_disarm(&delay_timer);
    }
}
 

Noperkon

New member
Уже попробовал. Нагрев, увы, есть.
Ну да ладно, для мох текущих задач задержка в 1мс на цикл не так критична.
Хотя, конечно, странно что о такой "особенности" не написано большими красными буквами на каждом заборе.
 

enjoynering

Well-known member
ну кто ж вам про такое писать будет :). это ж адь и израиль, рукалицо, жесть и тд.
 

nikolz

Well-known member
Кое-что стало прояснятся, но появились новые вопросы.
Нагрев под SDK удалось побороть вставив в loop небольшой delay. В простое все отлично - контроллер абсолютно холодный, но ведь под нагрузкой (к примеру будет отдавать в сеть большой файл) эта задержка будет как палка в колесах. Как бы так сделать чтобы и волки сыты были и овцы целы?
под SDK надо не цикл делать а колбеки использовать как и в LUA и ничего греться не будет
если изучите основы разработки систем реального времени, то греться ничего не будет.
 

enjoynering

Well-known member
под SDK надо не цикл делать а колбеки использовать как и в LUA и ничего греться не будет
если изучите основы разработки систем реального времени, то греться ничего не будет.
а покажите пример правильной реализации колбеков, а то как говорят - трепаться не мешки ворочать. спасибо
 

pvvx

Активный участник сообщества
а покажите пример правильной реализации колбеков, а то как говорят - трепаться не мешки ворочать. спасибо
Это противоречит концепции Arduino. Реализуется исключительно хаками и прочими костыльными методами с правкой всех библиотек и самого ядра Arduino в ESP.
Сам 'си' SDK ESP8266 (и базовые ROM функции) работают по событиям и в цикле ожидания прерываний стоят на asm команде понижения потребления CPU.
 

nikolz

Well-known member
Это противоречит концепции Arduino. Реализуется исключительно хаками и прочими костыльными методами с правкой всех библиотек и самого ядра Arduino в ESP.
В начале темы вроде бы речь шла о СИ а не о дурине? или я что-то упустил?
а покажите пример правильной реализации колбеков, а то как говорят - трепаться не мешки ворочать. спасибо
Ну вам то зачем примеры? Вы же спец. Все знаете. или я что-то пропустил?
А примеры есть в док по SDK
 

pvvx

Активный участник сообщества
В начале темы вроде бы речь шла о СИ а не о дурине? или я что-то упустил?
Описано использование Loop и Delay() - это Arduino.
При этом реализация Delay() в Arduino вызывает системную ROM функцию с указанной asm командой (ожидания в режиме понижения потребления CPU до срабатывания прерывания или заданного счетчика тактов).
В Lua вызов данной ROM функции встроено практически в каждой команде...
 

pvvx

Активный участник сообщества
Заметил что программы выполняющие одинаковые функции (простой блинк) написанные для NodeMCU и SDK вызывают разный нагрев контроллера (esp8266). Если сишная программа греет весьма заметно, то программа на Lua оставляет устройство практически холодным.
Соответственно вопрос - с чем это связано?
С методом описания программы на "си" по концепции Arduino (всё в Loop()) и без RTOS.
Если долго нет вызова ets_run(), то в итоге срабатывает программный WDT и не работает WiFi.
ets_run() - это обработчик событий в ROM с командой:
asm volatile ("waiti 0;"); // Wait for Interrupt
 

enjoynering

Well-known member
Ну вам то зачем примеры? Вы же спец. Все знаете. или я что-то пропустил?
А примеры есть в док по SDK
я не специалист иначе бы тут не сидел. если уж собрались поучать молодежь, то хотя бы ссылку дайте на чужой пример, чтоб новичкам типа меня было на чем учится.
или вы сюда приходите ЧСВ поднять - вылили ушат и в закат на белом коне?
 

enjoynering

Well-known member
Описано использование Loop и Delay() - это Arduino.
При этом реализация Delay() в Arduino вызывает системную ROM функцию с указанной asm командой (ожидания в режиме понижения потребления CPU до срабатывания прерывания или заданного счетчика тактов).
В Lua вызов данной ROM функции встроено практически в каждой команде...
а есть ли в sdk функция понижения потребления CPU, чтоб костылем delay(1) не пользоваться?
 

pvvx

Активный участник сообщества
а есть ли в sdk функция понижения потребления CPU, чтоб костылем delay(1) не пользоваться?
Как таковой, для простого использования, нет. И delay(1) - это не SDK, а Arduino.
В Arduino, в delay(), производится переключение контекста для исполнения обработки системных функций (в частности WiFi, подтверждения WDT и прочего, что относится к самой системе, но не к Arduino).
Сама базовая система работает по событиям. Обработка многих прерываний так-же происходит по событиям, которые устанавливаются типа как калбаки для обработчика в функции est_run(). Прямой вызов функции ets_run() не возможен, так он не имеет return. После загрузки и инициализации SDK она вызывается один раз и CPU в ней вечно крутится, вызывая калбаки, такие как софт-таймер и обработчики событий WiFi.
В её цикле стоит команда [inline]asm volatile ("waiti 0;");[/inline] а после него проверка таблиц калбаков по приоритетам, которые заполнятся по аппаратным прерываниям и системным командам ets_post()/ets_task().

Панацеей по потреблению "waiti 0;" не является - CPU на ней жрет 14..17 мА (без учета WiFi) , а в максимуме, к примеру при активном заполнении RAM и использовании IRAM (работают все внутренние шины) и за 70 мА.
 

pvvx

Активный участник сообщества
Arduino (для ESP8266) реализована двух-задачная (двух-поточная ) система. Но переключение контекста с обработкой треда/потока системы происходит не по таймеру, а вручную : ) - в delay() и в некоторых реализациях в процедуре вызывающей пользовательский Loop().
 

pvvx

Активный участник сообщества
Такая реализация Arduino для ESP8266 произошла от глупости дурино-писателей. Они не смогли разобрать саму систему, реализованную в ROM ESP8266 и начальном SDK - не смогли встроить в её события необходимую обработку... А далее всё так и пошло и поехало...
 

pvvx

Активный участник сообщества
Альтернативное решение дурино-писателям, как задействовать саму систему и встроить в неё, было дано*, но “толпа всегда выбирает худшее” ((c) планета Земля).

Детям писать систему, основанную на событиях сложно. Arduino образовалось как игра для детей и в своей концепции не имеет мультизадачности, много-поточности, событий и т.д. (как и в Lua). По этой причине такие вещи реализуются как патчи и особо специфичны. Ну и т.к. это немного сложно для детей, то документации по реализации таких структур на Arduino не существует или не распространены. Тем более зачем это, если в имеющейся системе Arduino ESP8266 уже встроено какое-то кривое решение и переписывать всё с нуля никто не станет – возникнет несовместимость с уже имеющимися описаниями, ‘как надо писать’ на Arduino ESP8266…

*Пример замены ets_run()на свою: pvvx/EspLua
 

enjoynering

Well-known member
Детям писать систему, основанную на событиях сложно. Arduino образовалось как игра для детей и в своей концепции не имеет мультизадачности, много-поточности, событий и т.д. (как и в Lua).
я щас посмотрел исходники они там здорово почистили, по сравнению с 2.4.0. гладишь так к 3.0.0 доберемся и до мультизадачности.
 
Сверху Снизу