-
- Вариант "застрелица" ещё не предлагали? - Kpoк(30.08.2020 23:41)
- Уже было, RM почитать ... )) - Aleksey_75(30.08.2020 23:51)
- Разобраться, почему говнокубовый код виснет - не вариант? - LightElf(30.08.2020 23:24)
- Выйти из прерывания и снова зайти.Все должно выполняться штатно.Говнометод по хитрозапуску до добра не доведут. - PlainUser(30.08.2020 21:01)
- Задаваемый вопрос имеет мало общего с решаемой задачей - lloyd(28.08.2020 17:34)
- Это издержки превращения в отдельную тему ветки, взятой из другой темы. - Kceния(28.08.2020 17:49)
- Не надо смешивать общие случаи с частными (CubeMX). - fk0(28.08.2020 11:09)
- К сожалению, это свойство почти любой местной дискуссии - уходить в обсуждение частностей. Тогда как тема обсуждения была задана мной в самом общем виде, как дилемма, когда события проявляются в виде передачи управления обработчику прерывания, откуда ответные действия обычно жестко ограничены временем. Тогда как упоминание AVR и CubeMX было приведено мной исключительно для иллюстрации проблемы, а не в качестве приглашения обсирать то и другое. - Kceния(28.08.2020 13:58)
- "Скажем, SPI на AVR можно легко перезапустить прямо из прерывания"
- потому что камень примитивен, как стакан. Чтобы "перезапустить"
транзакцию по DMA вам как минимум нужно: evgeniy1294(736 знак., 27.08.2020 20:32)
- Следующее задание адресовано уже другому датчику - CS (chip select)
надо успеть между заданиями поменять. Тогда как при циклическом
режиме работы DMA он успевает передать байт раньше, чем я сменю CS,
и тогда первый байт достается прошлому датчику. - Kceния(27.08.2020 20:47)
- хм! есть у меня подобная задача, вопросов не возникало Aleksey_75(366 знак., 27.08.2020 21:09)
- Ещё проще, для этого есть конечные автоматы. Проще потому, что их
можно написать абстрактно, без явной зависимости от железа. С
другой стороны, вам нужно только 3-4 регистра перезаписать, это и в
прерывании можно сделать (NDTR, M0AR, CR и GPIO->BSRR) - evgeniy1294(27.08.2020 20:56)
- Оно в принципе у меня и сейчас нормально работает, но сделано через
ухо: в прерывании я запускаю таймер (он уже приготовлен на 1 тик и
только ждет запуска), а уже этот таймер в своем прерывании
перезапускает SPI на другой CS. Тогда как в своем SPI-ишном
прерывании перезапустится не могу. Что происходит, не знаю, но LED
перестает моргать, а потом Watch dog срабатывает. Kceния(1 знак., 27.08.2020 21:12, картинка)
- Это нужно код смотреть - evgeniy1294(27.08.2020 21:25)
- Оно в принципе у меня и сейчас нормально работает, но сделано через
ухо: в прерывании я запускаю таймер (он уже приготовлен на 1 тик и
только ждет запуска), а уже этот таймер в своем прерывании
перезапускает SPI на другой CS. Тогда как в своем SPI-ишном
прерывании перезапустится не могу. Что происходит, не знаю, но LED
перестает моргать, а потом Watch dog срабатывает. Kceния(1 знак., 27.08.2020 21:12, картинка)
- Следующее задание адресовано уже другому датчику - CS (chip select)
надо успеть между заданиями поменять. Тогда как при циклическом
режиме работы DMA он успевает передать байт раньше, чем я сменю CS,
и тогда первый байт достается прошлому датчику. - Kceния(27.08.2020 20:47)
- чтот похоже в консерватории не так! У мну планировщик именно из
прерывания вызывает задачи. Кстати что значит "зависание"??
hardfault ?? - Aleksey_75(27.08.2020 20:25)
- У куба есть всякие HAL_Lock/Unlock. Как минимум, это и будет
причиной, структура-обработчик залочена, функция перезапуска
неисполняется. - evgeniy1294(27.08.2020 20:34)
- как хорошо что не пользую HAL/LL .... последнее время даже от SPL
где возможно избавляюсь, напрямую с битами регистров гораздо
приятнее - Aleksey_75(27.08.2020 20:41)
- Ксения наверное думает, что HAL упрощает ей жизнь, позволяя
абстрагироваться от железа. На самом деле суммарный объём доков по
HAL где-то пара тысяч страниц и её придется читать. - evgeniy1294(27.08.2020 20:47)
- Ни разу не читал доки на HAL. Один раз взглянул и закрыл. Непонятно зачем это нужно. Хватает исходников и поиска в Total Commander-е - Vit(28.08.2020 00:04)
- Пока что HAL учит меня, как делать те или иные вещи. Доки по нему я
не читаю - смотрю в исходники. Может быть, когда я стану умнее
HAL'а :), я от него откажусь, но это время еще не пришло. - Kceния(27.08.2020 21:18)
- мож проще RM открыть и глянуть в регистры ?? Разницы с AVR нет
совсем, за исключением больших возможностей! - Aleksey_75(27.08.2020 21:29)
- А существует ли среди этих "больших возможностей" возможность
искусственно вызвать прерывание (симулировать его). Но те так,
чтобы вызвать его обработчик, как подпрограмму, а чтобы оно само
сработало? Типа флаг прерывания искусственно установить? Мне все
равно, какого прерывания, лишь бы свой обработчик можно было на
него поставить. - Kceния(27.08.2020 21:45)
- немного изначально не понял ! Пишем функцию с нужным кодом! Когда из прерывания ЕСЛИ флаг такойто - дергаем нашу функцию, когда из кода дергаем напрямую! - Aleksey_75(27.08.2020 22:20)
- Описание векторов прерываний есть в заголовочниках типа
stm32f407xx.h evgeniy1294(2246 знак., 27.08.2020 22:02)
- Ура! NVIC->STIR как раз то, что нужно. - Kceния(27.08.2020 22:55)
- Только когда вы в прерывание зайдете, при проверке флагов, активных
не будет обнаружено, что будем делать ??? Aleksey_75(11 знак., 27.08.2020 22:58, ссылка)
- Что значит "активных"? Разве если я в NVIC->STIR запишу номер
нужного мне прерывания, оно не исполнится? Еще какое-то условие
нужно? - Kceния(27.08.2020 23:02)
- прерывание выполнится! но флагов там как конь на... и по каждому
флагу нужно свое действие! В примеру прерывание по USART , дальше
будем разбирать флаги LBD, RX, TX и еще с пяток ... Как вы
задействуете свою функцию если флагов нету ?? С тем же успехом
можно напрямую вызвать ..._IRQHander(); - Aleksey_75(27.08.2020 23:08)
- Я собираюсь эмулировать прерывание от таймера, а там вроде бы
нечего с таймером не надо делать. - Kceния(27.08.2020 23:21)
- сфигали ?? смотрим TIMx_SR и удивляемяся!! По какому флагу будем
отрабатывать ??? - Aleksey_75(27.08.2020 23:29)
- Хочу, чтобы досрочно сработал TIM6_DAC_IRQHandler() Kceния(172 знак., 27.08.2020 23:42)
- это прерывание не с таймера с ЦАПа - Aleksey_75(27.08.2020 23:45)
- Это их общее прерывание, ЦАП у меня не используется, а TIM6 генерит
прерывания каждые 60 ms. Иногда требуется, чтобы он выдал
прерывание досрочно. - Kceния(28.08.2020 00:07)
- ))) у таймера 6 и 7 действительно есть один флаг OVF! если брать
другие таймеры там очень много флагов и по переполнению и по
сравнению, и все флаги необходимо обрабатывать в прерывании!
поэтому я изначально сказал что делаем функцию или её вызваем из
прерывания или напрямую.. - Aleksey_75(28.08.2020 00:15)
- Проблема сама снимается тем, что в конце кода TIM6_DAC_IRQHandler()
я вызывают стандартный обработчик HAL'а - HAL_TIM_IRQHandler(
&htim6); а сама с флагами не вожусь. И так оно во всех
прерываниях - имею право отправлять на обработку в стандартный
хандлер. Фактически я делаю перехват, т.к. по умолчанию
TIM6_DAC_IRQHandler() объявлен так: Kceния(66 знак., 28.08.2020 00:29)
- А что, стандартный обработчик HALа не проверяет флаги? ))) Что это
меняет по существу вопроса? Отсутствие взведенных флагов приведет к
фиктивному исполнению обработчика - вошел и тут же вышел. И почему
не выделить интересующий функционал обработчика в отдельную функцию
и вызывать ее как в теле обработчика, так и в любом необходимом
месте? - my504(28.08.2020 05:51)
- Cтандартный обработчик HALа делает всё, что положено делать с
данной периферией, что снимает необходимость делать это
самостоятельно. Тогда как собственный обработчик прерывания нужен
только затем, чтобы можно было вписать свои дополнительные команды
до или после вызова стандартного обработчика. - Kceния(28.08.2020 08:34)
- Кроме проверки и сброса флага "стандартного" в обработчике ничего нет и быть не может. То есть "стандартный" - это ПУСТОЙ обработчик. Но пустой обработчик никому не нужен, значит прямо за его телом должен следовать Ваш код. Вы бы открыли тело "стандартного" и посмотрели что в нем... my504(492 знак., 28.08.2020 09:43)
- я везде так и делаю. Причем вставляю свои ф-ии в одном случае ДО, в
других случаях - ПОСЛЕ - Лaгyнoв(28.08.2020 09:40)
- Повторяю вопрос. Как отделить разные флаги одного вектора при
ПОСЛЕДОВАТЕЛЬНОМ размещении "стандартного" и пользовательского
кода? На самом деле, этот самый "стандартный" обработчик - это
ПРОСТО СБРОС ФЛАГА. И ставить его рекомендуют в конце ISR. Таким
образом, этот "стандартный" никак не исключает проверку флага
силами пользователя... - my504(28.08.2020 10:47)
- чаще всего я свой обработчик ставлю после кубовского. Т.е. он
реально мне нужен только для сброса флага. Но один раз пришлось
ставить ДО чтобы знать - прерывание от UART было по приему или
передаче. - Лaгyнoв(28.08.2020 12:19)
- И как кубовский обработчик помогает в определении источника
прерываний по общему вектору? У меня ощущение, что вся эта история
со "стандартным" обработчиком - это мазохизм в извращенной форме. - my504(28.08.2020 12:45)
- Так он же там не один, а для каждого типа периферии свой. Например: Kceния(874 знак., 28.08.2020 13:34)
- Ксения, речь идет об ОДНОМ векторе. Например, TIM6_DAC. Обработчик одного вектора может быть ТОЛЬКО ОДИН. То есть прерывания по НЕСКОЛЬКИМ флагам (иногда одной, а иногда и разной периферии) вызывают переход ПО ОДНОМУ АДРЕСУ. Пользователь должен сортировать флаги САМ. То есть написать цепочку условий проверки ОТДЕЛЬНЫХ флагов с ОТДЕЛЬНЫМИ обработчиками по каждому из них. Вот и объясните мне каким образом "стандартный" обработчик по факту являющийся лишь сбросом флага (а может my504(63 знак., 28.08.2020 13:56)
- ))) и на какой флаг реагирует HAL_UART_IRQHandler(&huart1); ??? - Aleksey_75(28.08.2020 13:38)
- я не имел в виду, что кубовский обработчик помогает. Я имел в виду,
что мой обработчик (который и определяет источник) пришлось ставить
впереди кубовского, потому что он сбрасывает запрос. Я вроде уже
тут говорил, но повторюсь. Для меня лично вся эта затея с проектом
от Куба нужна исключительно как "рыба". Ввиду моей неграмотности в
Кейле вообще и в Си в частности мне было проще вписывать свои
строки во что-то готовое. Только и всего. :-) - Лaгyнoв(28.08.2020 13:20)
- Доступ к регистрам осуществляется через указатель на структуру. То есть достаточно узнать из референс-мануала регистр флагов прерываний по данной периферии и обычным if проверить бит с искомым флагом. Так же прочесть в референс-мануале как сбросить этот флаг (не всегда это запись нуля в этот бит). Иначе можно огрести разные чудесатости... - my504(28.08.2020 14:07)
- +1!! флаги разбирать все равно ручками, да и сбрасывать тоже, ибо не все флаги стираются записью 0, по многоим нужны танцы с бубнами!!! - Aleksey_75(28.08.2020 13:07)
- Так он же там не один, а для каждого типа периферии свой. Например: Kceния(874 знак., 28.08.2020 13:34)
- И как кубовский обработчик помогает в определении источника
прерываний по общему вектору? У меня ощущение, что вся эта история
со "стандартным" обработчиком - это мазохизм в извращенной форме. - my504(28.08.2020 12:45)
- чаще всего я свой обработчик ставлю после кубовского. Т.е. он
реально мне нужен только для сброса флага. Но один раз пришлось
ставить ДО чтобы знать - прерывание от UART было по приему или
передаче. - Лaгyнoв(28.08.2020 12:19)
- Повторяю вопрос. Как отделить разные флаги одного вектора при
ПОСЛЕДОВАТЕЛЬНОМ размещении "стандартного" и пользовательского
кода? На самом деле, этот самый "стандартный" обработчик - это
ПРОСТО СБРОС ФЛАГА. И ставить его рекомендуют в конце ISR. Таким
образом, этот "стандартный" никак не исключает проверку флага
силами пользователя... - my504(28.08.2020 10:47)
- Cтандартный обработчик HALа делает всё, что положено делать с
данной периферией, что снимает необходимость делать это
самостоятельно. Тогда как собственный обработчик прерывания нужен
только затем, чтобы можно было вписать свои дополнительные команды
до или после вызова стандартного обработчика. - Kceния(28.08.2020 08:34)
- ну вам виднее! самое главное потом горюшка не хапнуть ))) - Aleksey_75(28.08.2020 00:32)
- А что, стандартный обработчик HALа не проверяет флаги? ))) Что это
меняет по существу вопроса? Отсутствие взведенных флагов приведет к
фиктивному исполнению обработчика - вошел и тут же вышел. И почему
не выделить интересующий функционал обработчика в отдельную функцию
и вызывать ее как в теле обработчика, так и в любом необходимом
месте? - my504(28.08.2020 05:51)
- Проблема сама снимается тем, что в конце кода TIM6_DAC_IRQHandler()
я вызывают стандартный обработчик HAL'а - HAL_TIM_IRQHandler(
&htim6); а сама с флагами не вожусь. И так оно во всех
прерываниях - имею право отправлять на обработку в стандартный
хандлер. Фактически я делаю перехват, т.к. по умолчанию
TIM6_DAC_IRQHandler() объявлен так: Kceния(66 знак., 28.08.2020 00:29)
- ))) у таймера 6 и 7 действительно есть один флаг OVF! если брать
другие таймеры там очень много флагов и по переполнению и по
сравнению, и все флаги необходимо обрабатывать в прерывании!
поэтому я изначально сказал что делаем функцию или её вызваем из
прерывания или напрямую.. - Aleksey_75(28.08.2020 00:15)
- Это их общее прерывание, ЦАП у меня не используется, а TIM6 генерит
прерывания каждые 60 ms. Иногда требуется, чтобы он выдал
прерывание досрочно. - Kceния(28.08.2020 00:07)
- это прерывание не с таймера с ЦАПа - Aleksey_75(27.08.2020 23:45)
- Хочу, чтобы досрочно сработал TIM6_DAC_IRQHandler() Kceния(172 знак., 27.08.2020 23:42)
- сфигали ?? смотрим TIMx_SR и удивляемяся!! По какому флагу будем
отрабатывать ??? - Aleksey_75(27.08.2020 23:29)
- Я собираюсь эмулировать прерывание от таймера, а там вроде бы
нечего с таймером не надо делать. - Kceния(27.08.2020 23:21)
- прерывание выполнится! но флагов там как конь на... и по каждому
флагу нужно свое действие! В примеру прерывание по USART , дальше
будем разбирать флаги LBD, RX, TX и еще с пяток ... Как вы
задействуете свою функцию если флагов нету ?? С тем же успехом
можно напрямую вызвать ..._IRQHander(); - Aleksey_75(27.08.2020 23:08)
- Что значит "активных"? Разве если я в NVIC->STIR запишу номер
нужного мне прерывания, оно не исполнится? Еще какое-то условие
нужно? - Kceния(27.08.2020 23:02)
- Только когда вы в прерывание зайдете, при проверке флагов, активных
не будет обнаружено, что будем делать ??? Aleksey_75(11 знак., 27.08.2020 22:58, ссылка)
- Ура! NVIC->STIR как раз то, что нужно. - Kceния(27.08.2020 22:55)
- да - SciFi(27.08.2020 21:48)
- +1 гамно вопрос !!! XXX_IRQhandler(); откуда хочь! - Aleksey_75(27.08.2020 22:16)
- А существует ли среди этих "больших возможностей" возможность
искусственно вызвать прерывание (симулировать его). Но те так,
чтобы вызвать его обработчик, как подпрограмму, а чтобы оно само
сработало? Типа флаг прерывания искусственно установить? Мне все
равно, какого прерывания, лишь бы свой обработчик можно было на
него поставить. - Kceния(27.08.2020 21:45)
- мож проще RM открыть и глянуть в регистры ?? Разницы с AVR нет
совсем, за исключением больших возможностей! - Aleksey_75(27.08.2020 21:29)
- Ксения наверное думает, что HAL упрощает ей жизнь, позволяя
абстрагироваться от железа. На самом деле суммарный объём доков по
HAL где-то пара тысяч страниц и её придется читать. - evgeniy1294(27.08.2020 20:47)
- как хорошо что не пользую HAL/LL .... последнее время даже от SPL
где возможно избавляюсь, напрямую с битами регистров гораздо
приятнее - Aleksey_75(27.08.2020 20:41)
- У куба есть всякие HAL_Lock/Unlock. Как минимум, это и будет
причиной, структура-обработчик залочена, функция перезапуска
неисполняется. - evgeniy1294(27.08.2020 20:34)
- Вариант "застрелица" ещё не предлагали? - Kpoк(30.08.2020 23:41)