RTL+OpenOCD+STLinkV2

pvvx

Активный участник сообщества
Т е правильно ли я вас понял (поправьте если , не понял)
что при работе CPU на 83 MHz без WIFI составляет 55 ма (по моим замерам 67 ма)
Вы опровергаете даташиты на чип? (И весь мир ARM, закрепивший и доказавший эффективность своего ядра в сравнении с другими) :)
Вы уверены, что у вас 83 MHz на чипе?
ESP8266 при 80MHz валит за 70 мА. Если использовать его команду отключения CPU до прерывания, то выходит более 7 мА на ней. Она использована в ets_run() у ESP.
В вашей программе не вижу использования команд понижения потребления.
Сядьте и изучите как работают CPU, системы их команд, построение операционных систем, перед тем как строить сравнения.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Т е RTL8710 потребляет 7 ма в режиме прерывания от внешнего пина т е когда CPU отключено верно?
Нет.
Для таких вариантов используют другие фичи чипа, которые в нем есть, в отличии от ESP8266.
Вам уже написал - вы неверно подходите к измерениям и сравнениям. Это проблем у вас от жизни с ESP. Тут другой CPU и чип и он имеет большие варианты возможностей реализации разных нужных вещей. Не зацикливайтесь на ESP.
Не все алго что хорошо на ESP хорошо на RTL и наоборот. У RTL просто больше вариантов.

Самое простое, чтобы не впадать в сложные описания:
На RTL можно переключить частоту CLK до пары MHz на ходу, а в ESP - нет. И это переключение занимает несколько тактов CPU.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вы как всегда пошли в демагогию.
Не отвлекайтесь.
Да идите ка вы нафиг. :p

Пример проги я дал Модуль WIFI по Вашим словам отключен. а ток фигачит 67 ма.
У ESP в таком режиме 14 ма.
что не так?
Ваш непробиваемый тупизм и неумение делать замеры и ставить адекватные сравнения.
В ESP вы используете операционную систему, стартующую по умолчанию. Она работает исполняя в ets_run() команду отключения CPU до прерывания.
В случае с RTL вы запустили CPU на 166 MHz и не включали никакой операционки и команд понижения потребления или остановки CPU.
Так вот вы и делаете все сравнения и замеры, чисто на лжи. :p

Читайте внимательнее - ARM CPU RTL серии "A" и ESP8266 на одинаковой частоте имеют одинаковое потребление. ARM выигрывает в нескольких командах для его CPU.
Всё остальное - это наличие доп. фич в самом чипе. У RTL их больше.

Вы прекрасно доказали свою зависимость от алго ESP. По другому уже мыслить даже не можете :p
Еспэшность головного мозгу? :) :)
А у нас тут уже новые CPU повсеместно...
У меня комп в режиме активности всего потребляет за 800 Вт, а при ожидании "просыпания" - до 7 Вт (тут точно не измерял - там зависит от кол-ва устройств активации :) ).

PS: Вас опять прокатил Rebane подкинув свой пакет сборки :) Даже частоту CPU своего модуля не знаете, а уже строите сравнения и заключения. :)
По вашему выходит, что ESP8266 потребляет 14 мА. В идентичных условиях у RTL"A" 7 мА
 
Последнее редактирование:

pvvx

Активный участник сообщества
Специально для вас измерил потребление модуля ESP8266 с активным CPU.
Вышло 47.8 mA - копирование памяти.
Я Вас правильно понял, что ток потребления 67 ма - это с выключенным WiFi
Программа теста такая:
Код:
#include <stdint.h>
#include <stdio.h>
#include "cortex.h"
#include "rtl8710.h"
#include "mask.h"
#include "serial.h"

