ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1207615 Топик полностью
framer (11.05.2022 21:13, просмотров: 189) ответил IBAH на У всех прошу прощения. Перебздел на рефакторинге. Все там нормально, потокобезопасно и подтверждено многолетними тестами. Хотя вот это мне не нравится (TxHead==TxTail) && (((USART1->ISR)&USART_ISR_TXE)!=0), какая то стрёмная проверка
Не видно механизмов синхронизации доступа к данным. Не похоже, что это потокобезопасный код. В функции PutFifo1 прерывание может прилететь в каждом месте где есть "==", "!=", "=". Т.е. Если например сравниваем TxHead==TxTail при условии что TxHead и тxTail volatile. To '==' означает сравнение. Но перед сравнением переменные надо загрузить в регистры и это не гарантирует, что во время сравнения данные не будут изменены в прерываниях. Очень тяжело поймать такую ошибку.