Например TDA7294

Форум РадиоКот :: Просмотр темы - Контекст вызова обработчика, зарегистрированного attachInter
Форум РадиоКот
https://radiokot.ru/forum/

Контекст вызова обработчика, зарегистрированного attachInter
https://radiokot.ru/forum/viewtopic.php?f=66&t=200081
Страница 1 из 2

Автор:  jcxz [ Вт дек 16, 2025 16:12:22 ]
Заголовок сообщения:  Контекст вызова обработчика, зарегистрированного attachInter

Прошу помощи знатоков внутренней кухни работы ардуино. Нужно понять как работает некоторый код, написанный под ардуино. Сам я не знаком с её внутренней кухней.

Как я понимаю: Пользовательский код в ардуино должен быть описан внутри loop(), которая платформой вызывается итеративно, в супер-цикле.
А пользовательский обработчик прерывания handleInterrupt(), регистрируемый вызовом attachInterrupt(..., handleInterrupt, ...) - он в каком контексте будет вызван?
В отдельном контексте аппаратного ISR (как обычное прерывание на микроконтроллере)?
Или он будет вызван в контексте супер-цикла, в котором итеративно выполняется loop()?

Погуглив, нашёл следующую инфу, что среда исполнения Ардуино реализована в виде си-шного:
Код:
int main(void)
{
  init();
  initVariant();
  #if defined(USBCON)
  USBDevice.attach();
  #endif
  setup();
  for (;;) {
    loop();
    if (serialEventRun) serialEventRun();
  }
  return 0;
}

Получается - serialEventRun() вызывается из контекста главного цикла.
handleInterrupt() зарегистрированная attachInterrupt() будет также вызвана (последовательно рядом с serialEventRun())?
Или она будет вызвана непосредственно из контекста аппаратного ISR?

