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

Медленные внешние прерывания

userloser

New member
Пытаюсь заставить esp8266 среагировать на внешнее прерывание в течении не более одной микросекунды от получения сигнала, но микроконтроллер реагирует не очень шустро.

В общем, картинка получается такая:



Второй канал - входящий сигнал на GPIO, первый канал (желтый) - выходящий. В лучшем случае interrupt handler запускается с опозданием в 6-7 микросекунд, в худшем может опоздать на 20 микросекунд и больше, при выключенном WiFi.

Попробовал прошивки ардуино, esp-open-rtos и SDK espressif, результат практически одинаковый. Выходящий сигнал генерирую прямой манипуляцией GPIO регистров, запоздание там в порядке 100ns, что кажется нормально для этого процессора и bus-а, так что проблема не в запоздании выходного сигнала, а interrupt handler-а.

На esp8266.com прочитал, что можно попробовать что-то такое:

Comment about low-latency interrupts - Everything ESP8266

но я не очень разбираюсь в деталях esp8266 и пока еще не успел запустить работающий вариант.

Буду благодарен идеям, подсказкам или примерам.
 

userloser

New member
1) Надо делать вставки на ассемблере.
2) Опишите задачу подробнее.
Если запаздывание постоянно и не нужна реакция менее 1 мкс, то можно просто учесть запаздывание в дальнейших расчетах.
1) Понятно, вопрос в том какие точно вставки. На esp8266.com предлагают, чтобы

You can do this by replacing either _UserExceptionVector or (if you can't fit what you need in 0x20 bytes) you can replace _UserExceptionVector_1.

There are a few ways to replace an interrupt vector. The espgdbstub does this for DebugExceptionVector by just writing a new jump instruction into IRAM at the DebugExceptionVector address: https://github.com/esp8266/Arduino/blob ... try.S#L282

... this seems kind of hacky to me. I would recommend using the --wrap option of the linker to wrap _UserExceptionVector or _UserExceptionVector_1 at link time,
Пока не получается запустить такую вставку успешно, так как я не очень разбираюсь в esp* и только начал читать руководство процессора, а там куча страниц с буквами ;)

2,3) Задача простая - в устройство входят случайные аналоговые сигналы, которых нужно оцифровать. Сигнал от компаратора запускается началом аналогового сигнала, сам аналоговый сигнал содержится в интервале компаратора, а контроллер управляет запоминающим устройством (ЗУ) и должен открыть и закрыть транзисторные ключи, управляющие ЗУ по началу и концу компараторного сигнала. Процесс генерации сигнала случайный и угадать/учесть его начало невозможно.

Разумеется, можно использовать что-то вроде триггера на быстрых nand-элементах для управления ключами и просто выждать пока контроллер среагирует, но там есть другие проблемы. Не очень хочется усложнять и схему, т.к. логика несложная и похоже, что ее можно всю выполнить в процессоре.
 
Последнее редактирование:

userloser

New member
попробую зайти с другого конца.
Если надо обрабатывать сигнал аналоговый, то следует вспомнить теорему найквиста.
В соответствии с ней сигнал можно полностью восстановить если брать выборки с частотой 2*fm, где fm - максимальная частота не нулевой спектральной плотности сигнала.
Переходим от теории к практике на вашем случае.
Вы пытаетесь квантовать сигнал с интервалом 0.5 мкс. Это значить что Вы пытаетесь обработать аналоговый сигнал с полосой более 1 Мгц.
Это ESP сделать в принципе не может.
--------------------
Попробуйте сначала конкретизировать задачу на предмет конечного результата. Что вам нужно в конце.

Вообще-то аналоговый сигнал тут нипричем, а задача предельно конкретизирована уже в первом посте - может ли esp8266 запустить потребительскую функцию на внешнее прерывание (GPIO interrupt handler) за время порядка 0.5 - 1мкс.
 

userloser

New member
только на ассемблере
и делать это надо на голом металле без wifi и OS
Может быть это будет работать, а может и нет - esp8266 не только процессор, а SoC, многое зависит от того как связаны процессор с другими компонентами - wifi radio, шинами для I/O и коммуникаций и т.п. К сожалению, документация для целой системы неполная.

