What if, for some reason, the task emptying the queue stops sending items? Will the queue eat all RAM? AFAIK, in freeRTOS you can limit the size of a queue, but not in Zephyr (you need here a message queue instead).
For such simple application I will use a circular buffer. R and W pointers to it do not need to be protected in any way, as are not shared between tasks. The actual data need to be protected, though, but ensuring atomic access to it (if the architecture supports it) or disabling/enabling IRQ around the access is enough. No heap consumption, also (except if you insinst on malloc-ing the buffer). No need for mutex, semaphore, etc., although you may prefer to use a mutex to grant access to the data, in case disabling/enabling IRQ seems too dirty to you.
Incidentally, Zephyr uses a circular buffer on its implementation of message queues.