Автор:  maxlab [ Вт дек 16, 2025 18:24:27 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Или она будет вызвана непосредственно из контекста аппаратного ISR?


attachInterrupt - это чисто железячное прерывание. Поэтому в некоторых туториалах рекомендуют минимум кода в присоединенном обработчике прерывания. Например взведение каких либо флагов и немедленный выход. А флаги уже обрабатываются в супер цикле loop()

Автор:  jcxz [ Вт дек 16, 2025 19:00:48 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

attachInterrupt - это чисто железячное прерывание. Поэтому в некоторых туториалах рекомендуют минимум кода в присоединенном обработчике прерывания. Например взведение каких либо флагов и немедленный выход. А флаги уже обрабатываются в супер цикле loop()
Это точно???

Почему сомнения: Тот код, в котором разбираюсь, внутри handleInterrupt() содержит кучу кода. В handleInterrupt() есть не только функции типа delayMicroseconds(...), но и даже записи/чтения массивов байт в SPI. Т.е. - блокирующий доступ к разделяемым ресурсам. В главном цикле (loop()) есть такой доступ к этим ресурсам и в handleInterrupt() - тоже.
Получается одно из двух:
1) или этот handleInterrupt() не может вызываться из ISR, а вызывается из контекста главного цикла;
2) или это говнокод. :(

Автор:  veso74 [ Вт дек 16, 2025 19:25:27 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Компиляторы и IDE не помешают вам писать плохой код. Но некоторые из них выдадут предупреждения. Даже если просто попытались тестировать.
Ответственность за происходящее несет автор кода, даже если код бесполезен.

ниже: МК PIC
Изображение

Автор:  linux_rulezz [ Вт дек 16, 2025 20:02:17 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

jcxz, если тебе так хочется на аврке древней писать, то зачем абдурина? Ну и пиши себе на сях. И не будет никаких вопросов к "внутренней кухне", т.к. вся она будет самодельной.
Но таки лучше 32-битные приличные ARM'ы или RISC-V взять, у которых шикарная периферия (хотя, все равно всегда не хватает каналов DMA, количества таймеров или еще чего). Главное - пиши сам код, а не генерируй калокубами всякими!

Автор:  jcxz [ Вт дек 16, 2025 20:09:48 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

jcxz, если тебе так хочется на аврке древней писать, то зачем абдурина? Ну и пиши себе на сях.
Для вас персональный совет: Учитесь читать тему, на которую отвечаете!
Ни на какой "аврке" я не пишу. Так же как не пишу на абдурине.
Вопрос был про попытку понять: Как работает некий готовый чужой код написанный на ардуино.

PS: Если вам нечего сказать по теме - прошу не засорять её бесполезным мусором!
Чукчи-нечитатели - проходите пожалуйста мимо!

Автор:  BOB51 [ Вт дек 16, 2025 20:15:40 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Обработчик serial уже встроен "внутри" по умолчанию.
А вот функция attachInterrupt() добавляется по желанию/необходимости.
Можно и чего то своего добавить, но с оглядкой на возможные проблемы при "наложении" ресурсов IDE, добавляемых по умолчанию и собственноручно написанных самоделок.
В принципе... Или пользуйтесь "чистым СИ" или принимайте правила/ограничения референса ардуино.
можно еще и тут посмотреть:
https://alexgyver.ru/lessons/
:roll:
Особое внимание к "чужим кодам" - чтоб что то "свое" встраивать за рамками предоставленных в IDE правил надо очень детально разбираться как в структуре самой IDE, так и в Си да в придачу и в С++.
Довольно неблагодарная задача с учетом отношения к ардуиноIDE у местных обитателей...
:(

Автор:  linux_rulezz [ Вт дек 16, 2025 20:19:37 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Цитата:
Ни на какой "аврке" я не пишу. Так же как не пишу на абдурине.
Вопрос был про попытку понять: Как работает некий готовый чужой код написанный на ардуино.

Абдурина === быдлокод. Если он еще и чужой, то единственный правильный вариант - выбросить его в мусорку! Да и самому в этой говно-среде писать ни в коем случае не стоит. Как и во всяких калокубах и им подобных говногенераторах.

Автор:  BOB51 [ Вт дек 16, 2025 20:21:19 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Не следует так заявлять - все зависит от автора и знания особенностей конкретного средства разработки.
8)

Автор:  linux_rulezz [ Вт дек 16, 2025 20:44:03 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

BOB51, не отрицаю, среди абдуринщиков может затесаться 0.01% грамотных. Но это - скорей исключение, чем правило. Обычно этой "средой" пользуются лишь совсем уж безграмотные. И почерпнуть из их кода что-либо полезное не получится.
Кстати, было как-то дело: перенесли эту гадость под STM32 и некоторые другие 32-битные МК. Доходило до абсурда: на МК есть аппаратный USB, а пользуются софтовым. Или, как они любят: МК не умеет делений даже, а в него флоаты пихают. Ну и самый цимус: I2C ногодрыгом. Или ШИМ. Или неиспользование DMA там, где он очень даже не помешал бы.

Автор:  BOB51 [ Вт дек 16, 2025 20:52:50 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

За АРМы ничего сказать не могу поскольку таковыми не пользуюсь.
Относительно АВР под ардуино - то более известная тематика, имеющая прикладное применение и относительно хорошо проработаны по различным источникам информации.
8)

Автор:  veso74 [ Вт дек 16, 2025 20:56:00 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

jcxz, предоставьте весь код. Потому что то, что вы показали, не является Arduino - там нет ни USBDevice, ни for (;;), ни пустой loop(); и setup(); Ето просто код на C/C++, скомпилированный компилятором Arduino (GCC).

Плата Arduino Due?

Автор:  jcxz [ Вт дек 16, 2025 21:03:37 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

jcxz, предоставьте весь код. Потому что то, что вы показали, не является Arduino
Опять нечитатель... :facepalm:
Я ничего не "предоставлял". Я спрашивал об общей структуре процесса выполнения кода. И привёл нагугленный вариант описания такой структуры. Схематичный вариант. Просто иллюстрирующий схему выполнения кода в ардуино.

Если хочется кода, то вот он: https://github.com/thotro/arduino-dw1000
Это код, о котором я писал. Но сильно сомневаюсь что кто-то захочет в нём разбираться...

Автор:  veso74 [ Вт дек 16, 2025 21:16:53 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Все написано в описание функции attachInterrupt() -> pin делает INTERRUPT, а функция привязывает его аппаратно к пользовательской функции:
https://github.com/arduino/reference-en ... pt-numbers
В Aruino UNO их два.

Пользовательская функция - отдельная функция. Не входит в loop. A rезультаты можно получить, напр. с помощью флагов.

Автор:  BOB51 [ Вт дек 16, 2025 21:57:52 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

jcxz, предоставьте весь код. Потому что то, что вы показали, не является Arduino
Опять нечитатель... :facepalm:
Я ничего не "предоставлял". Я спрашивал об общей структуре процесса выполнения кода. И привёл нагугленный вариант описания такой структуры. Схематичный вариант. Просто иллюстрирующий схему выполнения кода в ардуино.

Если хочется кода, то вот он: https://github.com/thotro/arduino-dw1000
Это код, о котором я писал. Но сильно сомневаюсь что кто-то захочет в нём разбираться...

УПС...
:shock:
А что это за платформа такая:
"Библиотека, предоставляющая базовые функции для использования чипов/модулей DW1000 от Decawave с Arduino"??
СпойлерDecawave
теперь является частью Qorvo
Узнайте больше о технологии сверхширокополосной связи, продуктах и многом другом
на сайте Qorvo:
Сверхширокополосный концентратор:
Технологии
Рынки и сферы применения
Продукты:
Решения UWB, совместимые с чипом Apple U1
Оценочные комплекты UWB
Модули UWB
Микросхемы UWB
Ресурсы:
Часто задаваемые вопросы
Инструкции по применению
Официальные документы
Видео
Партнеры UWB
Форум сообщества
Брошюра о сверхширокополосной связи
Пресс-релиз: Qorvo завершает сделку по приобретению Decawave

Это ведь специализированный модуль со своими специфическими библиотеками.
Его рассматривать то надо имея знания по соответствующим микросхемам/МК, там применяемым...
В среде ардуино достаточно много разнообразных МК с собственными особыми правилами (а бывает и с дополнительными компиляторами).
То уж точно не для начинающих разбор кодов устраивать.
8)
Если простенькое UNO(нано или про-мини) то структура программы к примеру по симулятору (и в рамках GCC):
СпойлерИзображение

8)

Автор:  jcxz [ Ср дек 17, 2025 02:09:04 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

А что это за платформа такая:
"Библиотека, предоставляющая базовые функции для использования чипов/модулей DW1000 от Decawave с Arduino"??
Это код для работы с DW1000. Для измерения расстояния между двумя приёмо-передатчиками с точностью не хуже 10 см (заявлена производителем) и дальностью до 200-300 м.

Это ведь специализированный модуль со своими специфическими библиотеками.
Его рассматривать то надо имея знания по соответствующим микросхемам/МК, там применяемым...
Это готовый проект кода для DW1000. На youtube есть ролики пользователей, которые использовали его и получали примерно заявленную точность. "Знание применяемых микросхем" - это юзер-мануал на более чем сотню регистров. Со сложным и запутанным программированием. Хочется взять этот проект и портировать его на свой МК. А не устраивать "закат солнца вручную" длительностью в несколько месяцев самостоятельных кувырканий с нуля. С негарантированным результатом.

Но после даже поверхностного анализа кода этого проекта, заметил, что функция обработчика прерываний handleInterrupt() в этом проекте обращается ко множеству разделяемых ресурсов (глобальные переменные, SPI-канал и т.п.) параллельно фоновому процессу в loop(). Без каких-либо видимых средств синхронизации/cериализации доступа. Что недопустимо в принципе. Или я не вижу этих средств синхронизации/cериализации. Тогда просьба - указать мне на них.
Т.е. - допустимо такое только если handleInterrupt() будет вызываться платформой ардуино из контекста фонового процесса loop(), а не из контекста аппаратного ISR. Отсюда и возник исходный вопрос.
Судя по роликам на youtube, код должен прекрасно работать.


PS: Ещё раз повторяю для нечитающих исходный вопрос: Я не спрашиваю как правильно делать! Не спрашиваю как работать с прерываниями и в многопоточной среде. И не просил меня поучать на эту тему. Я это сам прекрасно знаю и умею писать код для МК. Может даже получше вас, поучатели.
Мой вопрос только о том: Как в среде ардуино реализовано исполнение пользовательского обработчика handleInterrupt()? Всё! Не более. Не знаете - проходите мимо.

Добавлено after 9 minutes 48 seconds:
Если простенькое UNO(нано или про-мини) то структура программы к примеру по симулятору
Судя по коду того проекта, handleInterrupt() должен вызываться подобно serialEventRun() из вашего примера.
Иначе проект будет неработоспособным.

Автор:  OKF [ Ср дек 17, 2025 09:06:53 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Судя по коду того проекта, handleInterrupt() должен вызываться подобно serialEventRun() из вашего примера.
Иначе проект будет неработоспособным.

Нет. Это обработчик железного прерывания INTx, подключаемого по attachInterrupt.

Автор:  BOB51 [ Ср дек 17, 2025 09:31:57 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Такие библиотеки анализируют по другому.
Прикладные для спецкрсталлов могут быть написаны в рамках и по правилам стандартного GCC да плюс подключение файлов на ассемблере внутри. Не надо путать с теми функциями, что "референсом" предоставляются.
8)
И раскапывать там ничего смысла нет - или используем "как есть" или своё по даташитам пишем (ежли достаточно знаний и навыков).
:wink:

Автор:  u37 [ Ср дек 17, 2025 10:09:53 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Для всезнайки - ISR всегда выполняется средствами ISR (обработка прерывания) вне зависимости где и как лежит код. Для любого процессора. Иное невозможно.
Выполнение кода может прерываться другими прерываниями, если контроллер прерываний это позволяет. Но выполнение кода ISR не может быть перенесено в фоновый процесс (USER). В некоторых процессорах это вообще два типа пространства - системное и user.
Ваша тема не имеет смысла. Хватит флудить.

Автор:  BOB51 [ Ср дек 17, 2025 10:43:19 ]
Заголовок сообщения:  Re: Контекст вызова обработчика, зарегистрированного attachI

Ну уж так и не может обслуживание прерывания идти фоновым.
К примеру основная программа и псевдо параллельный обработчик на прерываниях по таймеру (клавиатура, динамическая индикация)... Переключение на другую часть программы с последующим возвратом в основную (обработчик аппаратного прерывания выполняет только подстановку в стек адреса возврата и reti).
:roll:
Это только адрес вектора точки запуска обработчика прерывания жестко аппаратно определен. А что там дальше будет выполняться и где сам обработчик прерывания будет размещён - на усмотрение автора программы...
8)

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/