Например TDA7294

Форум РадиоКот • Просмотр темы - Контекст вызова обработчика, зарегистрированного attachInter
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт янв 20, 2026 10:16:06

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 34 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Ср дек 17, 2025 10:55:57 
Мучитель микросхем
Аватар пользователя

Карма: 4
Рейтинг сообщений: 44
Зарегистрирован: Вт апр 23, 2013 22:21:18
Сообщений: 444
Откуда: KUBAN, Krasnodar
Рейтинг сообщения: 0
2) или это говнокод. :(


С моей точки зрения - говнокод...Однозначно :) Хотя это может быть работоспособно и решает задачу которую ставил перед собой автор этой поделки.
Вопрос в другом... Действительно, концепт Ардуино значительно снижает порог вхождения и допускает, в некоторых случаях, нарушение правил написания программ для МК.
В том числе и правил обработки хардварных прерываний. Просто автор той поделки, возможно, не сталкивался с проблемами конкуренции за аппаратные ресурсы контроллера в многопоточной(мультизадачной) среде.
Так что, не заморачивайтесь на этом :)

PS. Вообще то есть 10 золотых правил NASA по написания управляющих программ . Если их соблюдать, становится не важным - это платформа Ардуино или нотепад++ с отдельным тулчейном.

_________________
Девице - Device


Последний раз редактировалось maxlab Ср дек 17, 2025 11:07:27, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Ср дек 17, 2025 10:58:17 
Электрический кот

Карма: 5
Рейтинг сообщений: 173
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1087
Рейтинг сообщения: 0
-


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Ср дек 17, 2025 20:27:11 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 191
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1672
Рейтинг сообщения: 0
ISR всегда выполняется средствами ISR (обработка прерывания) вне зависимости где и как лежит код. Для любого процессора. Иное невозможно..
Как выполняется ISR я знаю и без вас. Вопрос был о том: Как выполняется обработчик, зарегистрированный при помощи attachInterrupt(). (сколько уже можно повторять - читайте исходный пост!)

Ваша тема не имеет смысла. Хватит флудить.
Вот именно: не знаете ответа на поставленный вопрос - не флудьте!

Добавлено after 2 minutes 42 seconds:
С моей точки зрения - говнокод...Однозначно :)
Похоже что так и есть :(

Просто автор той поделки, возможно, не сталкивался с проблемами конкуренции за аппаратные ресурсы контроллера в многопоточной(мультизадачной) среде.
Так что, не заморачивайтесь на этом :)
Я уже не заморочался - перенёс выполнение handleInterrupt() в контекст главного цикла. Вроде работает. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Ср дек 17, 2025 20:48:03 
Электрический кот

Карма: 5
Рейтинг сообщений: 173
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1087
Рейтинг сообщения: 4
Вопрос был о том: Как выполняется обработчик, зарегистрированный при помощи attachInterrupt(). (сколько уже можно повторять - читайте исходный пост!)

Данивопрос.
ИИ:
Реализация функции attachInterrupt() зависит от архитектуры микроконтроллера (AVR для Uno/Nano, SAM для Due, ESP32 и т.д.), так как она напрямую работает с регистрами процессора.
Ниже приведены примеры исходного кода для двух самых популярных платформ.
1. Архитектура AVR (Arduino Uno, Nano, Mega)
В классических платах код находится в файле WInterrupts.c. Здесь функция сопоставляет номер прерывания с пользовательской функцией и настраивает регистры управления прерываниями (EICRA, EIMSK).
Код:
// Упрощенный фрагмент из WInterrupts.c для AVR
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
  if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
    // Сохраняем указатель на функцию пользователя в массив колбэков
    intFunc[interruptNum] = userFunc;
   
    // Настройка режима (Low, Change, Falling, Rising) через регистры процессора
    switch (interruptNum) {
      case 0:
        EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
        EIMSK |= (1 << INT0); // Разрешаем внешнее прерывание 0
        break;
      case 1:
        EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
        EIMSK |= (1 << INT1); // Разрешаем внешнее прерывание 1
        break;
      // ... и так далее для других прерываний
    }
  }
}

