So, if you find that you have over-run your timing, what do you want to do? THAT is a question only you can answer.
If your system can’t meet the requirements as designed, what do you do? Again, that is a question only you can answer.
Part of your problem is that the simplest mechanisms don’t get the feedback you want, but that doesn’t mean you can’t get it, you just need to use the mechanisms that do. If you start with the assumption you are using the wrong methods to get what you want, you have broken your design from the start.
The simplest way to detect that you are “behind” with direct to task notifications, is to use a shared variable. The sender checks the variable, and if it is set, we are in overrun, and needs to decide what to do about it.
It then sets the variable and notifies the task. When the task is done, it resets the variable to let the sender know.
As long as the variable is a type that can be set and cleared atomically, that system is fully robust.
An alternate method using just the FreeRTOS notification primatives is to use the Notify and Querry to sent, to see that you have overrun, and when you receive, you DON’T clear the value immediately, but wait to clear after you process. This would allow “restricted” tasks to share the information through the API.
Your system setup seems to say you want minimal sensor aquistion tasks that on the schedule immediately grab the data, and then pass that on to non-critical tasks for processing. That meets the minimal jitter.
All your talk about “overrun” is by definition very application specific on how to handle, so the providing of the methods I described above, is the best that FreeRTOS can provide.
Perhaps part of the issue is we often think of an operating system as something we work “under” and it needs to provide the resource to use, but FreeRTOS isn’t that sort of system, it is a library providing some resources to allow the program to do things, but the program is ultimately in control in how it uses the “tool” of FreeRTOS, and FreeRTOS doesn’t need to provide for everything the program needs, it can add capabilities to the system.
You ended up with an XY problem when you started with a defined method of signalling, and then tried to find out how to get information out of that method that isn’t there. You need to start with your real requirements, and try to figure out how to implement them.