С помощью godbolt.org проверил как влияет volatile в параметре
функции. При наличии volatile переданное через регистр значение
сохраняется в стек и дальше читается из стека, оптимизация
практически не работает. Без volatile все хорошо оптимизируется.
Причем в объявлении функции можно написать volatile, а в реализации
не писать, или наоборот, компилятор предупреждений не выдает. При дальнейшем изучении исходника обнаружилось, что переменная tcp_timer объявлена в этом же файле так
volatile uint32_t tcp_timer = 0;
Но я не нашел где бы она еще использовалась. Возможно ее так объявили на всякий случай, потом в параметр функции добавили volatile, на всякий случай, что бы сравнивались переменные одинакового типа.