2. Архитектура SAM (Arduino Due)
На более мощных платах код сложнее, так как прерывания могут быть на любом пине. Файл также называется WInterrupts.c.
Код:
// Фрагмент из WInterrupts.c для Arduino Due (SAM)
void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode) {
  // Инициализация контроллера прерываний, если еще не сделана
  static int enabled = 0;
  if (!enabled) { __initialize(); enabled = 1; }

  // Получаем информацию о порте и маске пина
  Pio *pio = g_APinDescription[pin].pPort;
  uint32_t mask = g_APinDescription[pin].ulPin;
  uint32_t pos = 0;
 
  // Определяем позицию пина для сохранения колбэка
  for (uint32_t t = mask; t > 1; t >>= 1, pos++);
 
  // Сохраняем функцию в массив для соответствующего порта (PIOA, PIOB и т.д.)
  if (pio == PIOA) callbacksPioA[pos] = callback;
  if (pio == PIOB) callbacksPioB[pos] = callback;

  // Настройка аппаратного режима (FALLING, RISING и т.д.)
  if (mode == CHANGE) {
    pio->PIO_AIMDR = mask; // Отключаем доп. режимы для детекции обоих фронтов
  } else {
    pio->PIO_AIMER = mask; // Включаем расширенный режим
    // Выбор конкретного типа: LOW, HIGH, FALLING или RISING
    // через регистры PIO_LSR, PIO_ESR и др.
  }

  // Включаем прерывание на данном пине
  pio->PIO_IER = mask;
}

/ИИ
Т.е. аппаратно ставится вектор и добавляется ссылка на обработчик.
----------
ИИ
2. "Мегаобработчики" (ISR макросы)
В AVR прерывания обрабатываются макросом ISR(). Для каждого внешнего прерывания (INT0, INT1 и т.д.) прописан такой блок. Он и является мостом между «железом» и вашим кодом:
Код:
// Обработчик для прерывания №0 (обычно пин 2 на Uno)
ISR(INT0_vect) {
  if(intFunc[0]) {      // Проверяем, назначил ли пользователь функцию
    intFunc[0]();       // ВЫЗОВ ВАШЕЙ ФУНКЦИИ
  }
}

// Обработчик для прерывания №1 (обычно пин 3 на Uno)
ISR(INT1_vect) {
  if(intFunc[1]) {
    intFunc[1]();       // ВЫЗОВ ВАШЕЙ ФУНКЦИИ
  }
}

Как это работает пошагово:
Событие: Вы нажали кнопку на пине 2.
Железо: Процессор AVR видит сигнал, приостанавливает loop() и смотрит в таблицу векторов.
Вектор: Таблица говорит: "При событии на INT0 прыгай на адрес функции ISR(INT0_vect)".
Мегаобработчик: Выполняется код внутри ISR(INT0_vect). Он заглядывает в массив intFunc под индексом 0.
Вызов: Если там лежит адрес вашей функции (который вы передали через attachInterrupt), процессор переходит к её выполнению.
Возврат: После завершения вашей функции и выхода из ISR, процессор возвращается в loop() ровно в то место, где прервался.
Почему это сделано именно так?
Почему нельзя сразу записать вашу функцию в таблицу векторов?
Таблица векторов неизменна: Она прошивается в память программ (Flash) и не может меняться "на лету" во время работы программы.
Гибкость: Благодаря массиву указателей в оперативной памяти (RAM), вы можете в любой момент работы программы вызвать detachInterrupt() или переназначить attachInterrupt() на другую функцию.
Примечание: Если вы напишете ISR(INT0_vect) в своем скетче вручную, Arduino IDE выдаст ошибку "multiple definition", так как этот "мегаобработчик" уже определен внутри стандартной библиотеки.
/ИИ


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 13:48:01 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 191
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1672
Рейтинг сообщения: 0
Данивопрос.
ИИ:
Реализация функции attachInterrupt() зависит от архитектуры микроконтроллера
И к чему этот поток сознания??...
ЧатГПТ я умею пользоваться. И задавал соответствующий вопрос ему ещё ДО создания этой темы.
И так же хорошо знаю, что его ответы часто очень далеки от правды. И сильно зависят от формулировки вопроса. Переформулировав вопрос немного по-другому, можно получить совершенно противоположный ответ.
Если вы черпаете свои познания от ИИ, то извините что разочаровал вас в компетенции вашего "гуру".... :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 13:54:25 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1500
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15385
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
... Я уже не заморочался - перенёс выполнение handleInterrupt() в контекст главного цикла. Вроде работает. :)