Вы спросили про прерывание. Я вам ответил как это получить.
А зачем Вы используете ESP это уже другой вопрос.
-------------
для справки wifi можно отключать и включать.
Это не я спрашивал, но вопрос уместен. Кстати, wifi можно отключать и включать, но это не отключает абсолютно все, есть non-maskable interrupts, которых вообще невозможно остановить и они всегда перерывают потребительские процедуры, даже если wifi "отключено".

Наверное для управления ЗУ будет легче и быстрее сделать что-то на PLD перед контроллером.

Спасибо всем за советы.
 

userloser

New member
Прямой доступ к металлу для GPIO намного быстрее, как я уже писал выше. Описание адресов регистров GPIO esp8266 можно найти здесь:

esp8266/esp8266-wiki

Минимальное время обнаружения внешнего сигнала порядка 0.1 мкс.
Время около 100-200нс, но в этом случае существует гонка между циклом прослушивания GPIO и немаскируемыми прерываниями от радио, а еще и серьезное ограничение функциональности esp8266.

Использование прерываний более "правильное", так что я все таки попробую написать работающий пример замены UserExceptionVector, только надо найти время почитать спецификацию и понять что там работает и почему :)
 

sharikov

Active member
Может быть это будет работать, а может и нет - esp8266 не только процессор, а SoC, многое зависит от того как связаны процессор с другими компонентами - wifi radio, шинами для I/O и коммуникаций и т.п. К сожалению, документация для целой системы неполная.
Периферийная шина PBUS тактируется частотой 26MHz. Между процессором и PBUS есть fifo на 8 слов так что после исполнения команды записи процессором не стоит думать что регистр изменится сразу же.
Подробнее копали в теме про HSPI в 16 году.
 

userloser

New member
В загрузчик rboot помещаете свою прикладную задачу которая обрабатывает внешние сигналы и собирает результаты в память. Если надо передать данные по WIFI то запускаете прошивку с WIFI и передаете.
Ага. Я даже не знал, что такое возможно.

A boot loader tutorial for ESP8266 using rBoot - Richard's stuff

Спасибо.
 

userloser

New member
Периферийная шина PBUS тактируется частотой 26MHz. Между процессором и PBUS есть fifo на 8 слов так что после исполнения команды записи процессором не стоит думать что регистр изменится сразу же.
Подробнее копали в теме про HSPI в 16 году.
Эта тема?

https://esp8266.ru/forum/threads/spi.59/
 

Alkciviad

New member
В этой теме ответили на вопрос о максимальной частоте прерываний для обработки аналогового сигнала. Не могли бы вы также по опыту подсказать какой частоты приема данных можно добиться на nonos SDK по параллельному интерфейсу? Не отключая радио, а наоборот проводя передачу больших объемов.
 
Последнее редактирование:

nikolz

Well-known member
В этой теме ответили на вопрос о максимальной частоте прерываний для обработки аналогового сигнала. Не могли бы вы также подсказать какой частоты приема данных можно добиться на nonos SDK по параллельному интерфейсу?
максимальная частота прерываний порядка 1 Мгц.
 

Alkciviad

New member
Нет, до такого извращения даже я бы не додумался. У меня была мысль записывать полученные по проводам байты в массив и затем отправлять пакетами по 512 байт. Я хочу понять можно ли отсылать эти пакеты одновременно с получением данных через прерывания. Или мне придется использовать посредника, который будет пересылать данные по UART или SPI
 

nikolz

Well-known member
Нет, до такого извращения даже я бы не додумался. У меня была мысль записывать полученные по проводам байты в массив и затем отправлять пакетами по 512 байт. Я хочу понять можно ли отсылать эти пакеты одновременно с получением данных через прерывания. Или мне придется использовать посредника, который будет пересылать данные по UART или SPI
нет не можно.
Полагаю можно принимать блоками и отправлять Когда отправляете перекуривать.
но что-то мне подсказывает что ваша задача решается проще чем вы думаете
 
Сверху Снизу