.. _cmsis_rtos_v2:

CMSIS RTOS v2
##########################

Cortex-M Software Interface Standard (CMSIS) RTOS is a vendor-independent
hardware abstraction layer for the ARM Cortex-M processor series and defines
generic tool interfaces. Though it was originally defined for ARM Cortex-M
microcontrollers alone, it could be easily extended to other microcontrollers
making it generic. For more information on CMSIS RTOS v2, please refer to the
`CMSIS-RTOS2 Documentation <http://www.keil.com/pack/doc/CMSIS/RTOS2/html/index.html>`_.

Features not supported in Zephyr implementation
***********************************************

Kernel
   ``osKernelGetState``, ``osKernelSuspend``, ``osKernelResume``, ``osKernelInitialize``
   and ``osKernelStart`` are not supported.

Mutex
   ``osMutexPrioInherit`` is supported by default and is not configurable,
   you cannot select/unselect this attribute.

   ``osMutexRecursive`` is also supported by default. If this attribute is
   not set, an error is thrown when the same thread tries to acquire
   it the second time.

   ``osMutexRobust`` is not supported in Zephyr.

Return values not supported in the Zephyr implementation
********************************************************

``osKernelUnlock``, ``osKernelLock``, ``osKernelRestoreLock``
   ``osError`` (Unspecified error) is not supported.

``osSemaphoreDelete``
   ``osErrorResource`` (the semaphore specified by parameter
   semaphore_id is in an invalid semaphore state) is not supported.

``osMutexDelete``
   ``osErrorResource`` (mutex specified by parameter mutex_id
   is in an invalid mutex state) is not supported.

``osTimerDelete``
   ``osErrorResource`` (the timer specified by parameter timer_id
   is in an invalid timer state) is not supported.

``osMessageQueueReset``
   ``osErrorResource`` (the message queue specified by
   parameter msgq_id is in an invalid message queue state)
   is not supported.

``osMessageQueueDelete``
   ``osErrorResource`` (the message queue specified by
   parameter msgq_id is in an invalid message queue state)
   is not supported.

``osMemoryPoolFree``
   ``osErrorResource`` (the memory pool specified by
   parameter mp_id is in an invalid memory pool state) is
   not supported.

``osMemoryPoolDelete``
   ``osErrorResource`` (the memory pool specified by
   parameter mp_id is in an invalid memory pool state) is
   not supported.

``osEventFlagsSet``, ``osEventFlagsClear``
   ``osFlagsErrorUnknown`` (Unspecified error)
   and osFlagsErrorResource (Event flags object specified by
   parameter ef_id is not ready to be used) are not supported.

``osEventFlagsDelete``
   ``osErrorParameter`` (the value of the parameter ef_id is
   incorrect) is not supported.

``osThreadFlagsSet``
   ``osFlagsErrorUnknown`` (Unspecified error) and
   ``osFlagsErrorResource`` (Thread specified by parameter
   thread_id is not active to receive flags) are not supported.

``osThreadFlagsClear``
   ``osFlagsErrorResource`` (Running thread is not active to
   receive flags) is not supported.

``osDelayUntil``
   ``osParameter`` (the time cannot be handled) is not supported.
