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.

More articles and guides are available on the technical wiki.

learn more

Need Tutorials?

Try the video tutorials and guides on Play Embedded.

learn more

Need Support?

The forums is the best place, registration required.

learn more