-
- В общем все проверил. Как только добавляю вместе с чисткой каждого флага чистку NVIC - пустые прерывания пропадают и работоспособность остального алгоритма не нарушается. Это полностью совпадает с логикой описаной по ссылке - 1111111(25.05.2013 18:12, ссылка)
- Остался непонят один момент. Второй флаг может выскакивать как одновременно с первым, так и уже после входа в прерывание. Соответственно будет или один pending на двоих или у каждого по одному. Получается надо обработать только один флаг и выйти, 1111111(130 знак., 24.05.2013 10:23)
- обрабатывать в прерывании все запросы, пока не закончатся koyodza(201 знак., 24.05.2013 13:46)
- Это гарантирует только обработку всех флагов, но при этом будут пустые прерывания (возвращаемся к исходной проблеме этого топика) - 1111111(24.05.2013 16:51)
- с пустыми прерываниями разбирайтесь, что-то у Вас делается неправильно. Чтобы разобраться вместо Вас, нужно больше чем две строчки от проекта - koyodza(24.05.2013 22:19)
- Разобрался и уже подробно написал ниже почему. Но как правильно (читай не залезая в NVIC) решить проблему - не знаю - 1111111(24.05.2013 22:34)
- читаем - koyodza(24.05.2013 22:47, ссылка)
- :) читаем->. В вашем решении (как и в моем первоначальном из-за которого сырбор) напрочь отсутствует тот факт, что между ядром и флагами есть еще один слой - NVIC. 1111111(226 знак., 24.05.2013 23:14, ссылка, ссылка)
- не надо туда лезть koyodza(130 знак., 24.05.2013 23:21)
- C вашим вариантом решения объяснить и не получится. Оно в логике идентично моему, и точно так же будет давать пустые прерывания - 1111111(24.05.2013 23:34)
- у меня нигде пустых прерываний не возникает - koyodza(24.05.2013 23:38)
- Если бы не поставил брекпоинт на пустой вход, то и у меня бы не возникало:) Тем более что по работе этого никак не заметить - 1111111(25.05.2013 00:20)
- Вы думаете я за 6 лет этого ни разу не делал? koyodza(30 знак., 25.05.2013 11:04)
- Если бы не поставил брекпоинт на пустой вход, то и у меня бы не возникало:) Тем более что по работе этого никак не заметить - 1111111(25.05.2013 00:20)
- у меня нигде пустых прерываний не возникает - koyodza(24.05.2013 23:38)
- C вашим вариантом решения объяснить и не получится. Оно в логике идентично моему, и точно так же будет давать пустые прерывания - 1111111(24.05.2013 23:34)
- не надо туда лезть koyodza(130 знак., 24.05.2013 23:21)
- :) читаем->. В вашем решении (как и в моем первоначальном из-за которого сырбор) напрочь отсутствует тот факт, что между ядром и флагами есть еще один слой - NVIC. 1111111(226 знак., 24.05.2013 23:14, ссылка, ссылка)
- читаем - koyodza(24.05.2013 22:47, ссылка)
- Разобрался и уже подробно написал ниже почему. Но как правильно (читай не залезая в NVIC) решить проблему - не знаю - 1111111(24.05.2013 22:34)
- с пустыми прерываниями разбирайтесь, что-то у Вас делается неправильно. Чтобы разобраться вместо Вас, нужно больше чем две строчки от проекта - koyodza(24.05.2013 22:19)
- Это гарантирует только обработку всех флагов, но при этом будут пустые прерывания (возвращаемся к исходной проблеме этого топика) - 1111111(24.05.2013 16:51)
- обрабатывать в прерывании все запросы, пока не закончатся koyodza(201 знак., 24.05.2013 13:46)
- На водка сработала. Эх, тяжелое наследие восьмибитников, сам себя перехитрил. В коде обработки так же присутствовала работа по внезапно появившимся флагам другого канала (противоположного вызвавшему прерывание), соответственно NVIC получал новый 1111111(166 знак., 24.05.2013 02:32)
- DBGMCU->CR |= DBGMCU_CR_DBG_TIM3_STOP; <-- Такое делал при инициализации??? Если нет, то делай, иначе в отладчике будешь видеть цены на банные веники :-) - il-2(22.05.2013 15:28)
- Обижаете, не первый раз замужем:) На отладчик уже грешил, но без него точно так же валят прерывания без флагов - 1111111(22.05.2013 15:35)
- Тогда если рассуждать логически, то надо искать где/из-за чего эти флаги сбрасываются ДО входа в обработчик. Если флаг установился а потом сбросился, то в контроллере NVIC запрос все равно остается взведенным и обработчик прерывания вызывается. А il-2(69 знак., 22.05.2013 15:49)
- Да вот в том и фигня - в фоне нет работы с таймером. Запустили и забыли. Искать негде:( - 1111111(22.05.2013 16:28)
- ну не знаю. У меня всё работает :=) - koyodza(22.05.2013 15:49)
- Как ни странно процесс в общем заработал без сбоев, захваты не теряются, сравнения не провтыкиваются. Но пустые прерывания все равно напрягают - 1111111(22.05.2013 16:12)
- ищите скользкие места в своём алгоритме - koyodza(22.05.2013 16:33)
- Да весь алгоритм - поймали фронт захватом, переключились в сравнение и нарезали 8 отсчетов, переключились обратно в захват. И так по кругу, все в прерывании, в фоне управления таймером нет. Двухканальный полупрограммный уарт только на прием. 1111111(114 знак., 22.05.2013 17:19)
- Могу дать еще на водку :-) il-2(598 знак., 23.05.2013 11:00)
- Толковое замечание. Но при смене режима конечно же флаги чищу и перед сменой DIER запрещаю, все по науке:) Внималельнее присмотрелся - возникают левые прерывания по времени около захвата, дальше идут где то близко к настоящим сравнениям и 1111111(409 знак., 23.05.2013 14:18 - 14:28)
- последний вариант имхо самый правильный - koyodza(23.05.2013 11:30)
- Могу дать еще на водку :-) il-2(598 знак., 23.05.2013 11:00)
- Да весь алгоритм - поймали фронт захватом, переключились в сравнение и нарезали 8 отсчетов, переключились обратно в захват. И так по кругу, все в прерывании, в фоне управления таймером нет. Двухканальный полупрограммный уарт только на прием. 1111111(114 знак., 22.05.2013 17:19)
- ищите скользкие места в своём алгоритме - koyodza(22.05.2013 16:33)
- Как ни странно процесс в общем заработал без сбоев, захваты не теряются, сравнения не провтыкиваются. Но пустые прерывания все равно напрягают - 1111111(22.05.2013 16:12)
- Тогда если рассуждать логически, то надо искать где/из-за чего эти флаги сбрасываются ДО входа в обработчик. Если флаг установился а потом сбросился, то в контроллере NVIC запрос все равно остается взведенным и обработчик прерывания вызывается. А il-2(69 знак., 22.05.2013 15:49)
- Обижаете, не первый раз замужем:) На отладчик уже грешил, но без него точно так же валят прерывания без флагов - 1111111(22.05.2013 15:35)
- покажите код. В обработчике прерывания TIM_ClearITPendingBit выполняете? - koyodza(22.05.2013 13:13)
- На картинке - состояние после входа в прерывание. 1111111(730 знак., 22.05.2013 13:31)
- Переместите сбрасывание флагов перед БЛАБЛАБЛА, или вставите некоторое число NOPов после сбрасывания флагов. - wek(22.05.2013 14:34)
- Сейчас сбрасываются до - изменения я привел ниже. По 6 нопов после каждого сброса не помогли - 1111111(22.05.2013 15:14)
- Ну .. Попробуйте читать флаги после сброса, или ждать пока они станут нулевыми. Сколько у вас AHB/APB делитель? wek(42 знак., 22.05.2013 23:53)
- Тактовая на таймер идет без деления - 24МГц. Насчет чтения флагов идею не понял. Когда они высталены, то сбрасываются как положено. 1111111(43 знак., 23.05.2013 02:16)
- Физический сброс флагов в тимере не происходит в то самое время когда процессор пишет, и если процессор успеет дойти до RЕТ перед чем это произойдет, он может попасть в тот же прорыв еще один раз. Смотрите здесь wek(218 знак., 23.05.2013 10:55)
- После сброса до ret кода хватает, задержка приличная - 1111111(23.05.2013 14:23)
- Физический сброс флагов в тимере не происходит в то самое время когда процессор пишет, и если процессор успеет дойти до RЕТ перед чем это произойдет, он может попасть в тот же прорыв еще один раз. Смотрите здесь wek(218 знак., 23.05.2013 10:55)
- Ян, твой русский в миллион раз лучше нашего чешского :)) - MBedder(23.05.2013 00:04)
- Тактовая на таймер идет без деления - 24МГц. Насчет чтения флагов идею не понял. Когда они высталены, то сбрасываются как положено. 1111111(43 знак., 23.05.2013 02:16)
- Ну .. Попробуйте читать флаги после сброса, или ждать пока они станут нулевыми. Сколько у вас AHB/APB делитель? wek(42 знак., 22.05.2013 23:53)
- Сейчас сбрасываются до - изменения я привел ниже. По 6 нопов после каждого сброса не помогли - 1111111(22.05.2013 15:14)
- попробуйте сбрасывать флаг даже если соответствующий бит DIER не установлен. Проверили флаг - если есть, то сразу сбросили, потом проверили бит в DIER, если установлен, то выполняете нужные действия - koyodza(22.05.2013 13:49)
- Поменял вот так, ничего не изменилось 1111111(516 знак., 22.05.2013 14:29)
- а SW_UART_TIMER -> SR = TIM_SR_CC3IF | TIM_SR_CC2IF; зачем? - koyodza(22.05.2013 14:59)
- Презерватив на свечку. Все лишние флаги на всякий пожарный сбросить - 1111111(22.05.2013 15:10)
- а SW_UART_TIMER -> SR = TIM_SR_CC3IF | TIM_SR_CC2IF; зачем? - koyodza(22.05.2013 14:59)
- Поменял вот так, ничего не изменилось 1111111(516 знак., 22.05.2013 14:29)
- Переместите сбрасывание флагов перед БЛАБЛАБЛА, или вставите некоторое число NOPов после сбрасывания флагов. - wek(22.05.2013 14:34)
- На картинке - состояние после входа в прерывание. 1111111(730 знак., 22.05.2013 13:31)