In the first iteration of the UART driver, a task polled the UART peripheral registers to determine when a new byte had been received. The constant polling is what caused the task to consume > 95% of CPU cycles. The most meaningful work done by this task-based driver was transferring bytes of data out of the UART peripheral and into the queue.
In this iteration of the driver, instead of using a task to continuously poll the UART registers, we'll set up the UART2 peripheral and NVIC to provide an interrupt when a new byte is received.