volatile uint32_t timer;
void timer_init(){
    cortex_interrupt_disable(TIMER0_INT);
    timer = 0;
    PERI_ON->SOC_FUNC_EN |= PERI_ON_SOC_FUNC_EN_GTIMER; // enable timer peripheral
    PERI_ON->PESOC_CLK_CTRL |= PERI_ON_CLK_CTRL_ACTCK_TIMER_EN; // enable clock for timer peripheral
    PERI_ON->PESOC_CLK_CTRL |= PERI_ON_CLK_CTRL_SLPCK_TIMER_EN;
    TIMER->TIM0_LOAD_COUNT = 0xFFFF; // this is the value that the timer counter starts counting down from
    TIMER->TIM0_CONTROL = TIMER_CONTROL_MODE; // 1 - user-defined count mode, 0 - free-running mode
    TIMER->TIM0_CURRENT_VALUE = 0x7FFF; // start value
    TIMER->TIM0_CONTROL |= TIMER_CONTROL_ENABLE; // enable timer0
    cortex_interrupt_set_priority(TIMER0_INT, 0);
    cortex_interrupt_clear(TIMER0_INT);
    cortex_interrupt_enable(TIMER0_INT);
}

int main(){
    uint8_t c;
    uint32_t delay, uptime;
    PERI_ON->CPU_PERIPHERAL_CTRL |= PERI_ON_CPU_PERIPHERAL_CTRL_SWD_PIN_EN; // re-enable SWD
    PERI_ON->PESOC_CLK_CTRL |= PERI_ON_CLK_CTRL_ACTCK_GPIO_EN | PERI_ON_CLK_CTRL_SLPCK_GPIO_EN; // enable gpio peripheral clock
    PERI_ON->SOC_PERI_FUNC1_EN |= PERI_ON_SOC_PERI_FUNC1_EN_GPIO; // enable gpio peripheral

    delay = uptime = 0;
    timer_init();
    serial_init();
    mask32_set(SYS->CLK_CTRL1, SYS_CLK_CTRL1_PESOC_OCP_CPU_CK_SEL, 1); // set system clock
    PERI_ON->GPIO_SHTDN_CTRL = 0xFF;
    PERI_ON->GPIO_DRIVING_CTRL = 0xFF;
    GPIO->SWPORTA_DDR |= GPIO_PORTA_GC4;
    interrupts_enable();

    while(1){
        if(delay++ > 1000000){
            GPIO->SWPORTA_DR ^= GPIO_PORTA_GC4;
            printf("UPTIME: %lu, TIMER: %u\n", (unsigned long int)++uptime, (unsigned int)timer);
            delay = 0;
        }
        if(serial_read(&c, 1)){
            if(c == '1'){
                printf("COMMAND 1\n");
            }else if(c == '2'){
                printf("COMMAND 2\n");
            } // ... etc
        }
    }
}

ssize_t write_stdout(const void *buf, size_t count){
    size_t i;
    for(i = 0; i < count; i++){
        if((((uint8_t *)buf)[i]) == '\n')while(!serial_write("\r", 1));
        while(!serial_write(&(((uint8_t *)buf)[i]), 1));
    }
    return(count);
}

CORTEX_ISR(TIMER0_INT){
    timer++;
    (void)TIMER->TIM0_EOI; // reading from this register clears the interrupt
    cortex_interrupt_clear(TIMER0_INT);
}
Ваш пример на rtlDuino:
Код:
#include <GTimer.h>
#include <iostream>
using namespace std;

uint64_t counter;

void myhandler(uint32_t data) {
  counter++;
}

void setup() {
  GTimer.begin(0, 1 * 1000 * 1000, myhandler);
}

void loop() {}

void serialEvent() {
  uint8_t c = Serial.read();
  if (c == '1') {
    cout << "COMMAND 1" << endl;
    sys_info();
  } else if (c == '2') {
    cout << "COMMAND 2" << endl;
    cout << "Counter: " << counter << endl;
  } // ... etc
}
logUART (после загрузки ввел в монитор "1" и потом "2"):
Код:
Init Heap Region: 0x10003000[12288]
Init Heap Region: 0x10025f10[303344]
Init Heap Region: 0x30000120[2096864]
COMMAND 1

CLK CPU         166666666 Hz
RAM heap        2344280 bytes
TCM heap        64768 bytes
COMMAND 2
Counter: 3
Потребление 29.66 mA:
Снимок83.gif
(Там где провал до 24 мА - это был вывод сообщения по вводу в Uart символа, как вы и задумывали...)
Модуль RTL8711AM (166MHz, 2.5MB RAM)

