Не видно механизмов синхронизации доступа к данным. Не похоже, что
это потокобезопасный код. В функции PutFifo1 прерывание может
прилететь в каждом месте где есть "==", "!=", "=". Т.е. Если
например сравниваем TxHead==TxTail при условии что TxHead и тxTail
volatile. To '==' означает сравнение. Но перед сравнением
переменные надо загрузить в регистры и это не гарантирует, что во
время сравнения данные не будут изменены в прерываниях. Очень
тяжело поймать такую ошибку.