Программирование ARM ESP-IDF: высокоуровневые прерывания ESP32 Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


ESP-IDF: высокоуровневые прерывания ESP32 Печать
Добавил(а) microsin   

ESP32 основан на архитектуре Harvard Architecture Xtensa LX6 CPU (2 ядра). ESP32-C3 основан на архитектуре RISC-V ISA CPU (1 ядро).

Ядра CPU ESP32 Xtensa поддерживает до 32 прерываний, поделенных на 7 уровней приоритета от 1 до 7, где 7 это NMI (не маскируемое прерывание), плюс ассортимент исключений. На ESP32 мультиплексор прерываний позволяет большинство прерываний маршрутизировать на эти прерывания с помощью interrupt allocator [3]. Обычно обработчик для прерываний пишется на C, однако ESP-IDF также позволяет писать обработчики высокого уровня на ассемблере, чтобы добиться для них минимальной латентности.

Ядро CPU ESP32-C3 основано на архитектуре RISC-V, и по этой причине у него способ обработки прерываний в таблице векторов ASM отличается от ESP32 (архитектура Xtensa). В основном ESP32-C3 позволяет кодировать высокоуровневые обработчики прерывания на C, и здесь нет такого же реального выигрыша по времени обработки, как для ESP32, если писать обработчики на ASM (даже для уровня прерывания NMI). Для прерывания уровня NMI только требуется, чтобы оно не блокировалось любой критической секцией, так что вы по-прежнему можете ожидать до 2 мкс задержки на вход в код ISR, и до 5 мкс задержки прерывания, если произошло переключение контекста (из-за работы WIFI/BLE).

Таблица 1. Уровни приоритета прерываний.

Уровень Символ Примечание
1 - Exception и прерывания уровня 0. Обрабатывается кодом ESP-IDF.
2 .. 3 - Прерывания среднего уровня. Обрабатывается ESP-IDF.
4 xt_highint4 Свободно для использования(1).
5 xt_highint5 Обычно используется логикой отладки ESP-IDF (debug logic)(1).
NMI xt_nmi Свободно для использования.
dbg xt_debugexception Debug exception. Вызывается, к примеру, инструкцией BREAK(2).

Примечания:

(1) ESP-IDF debug logic может быть сконфигурирована для запуска на xt_highint4 или xt_highint5 в опции CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL. Прерывание Bluetooth может быть сконфигурировано на уровне 4 путем разрешения опции CONFIG_BTDM_CTRL_HLI. Если эта опция разрешена, то ESP-IDF debug logic должна работать на уровне прерывания 5.
(2) Если опция CONFIG_BTDM_CTRL_HLI разрешена, то xt_debugexception используется для исправления бага live lock ESP32 ECO3.

Использование символов из таблицы 1 осуществляется созданием файла на ассемблере (с расширением .S) и определением именованных символов, примерно так:

   .section .iram1,"ax"
   .global     xt_highint5
   .type       xt_highint5,@function
   .align      4
xt_highint5:
   ... здесь Ваш код
   rsr     a0, EXCSAVE_5
   rfi     5

Реальный пример см. в файле esp_system/port/soc/esp32/highint_hdl.S, здесь реализован обработчик прерывания паники ядра (panic handler interrupt).

Замечания:

• Не вызывайте код на C из высокоуровневого прерывания, поскольку эти прерывания выполняются из критической секции, и это может привести к краху программы. Обратите внимание, что хотя panic handler interrupt does вызывает обычный код C, здесь это дозволяется, поскольку по факту из этого обработчика не делается возврат (т. е. приложение не может продолжить свое нормальное выполнение после вызова panic handler).

Когда разрешена опция CONFIG_BTDM_CTRL_HLI, код C также вызывается из высокоуровневого прерывания, и это стало возможным благодаря добавленной дополнительной защиты.

• Убедитесь, что код ассемблера нормально линкуется. Действительно, поскольку свободные для использования символы объявлены как weak, линковщик может отбросить файл, содержащий этот символ. Этот произойдет, если единственным определенным или используемым символом является свободный для использования символ xt_*. Чтобы избежать этого, в ассемблерном файле, содержащем символ xt_*, определите другой символ, примерно так:

   .global ld_include_my_isr_file
ld_include_my_isr_file:

Здесь вызывается "ld_include_my_isr_file", но он может иметь любое имя, пока оно не определено ещё где-нибудь в проекте.

Затем в CMakeLists.txt добавьте это имя в качестве unresolved symbol для аргументов командной строки ld:

    target_link_libraries(${COMPONENT_TARGET} "-u ld_include_my_isr_file")

Это должно привести к тому, что линкер всегда подключит файл ld_include_my_isr_file, и ISR всегда будет слинкован.

• Высокоуровневое прерывание может быть перенаправлено и обработано с использованием esp_intr_alloc() и привязанных функций. Однако обработчик и его аргументы для esp_intr_alloc() должны быть NULL.

• Теоретически прерывания среднего приоритета также должны обрабатываться таким же образом. ESP-IDF пока это не поддерживает.

[Ссылки]

1. ESP32 High-Level Interrupts site:docs.espressif.com.
2. ESP32 ECO and Workarounds for Bugs site:espressif.com.
3. ESP32-C3: выделение прерывания.

 

Добавить комментарий


Защитный код
Обновить

Top of Page