| .. _samples_scheduler_metairq_dispatch: |
| |
| MetaIRQ Thread Priority Demonstration |
| ##################################### |
| |
| Overview |
| ******** |
| |
| This sample demonstrates the use of a thread running at a MetaIRQ |
| priority level to implement "bottom half" style processing |
| synchronously with the end of a hardware ISR. It implements a |
| simulated "device" that produces messages that need to be dispatched |
| to asynchronous queues feeding several worker threads, each running at |
| a different priority. The dispatch is handled by a MetaIRQ thread fed |
| via a queue from the device ISR (really just a timer interrupt). |
| |
| Each message has a random (and non-trivial) amount of processing that |
| must happen in the worker thread. This implements a "bursty load" |
| environment where occassional spikes in load require preemption of |
| running threads and delay scheduling of lower priority threads. |
| Messages are accompanied by a timestamp that allows per-message |
| latencies to be computed at several points: |
| |
| * The cycle time between message creation in the ISR and receipt by |
| the MetaIRQ thread for dispatch. |
| |
| * The time between ISR and receipt by the worker thread. |
| |
| * The real time spent processing the message in the worker thread, for |
| comparison with the required processing time. This provides a way |
| to measure preemption overhead where the thread is not scheduled. |
| |
| Aspects to note in the results: |
| |
| * On average, higher priority (lower numbered) threads have better |
| latencies and lower processing delays, as expected. |
| |
| * Cooperatively scheduled threads have significantly better processing |
| delay behavior than preemtible ones, as they can only be preempted |
| by the MetaIRQ thread. |
| |
| * Because of queueing and the bursty load, all worker threads of any |
| priority will experience some load-dependent delays, as the CPU |
| occasionally has more work to do than time available. |
| |
| * But, no matter the system load or thread configuration, the MetaIRQ |
| thread always runs immediately after the ISR. It shows reliable, |
| constant latency under all circumstances because it can preempt all |
| other threads, including cooperative ones that cannot normally be |
| preempted. |
| |
| Requirements |
| ************ |
| |
| This sample should run well on any Zephyr platform that provides |
| preemption of running threads by interrupts, a working timer driver, |
| and working log output. For precision reasons, it produces better |
| (and more) data on systems with a high timer tick rate (ideally 10+ |
| kHz). |
| |
| Note that because the test is fundamentally measuring thread |
| preemption behavior, it does not run without modification on |
| native_posix platforms. In that emulation environment, threads will |
| not be preempted except at specific instrumentation points (e.g. in |
| k_busy_wait()) where they will voluntarily release the CPU. |