I’d make it dependent on which part drives the update.
Is the information polled by some other component or host application ?
Or do you want to set an update event form the modem task to an other component ?
If it’s the latter I’d use a queue with normal push / pop behavior of a reasonable depth. This would provide an event to trigger a task bundled with the data.
If the info is just polled from time to time I’d probably use a mutex or a critical section protected access to the public data set of the modem task.
I guess performance is not an issue here due to the rather slow (?) update rate.
If you do not access this data from multiple threads (I assume this because you said you have no problem with concurrency), then keeping it in file global variables should be okay.
Means you can accept maybe inconsistent values.
When the modem task is preempted while updating the (global volatile) variables by an other task reading them, the data might be inconsistent.
Just for completeness reasons.
The solution to that issue is to somehow guard the update/retrieval of the data. Global variables could be guarded with a mutex or a critical section.
All that the 1 element queue solution does is make all accesses to the data be via a block copy in or out of the queue which will be done in a critical section. It is likely more efficient to do the accesses yourself in user code with similar protections.