Table of Contents
Multiple primitives as a single atomic operation
It is often necessary to invoke multiple operations involving a reschedule as a single atomic operation. ChibiOS/RT already implements APIs that perform complex operations, for example the API chSemSignalWait() performs two operations atomically.
Example 1
If more complex operations are required in your application then it is possible to build macro-operations, see the following example:
chSysLock(); chSemSignalI(&sem1); chSemSignalI(&sem2); chMtxUnlockS(); chSchRescheduleS(); chSysUnlock();
The above example performs a signal operation on two semaphores, unlocks the last acquired mutex and finally performs a reschedule, all the operations are performed atomically.
Example 2
An hypothetical chSemSignalSignalWait()
operation could be implemented as:
chSysLock(); chSemSignalI(&sem1); chSemSignalI(&sem2); chSemWaitS(&Sem3); /* May reschedule or not. */ chSchRescheduleS(); /* This one reschedules if necessary. */ chSysUnlock();
In general multiple I-Class and non-rescheduling S-Class APIs can be included and the block is terminated by a rescheduling S-Class API. An extra chSchRescheduleS()
can be present at the very end of the block, it only reschedules if a reschedule is still required.