Using pointer of a function's returned value
There is not much to improve on the following line.


  Uart_put_char(Rb_retrieve_byte(&amp;serial_tx_buff));


Since the return of a function is on stack or optimized into the registers. This is not an object you can take a pointer of.

Obviously you can remove the function calls, but that would be micro-optimization.
It counteracts the split into separate C modules.

If you change the producer to work with a returning pointer, then you must also change the consumer to work with pointers. Or have an intermediate.
But in the end, nothing changes.

Since Rb_retrieve_byte reads char to stack, which the compiler can optimize to return via a register.
And Uart_put_char reads an argument from stack, which the compiler can optimize to pass via a register.

So, enable the register passing calling convention optimization, and quit micro-optimizing.

Or if you are in need of super fast UART, make a custom driver without function calls.