PS: к сожалению на ESP8266 не проверить данный скетч, т.к. Arduino у ESP8266 не поддерживает С++ и вообще не может распечатать uint64_t никакими стандартными процедурами из SDK или Arduino.
PS2: Измерил потребление ESP8266 с выключенным WiFi блоком при активном CPU - вывалиивает за 47 мА (зависит от того, какие функции он выполняет)... Просто при удержании RESET, с выключенным WiFi, он потребляет от 22 мА...
Снимок81.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
Как там ваше
по моим замерам 67 ма
?
Проигрывание MP3-радио с сети c выводом ШИМ 2-х каналов (stereo), включенным и работающим WiFi, потребляет как раз 67 мА на 83МГц (72 мА на 166 МГц). Но там задействовано множество внутренних контроллеров с DMA и на максимальной частоте.

Для адекватного сравнения потребления самого CPU у RTL и ESP вам надо запустить тест Dhrystone Benchmark, версии 2.1. Для него есть большая база по скорости для многих MCU и SoC (для ESP - нет, наверно сикрет :), т.е. это показывает распространенность ESP в эмбедед - в сети данных на их производительность не найти).
Измерение производительности для RTL:
https://esp8266.ru/forum/threads/moduli-rtl8195am-mjiot-amb-02-transfer-board-mjiot-amb-debug-01.2665/#post-39410
https://esp8266.ru/forum/threads/mjiot-amb-03-debug-rtl8710bn.2664/page-2#post-39469
Измерить в данном тесте потребление не сложно...
Если вам требуется малое потребление для автономных датчиков, то ESP не могут участвовать в данном выборе. Надо смотреть в сторону RTL серии "B" или вариантов WiFi-SoC от TI...
 
Последнее редактирование:

pvvx

Активный участник сообщества
У меня для ESP-12 с выключенным модулем WIFI и активным CPU ток потребления 14 ма, что соответствует документации.
Нету там такого. Ссылку на доку в студию. :)
Это в режиме DTIM() - LIGTH SLEEP при работе только Station, когда процессор не воспринимает никакие прерывания между beacon-ами (попросту отключен). И все замеры и рекламные объявления от Espressif говорят, что средний ток там всегда более 15 мА.
У вас может быть всё что угодно - это вы много раз уже приводили голословно. :)
Хоть раз возьмите стандартную плату ESP и пусть даже Arduino и приведите скетч для альтернативного подтверждения другими ваших заявок.
Наверно измерять ток потребления не умеете.
 
Последнее редактирование:

pvvx

Активный участник сообщества
CPU активен и включен таймер.
Глубоко не смотрел,
но для RTL8710 ровно такой же тест дал 67 ма.
С включенными всеми контролерами, завышенным внутренним напряжением (есть регистры их управления и правильная SDK ставит их в надлежащие значения) и на частоте, не соответствующей документации на на данный чип (оверклок в 2 раза). Вас предупреждал - не пользуйтесь пакетами и тем, что вам дал Rebane. Там всё не доделано, но об этом не сказано.
В таких условиях ESP8266 может показать и за 300 мА. :p
У ESP-32, если перевести ваш тест туда, вылезут пики и в 500 мА :)
----------
Если вы не понимаете что измеряете, то вот вам аналогия:
На автомобиль пишут, что он жрет (пусть) 8 литров на 100 км в городских условиях, при этом имеет бензо движок объемом за 1.2 литра. Ваш тест показывает, что на стенде его движок при максимальной нагрузке жрет от 35 литров/час и при этом не передвинется ни на метр. :)
-----
Если взялись сравнивать, то хотя-бы сделайте это в одинаковых условиях и задачах, да в операционной среде, для которой разработан чип. Применить самое неоптимальное решение для выдавливания максимального потребления можно у любого чипа.

PS: Замкните GPIO и сделайте на них КЗ, как например на ESP-01, при выводе в порт GPIO15 единички – сразу получим от 100 мА :)
 
Последнее редактирование:
Сверху Снизу