после втыкания головой в кирпичную кладку решил все таки поискать в инете эту проблему .. вот:
1. косяг проявляет себя как срабатывание два раза подряд приерывания
2. косяг проявляет себя когда код обработчика очень короткий
3. косяг проявляет себя в виде чередования правильного и двойного вызова обработчика при незначительных правках кода обработчика
в моем случае я измерил осциллографом - если код обработчика выполняется не более 100ns возникает эта проблема
физика проблемы в том что имеем cortex-m7 c цепочкой шин и шинными матрицами. запись в периферийный регистр сброса бита флага прерывания происходить по цепочке cpu->axi->ahp->apb->peripheral register
как нам всем известно в связи "умощнением и ускорением" шины и кросбары имеют буфера записи и чтения. в результате с этими особенностями возможна ситуация когда обработчик выполнился и вышел а бит сброса не записан!
решается эта беда двумя способами
1. в конец кода обработчика сунуть инструкцию барьера синхронизации данных dsb
для экономии тактов синхронизации сброс флага рекомендую делать перед целевым кодом обработчика, в этом случае если крайние записис были например в axi домен то этот код покроет задержки в цепочки шин при записи бита переферии.
2. предыдущий способ не всегда гарантирует правильный результат (сложные случаи MPU,cache и исполнене обработчика из ОЗУ). в таких случаях возможно прийдется добавить инструкцию isb
3. предыдущие способы не всегда срабатывают но они самые быстрые для экономии тактов обработки прерывания. если Вам похер нахер на такиты то есть железобетонный способ рекомендуймы разработчиками процессора - сделать после записи фиктивное чтение флага. эта операция основано на том что политика шин и кросбаров содержит требование strong-non-reordered accsess для регистров переферии. поэтому чтение заставит протолкнуть все говно по канализации до самого конца.
как то так. это все элементарно но вот налетел - надеюсь лишнее напоминание поможет сэкономить время
-
- Напомнило историю про то, как истребитель выстрелил из пушки,
обогнал снаряд и подбил самого себя. - SciFi(03.04.2022 13:40)
- Или, ракета вернулась на базу за апдейтом ПО. - Visitor(03.04.2022 13:51)
- Напомнило историю про то, как истребитель выстрелил из пушки,
обогнал снаряд и подбил самого себя. - SciFi(03.04.2022 13:40)