ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1195651
klen (03.04.2022 13:18, просмотров: 682)
stm32h7xx: двойное срабатывание прерываний. убил день в поисках косяга. думаю не лишне всем напомнить еще раз если кто забыл. 

после втыкания головой в кирпичную кладку решил все таки поискать в инете эту проблему .. вот:

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 для регистров переферии. поэтому чтение заставит протолкнуть все говно по канализации до самого конца.


как то так. это все элементарно но вот налетел - надеюсь лишнее напоминание поможет сэкономить время