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

Прямой доступ к GPIO регистрам.

remrum

Member
Экспериментируя с ногодрыгом выяснил что максимальная скорость переключения портов:
  • digitalWrite(arduino) ~ 1.1 MHz.
  • непосредственно через регистр 0x60000300(GPIO_OUT) ~ 1.8 MHz.
  • тоже самое и через 0x60000304/ 0x60000308 ~ 1.8 MHz.
Ещё нашел странный способ через управление sigma-delta, например:
GPIO_OUT = 1 << 13; // high gpio13
// 0x6000035C(GPIO_PIN13) 1: sigma-delta; 0: GPIO_DATA
GPIO_PIN13 = 1; // low
GPIO_PIN13 = 0; // high
  • Так получается ~ 5.7 MHz.
Прошу поделится способами быстрого доступа к GPIO.
Меня особенно сильно интересует максимально быстрое считывание со входа.
 

NutsXXXL

New member
@remrum
digitalWrite это кучка кода if else вот и медленнее
я думаю на asm еще бы быстрее вышло :)
однако _ввод_ это совсем другое дело, с ним так или иначе нужно организовывать триггер или счетчик или фильтр в общем гораздо медленнее.
Или что там означает считывание...
 

remrum

Member
Ардуиновский digitalWrite привел для сравнения. Кстати, частота зависит от режима работы флешь памяти.

Насчет “считывания” :) имею ввиду например банально со входа в память или подсчитывать длительность логического уровня (подобие RLE).

Вот что нарыл

Код:
#define PIN_IN *(volatile uint32_t *)0x60000318
#define DIN 4
…
static inline unsigned get_ccount(void) {
        unsigned r;
        asm volatile ("rsr %0, ccount" : "=r"(r));
        return r;
}
…
tick1 = get_ccount();
while(PIN_IN & (1 << DIN));                                   
tick2 = get_ccount();
   
count = tick2 - tick1;


Так получается считать меандр до 1MHz с точностью до 17 тактов независимо от частоты. 17 тактов видимо и есть один проход while.

На этом и можно остановится, но наверняка можно быстрее ;)

Может кто-то поделится своим опытом, например на ассемблере или используя аппаратные интерфейсы.
Да вот еще чуть не забыл, на время подсчетов я отключал WiFi и wdt.
 

Atom

Member
Да вот еще чуть не забыл, на время подсчетов я отключал WiFi и wdt.
увеличение скорости с 1MHZ do 1.7 не такой и великий прирост.

Проблема в том, что максимальной отдачи по быстродействию именно кода user можно достичь, только переведя ему максимальный приоритет.. Если исходить из принципа максимального быстродействия, то самый короткий путь - выкинуть SDK совсем. Можно, конечно, извратиться зацикливанием кода в loop(). Но не суть.

И тут всплывают такие периферийные вещи, как WiFi, Serial и прочие мелочи. Если уж и нужно вести обравотку с высокой скоростью чего либо - делайте для этого отдельный cpu: arv, stm32, pic -
куча кристаллов на любой цвет, вкус, цену и средства отладки.
 

NutsXXXL

New member
@remrum только асм только хардкор
так что для подсчета длины импульсов используют таймер-счетчик
если он по скорости не тянет то надо ставить внешний, в контроллере или fpga какую ...
 

remrum

Member
FPGA для моей задачи точно перебор. Внешний мк не хотелось бы тоже.
Просто видя к чему может привести пытливый ум - ESP8266 Analog Broadcast Television Interface
мне кажется , что имеется потенциал.
К сожалению я не обладаю таким скиллом ...
Вот и прошу подкинуть идейку, поближе к реализации . Сам конечно тоже пытаюсь разобраться.
 

NutsXXXL

New member
@remrum Ну... с первым апрелем Вас :)
даже если так действовать таким извратом то это будет примерно так: зацифровать выборку бит в буфер, затем анализировать.
в это время будет пауза для выборки. пусть даже небольшая и оцифровка идет в фоне.
для какого то круга задач с прерывистом потоком данных это сработает:
в конце концов OBDEV AVR USB так и работает и огромное количество людей используют это.
и древние АОН на Z80 из 90х так работали - оцифровывали в в буфер кусок тонального кода и анализировали: куча тонких настроек даже была..
но тогда времена были другие...
 

pvvx

Активный участник сообщества
У шины к GPIO (и прочим регистрам) работает fifo и проц тормозиться на время вывода fifo.
Сами входы/выходы контроллера GPIO вероятно стробируются с шагом примерно 75 нc. Программный вывод в GPIO со всеми ухищрениями выходит к 13МГц, а не как у вас.

Части начальной разборки с GPIO и прочим можно найти там:
http://esp8266.ru/forum/threads/tajmer-i-gpio.75/page-2#post-1318
http://esp8266.ru/forum/threads/spi.59/page-2#post-5508
 

remrum

Member
pvvx спасибо за ссылки.

NutsXXXL не все первое апреля, что первого апреля.
Попробовал залил espthernet
К сети не подключал, просто подал на вход 1MHz. Результат во вложение.
Кроме .bin файлов еще надо добавить 0x10000 - web/page.mpfs .

i2s_1mhz.png
 

NutsXXXL

New member
@remrum да я упустил этот репозиторий
но там мудрости... я весьма с трудом понимаю, что он там творит в своем коде, думаю надо описания читать
 

pvvx

Активный участник сообщества
Попробовал залил espthernet
К сети не подключал, просто подал на вход 1MHz. Результат во вложение.
Там жуткая оптимизация и ни шагу в сторону. Такое не годиться для большинства применений... Это чисто спортивный интерес ;)
 
Сверху Снизу