Прямой доступ к 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. Результат во вложение.
Там жуткая оптимизация и ни шагу в сторону. Такое не годиться для большинства применений... Это чисто спортивный интерес ;)
 
Сверху Снизу