A CMSIS-RTOS implementation is typically provided as a library. To add the RTOS functionality to an existing CMSIS-based application, the RTOS library (and typically a configuration file) needs to be added. The available functionality of the RTOS library is defined in the header file cmsis_os.h that is specific for each CMSIS-RTOS implementation.
Once the files are added to a project, the user can start working with the CMSIS-RTOS functions. A code example is provided below:
This header file defines all objects when included in a C/C++ source file. When #define osObjectsExternal is present before the header file, the objects are defined as external symbols. A single consistent header file can therefore be used throughout the whole project.
#ifndef _CMSIS_OS_H
#define _CMSIS_OS_H
#define osCMSIS 0x10002
#define osCMSIS_KERNEL 0x10000
#define osKernelSystemId "KERNEL V1.00"
#define osFeature_MainThread 1
#define osFeature_Pool 1
#define osFeature_MailQ 1
#define osFeature_MessageQ 1
#define osFeature_Signals 8
#define osFeature_Semaphore 30
#define osFeature_Wait 1
#define osFeature_SysTick 1
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C"
{
#endif
typedef enum {
#define osWaitForever 0xFFFFFFFF
typedef enum {
typedef enum {
typedef void (*
os_pthread) (
void const *argument);
typedef void (*
os_ptimer) (
void const *argument);
typedef struct os_thread_def {
uint32_t instances;
uint32_t stacksize;
typedef struct os_timer_def {
typedef struct os_mutex_def {
uint32_t dummy;
typedef struct os_semaphore_def {
uint32_t dummy;
typedef struct os_pool_def {
uint32_t pool_sz;
uint32_t item_sz;
void *pool;
typedef struct os_messageQ_def {
uint32_t queue_sz;
uint32_t item_sz;
void *pool;
typedef struct os_mailQ_def {
uint32_t queue_sz;
uint32_t item_sz;
void *pool;
typedef struct {
union {
uint32_t v;
void *p;
int32_t signals;
} value;
union {
osMailQId mail_id;
osMessageQId message_id;
} def;
#if (defined (osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available
#define osKernelSysTickFrequency 100000000
#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * (osKernelSysTickFrequency)) / 1000000)
#endif // System Timer available
#if defined (osObjectsExternal) // object is external
#define osThreadDef(name, priority, instances, stacksz) \
extern const osThreadDef_t os_thread_def_##name
#else // define the object
#define osThreadDef(name, priority, instances, stacksz) \
const osThreadDef_t os_thread_def_##name = \
{ (name), (priority), (instances), (stacksz) }
#endif
#define osThread(name) \
&os_thread_def_##name
#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available
#endif // Generic Wait available
#if defined (osObjectsExternal) // object is external
#define osTimerDef(name, function) \
extern const osTimerDef_t os_timer_def_##name
#else // define the object
#define osTimerDef(name, function) \
const osTimerDef_t os_timer_def_##name = \
{ (function) }
#endif
#define osTimer(name) \
&os_timer_def_##name
int32_t
osSignalSet (osThreadId thread_id, int32_t signals);
#if defined (osObjectsExternal) // object is external
#define osMutexDef(name) \
extern const osMutexDef_t os_mutex_def_##name
#else // define the object
#define osMutexDef(name) \
const osMutexDef_t os_mutex_def_##name = { 0 }
#endif
#define osMutex(name) \
&os_mutex_def_##name
#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0)) // Semaphore available
#if defined (osObjectsExternal) // object is external
#define osSemaphoreDef(name) \
extern const osSemaphoreDef_t os_semaphore_def_##name
#else // define the object
#define osSemaphoreDef(name) \
const osSemaphoreDef_t os_semaphore_def_##name = { 0 }
#endif
#define osSemaphore(name) \
&os_semaphore_def_##name
#endif // Semaphore available
#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool Management available
#if defined (osObjectsExternal) // object is external
#define osPoolDef(name, no, type) \
extern const osPoolDef_t os_pool_def_##name
#else // define the object
#define osPoolDef(name, no, type) \
const osPoolDef_t os_pool_def_##name = \
{ (no), sizeof(type), NULL }
#endif
#define osPool(name) \
&os_pool_def_##name
#endif // Memory Pool Management available
#if (defined (osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queues available
#if defined (osObjectsExternal) // object is external
#define osMessageQDef(name, queue_sz, type) \
extern const osMessageQDef_t os_messageQ_def_##name
#else // define the object
#define osMessageQDef(name, queue_sz, type) \
const osMessageQDef_t os_messageQ_def_##name = \
{ (queue_sz), sizeof (type) }
#endif
#define osMessageQ(name) \
&os_messageQ_def_##name
#endif // Message Queues available
#if (defined (osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queues available
#if defined (osObjectsExternal) // object is external
#define osMailQDef(name, queue_sz, type) \
extern const osMailQDef_t os_mailQ_def_##name
#else // define the object
#define osMailQDef(name, queue_sz, type) \
const osMailQDef_t os_mailQ_def_##name = \
{ (queue_sz), sizeof (type) }
#endif
#define osMailQ(name) \
&os_mailQ_def_##name
void *
osMailAlloc (osMailQId queue_id, uint32_t millisec);
#endif // Mail Queues available
#ifdef __cplusplus
}
#endif
#endif // _CMSIS_OS_H