может было бы достаточно то handleInterrupt() обьявить extern в файлах той библиотеки?
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 14:41:48 
Электрический кот

Карма: 5
Рейтинг сообщений: 173
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1087
Рейтинг сообщения: 0
В-принципе не может читать С-ный код.
Бесполезно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 15:03:50 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 191
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1672
Рейтинг сообщения: 0
может было бы достаточно то handleInterrupt() обьявить extern в файлах той библиотеки?
8)
И как это поможет от коллизий обращения к одним и тем же ресурсам из handleInterrupt() и из loop()?
Ресурсам: глобальным переменным, SPI-каналу, ...?

Добавлено after 55 seconds:
В-принципе не может читать С-ный код.
Бесполезно.
О каком именно "C-коде" речь? И кто именно "не может"?


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 16:26:39 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1327
Рейтинг сообщения: 0
Так а что мешает посмотреть сорцы, всё ж открыто? Откуда там взяться луп-контексту, если этого в упор нет? Непонятно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 21:48:08 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1500
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15385
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Можно все варианты доступа выполнять. Только планировка размещения модулей и доступа к их ресурсам будет достаточно заморочной.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Чт дек 18, 2025 22:27:20 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 191
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1672
Рейтинг сообщения: 0
Так а что мешает посмотреть сорцы, всё ж открыто?
Конечно. Желаете - смотрите. Ссылку я привёл.
Добавлено after 37 seconds:
Так а что мешает посмотреть сорцы, всё ж открыто? Откуда там взяться луп-контексту, если этого в упор нет? Непонятно.
loop() же в каком-то контексте исполняется. Вот это и есть её контекст.


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Пт дек 19, 2025 18:02:19 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1327
Рейтинг сообщения: 0
Желаете - смотрите. Ссылку я привёл.

Это мне что ли нужно?)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Пт дек 19, 2025 19:18:54 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 191
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1672
Рейтинг сообщения: 0
Желаете - смотрите. Ссылку я привёл.

Это мне что ли нужно?)
Я уже несколько раз написал про вероятные коллизии в том коде:
И как это поможет от коллизий обращения к одним и тем же ресурсам из handleInterrupt() и из loop()?
Ресурсам: глобальным переменным, SPI-каналу, ...?
Т.е. - очевидно, что я это не из пальца высосал, а написал на основе изучения исходников.
Но вы мне снова советуете их изучить. Зачем??? Вы не верите, в то что я пишу? Так убедитесь сами - исходники я привёл.
Вы же надеюсь - знаете си++ достаточно, чтобы самостоятельно проверить мои выводы?

PS: Да - и код этот я всё-же запустил. Впендюрил handleInterrupt() в контекст loop() и в таком виде код работает. Теперь loop() и handleInterrupt() вызываются из одного контекста.


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Контекст вызова обработчика, зарегистрированного attachI
СообщениеДобавлено: Пт дек 19, 2025 20:35:22 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1327
Рейтинг сообщения: 0
Ну, так это же вы сами там химичите/впендюриваете, а это не то что есть на самом деле, то о чём вы спрашиваете. А так да, костыли могут быть разные. В т.ч. и через жопу. И временами это будет работать.
PS. Как известно, задачу можно решать разными путями. В данном случае, как с прерываниями, так и без. И тут уже разработчик решает исходя из своих критериев.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 34 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y