• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
нет не можно.
Полагаю можно принимать блоками и отправлять Когда отправляете перекуривать.
но что-то мне подсказывает что ваша задача решается проще чем вы думаете
 
Сверху Снизу