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.
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.
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.