]> begriffs open source - cmsis/blob - CMSIS/DoxyGen/RTOS2/src/cmsis_os2.txt
RTX5: enhanced events (Generic Wait and Thread Flags)
[cmsis] / CMSIS / DoxyGen / RTOS2 / src / cmsis_os2.txt
1 /**
2 \page genRTOS2IF Generic RTOS Interface
3
4 CMSIS-RTOS2 is a generic API that is agnostic of the underlying RTOS kernel. Application programmers call CMSIS-RTOS2 API
5 functions in the user code to ensure maximum portability from one RTOS to another. Middleware using CMSIS-RTOS2 API takes
6 advantages of this approach by avoiding unnecessary porting efforts.
7
8 \image html "API_Structure.png" "CMSIS-RTOS API Structure"
9
10 A typical CMSIS-RTOS2 API implementation interfaces to an existing real-time kernel. The CMSIS-RTOS2 API provides the
11 following attributes and functionalities:
12  - Function names, identifiers, and parameters are descriptive and easy to understand. The functions are powerful and
13    flexible which reduces the number of functions exposed to the user. 
14  - \ref CMSIS_RTOS_ThreadMgmt allows you to define, create, and control threads.
15  - Interrupt Service Routines (ISR) can \ref CMSIS_RTOS_ISR_Calls "call some CMSIS-RTOS functions". When a CMSIS-RTOS
16    function cannot be called from an ISR context, it rejects the invocation and returns an error code.
17  - Three different event types support communication between multiple threads and/or ISR:
18    - \ref CMSIS_RTOS_ThreadFlagsMgmt "Thread Flags": may be used to indicate specific conditions to a thread.
19    - \ref CMSIS_RTOS_EventFlags "Event Flags": may be used to indicate events to a thread or ISR.
20    - \ref CMSIS_RTOS_Message "Messages": can be sent to a thread or an ISR. Messages are buffered in a queue.
21  - \ref CMSIS_RTOS_MutexMgmt and \ref CMSIS_RTOS_SemaphoreMgmt are incorporated.
22  - CPU time can be scheduled with the following functionalities:
23    - A \a timeout parameter is incorporated in many CMSIS-RTOS functions to avoid system lockup. When a timeout is specified,
24      the system waits until a resource is available or an event occurs. While waiting, other threads are scheduled.
25    - The \ref osDelay and \ref osDelayUntil functions put a thread into the \b WAITING state for a specified period of time.
26    - The \ref osThreadYield provides co-operative thread switching and passes execution to another thread of the same
27      priority.
28  - \ref CMSIS_RTOS_TimerMgmt  functions are used to trigger the execution of functions.
29
30 The CMSIS-RTOS2 API is designed to optionally incorporate multi-processor systems and/or access protection via the Cortex-M
31 Memory Protection Unit (MPU).
32
33 In some RTOS implementations threads may execute on different processors, thus \b message queues may reside in shared memory
34 resources.
35
36 The CMSIS-RTOS2 API encourages the software industry to evolve existing RTOS implementations. RTOS implementations can be
37 different and optimized in various aspects towards the Cortex-M processors. Optional features may be for example
38  - Support of the Cortex-M Memory Protection Unit (MPU).
39  - Support of multi-processor systems.
40  - Support of a DMA controller.
41  - Deterministic context switching.
42  - Round-robin context switching.
43  - Deadlock avoidance, for example with priority inversion.
44  - Zero interrupt latency by using Armv7-M instructions LDREX and STREX.
45
46 \section cmsis_os2_h cmsis_os2.h header file
47
48 The file \b %cmsis_os2.h is a standard header file that interfaces to every CMSIS-RTOS2 compliant real-time operating
49 systems (RTOS). Each implementation is provided the same \b cmsis_os2.h which defines the interface to the \ref rtos_api2.
50
51 Using the \b cmsis_os2.h along with dynamic object allocation allows to create source code or libraries that require no
52 modifications when using on a different CMSIS-RTOS2 implementation.
53
54 \section usingOS2 Using a CMSIS-RTOS2 Implementation
55
56 A CMSIS-RTOS2 component may be provided as library or source code (the picture below shows a library). 
57 A CMSIS-based application is extended with RTOS functionality by adding a CMSIS-RTOS2 component (and typically some configuration files).
58 The \ref cmsis_os2_h gives access to RTOS API functions and is the only interface header required when dynamic object allocation is used.
59 This enables portable application that works with every RTOS kernel event without re-compilation of the source code when the kernel is 
60 changed.
61
62 Static object allocation requires access to RTOS object control block definitions. An implementation specific header file (<i>rtos</i>.h in 
63 the picture below) provides access to such definitions. The section For RTX v5 these definitions are provided in the header file %rtx_os.h that contains this definitions for RTX v5.
64
65
66 \image html "CMSIS_RTOS_Files.png" "CMSIS-RTOS File Structure"
67
68 Once the files are added to a project, the user can start working with the CMSIS-RTOS functions.  A code example is provided
69 below:
70  
71 <b>Code Example</b>
72 \code
73 /*----------------------------------------------------------------------------
74  * CMSIS-RTOS 'main' function template
75  *---------------------------------------------------------------------------*/
76  
77 #include "RTE_Components.h"
78 #include  CMSIS_device_header
79 #include "cmsis_os2.h"
80  
81 /*----------------------------------------------------------------------------
82  * Application main thread
83  *---------------------------------------------------------------------------*/
84 void app_main (void *argument) {
85  
86   // ...
87   for (;;) {}
88 }
89  
90 int main (void) {
91  
92   // System Initialization
93   SystemCoreClockUpdate();
94   // ...
95  
96   osKernelInitialize();                 // Initialize CMSIS-RTOS
97   osThreadNew(app_main, NULL, NULL);    // Create application main thread
98   osKernelStart();                      // Start thread execution
99   for (;;) {}
100 }
101 \endcode
102
103
104 */
105
106
107 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
108 /**
109 \page rtx5_impl RTX v5 Implementation
110
111 Keil RTX version 5 (RTX5) implements the CMSIS-RTOS2 as a native RTOS interface for Arm Cortex-M processor-based devices.
112 A translation layer to CMSIS-RTOS API v1 is provided. Therefore, RTX5 can be used in applications that where previously based
113 on RTX version 4 and CMSIS-RTOS version 1 with minimal effort.
114
115 The following sections provide further details:
116  - \subpage cre_rtx_proj explains how to setup an RTX v5 project in Keil MDK.
117  - \subpage theory_of_operation provides general information about the operation of CMSIS-RTOS RTX v5.
118  - \subpage config_rtx5 describes configuration parameters of CMSIS-RTOS RTX v5.
119  - \subpage creating_RTX5_LIB explains how to build your own CMSIS-RTOS RTX v5 library.
120  - \subpage technicalData5 lists hardware, software, and resource requirements, supplied files, and supported tool chains.
121  - \subpage misraCompliance5 describes the violations to the MISRA standard.
122 */
123
124 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
125 /**
126 \page cre_rtx_proj Create an RTX5 Project
127
128 The steps to create a microcontroller application using RTX5 are:
129 - Create a new project and select a microcontroller device.
130 - In the Manage Run-Time Environment window, select <b>CMSIS\::CORE</b> and <b>CMSIS\::RTOS2 (API)\::Keil RTX5</b>. You can
131   choose to either add RTX as a library (Variant: \b Library) or to add the full source code (Variant: \b Source - required
132   if using the <a href="http://www.keil.com/pack/doc/compiler/EventRecorder/html/index.html" target="_blank"><b>Event Recorder</b></a>):
133
134    \image html manage_rte_output.png
135
136 - If the <b>Validation Output</b> requires other components to be present, try to use the \b Resolve button.
137 - Click \b OK. In the \b Project window, you will see the files that have been automatically added to you project, such as
138   \b %RTX_Config.h, \b %RTX_Config.c, the library or the source code files, as well as the system and startup files:
139
140    \image html project_window.png
141
142 - If using the Variant: \b Source as statet above, you have to assure to use at least C99 compiler mode (Project Options -> C/C++ -> C99 Mode).   
143 - You can add template files to the project by right-clicking on <b>Source Group 1</b> and selecting
144   <b>Add New Item to 'Source Group 1'</b>. In the new window, click on <b>User Code Template</b>. On the right-hand side
145   you will see all available template files for CMSIS-RTOS RTX:
146   
147    \image html add_item.png
148
149 - \ref config_rtx5 "Configure" RTX5 to the application's needs using the \b %RTX_Config.h file.
150
151 \section cre_rtx_cortexa Additional requirements for RTX on Cortex-A
152
153 Cortex-A based microcontrollers are less unified with respect to the interrupt and timer implementations used compared to 
154 M-class devices. Thus RTX requires additional components when an A-class device is used, namely
155 <a href="../../Core_A/html/group__irq__ctrl__gr.html"><b>IRQ Controller (API)</b></a> and \ref CMSIS_RTOS_TickAPI "OS Tick (API)"
156 implementations. 
157
158 \image html manage_rte_cortex-a.png
159
160 The default implementations provided along with CMSIS are 
161 - Arm <a href="../../Core_A/html/group__GIC__functions.html">Generic Interrupt Controller (GIC)</a>
162 - Arm Cortex-A5, Cortex-A9 <a href="../../Core_A/html/group__PTM__timer__functions.html">Private Timer (PTIM)</a>
163 - Arm Cortex-A7 <a href="../../Core_A/html/group__PL1__timer__functions.html">Generic Physical Timer (GTIM)</a>
164
165 For devices not implementing GIC, PTIM nor GTIM please refer to the according device family pack and select the
166 proper implementations.
167
168 \section cre_UsingIRQs Using Interrupts on Cortex-M
169
170 On Cortex-M processors, the RTX5 kernel uses the following interrupt exceptions.  The table below also lists the 
171 priorities that must be assigned to these interrupts.
172
173 Handler | Priority | Interrupt/Exception
174 :-------|:---------|:----------------------------
175 SysTick | lowest   | Kernel system timer interrupt to generate periodic timer ticks
176 PendSV  | lowest   | PendSV (request for system-level service) when calling certain RTX functions from \b Handler mode
177 SCV     | lowest+1 | Supervisor Call used to enter the RTOS kernel from \b Thread mode
178
179 Other device interrupts can be used without limitation. For Arm Cortex-M3/M4/M7/M23/M33/M35P processors, interrupts are never disabled by RTX Kernel.
180
181 <b>Usage of interrupt priority grouping</b>
182 - The interrupt priority grouping should be configured using the CMSIS-Core function NVIC_SetPriorityGrouping before calling the function 
183   \ref osKernelStart(). The RTX kernel uses the priority group value to setup the priority for SysTick and PendSV interrupts.
184 - The RTX kernel sets the priority for the interrupts/exceptions listed in above table and uses the lowest two priority levels.
185 - Do not change the priority used by the RTX kernel. If this cannot be avoided, ensure that the preempt priority of
186   SysTick/PendSV is lower than SVC.
187 - Permitted priority group values are 0 to 6. The priority group value 7 will cause RTX to fail as there is only one priority level available.
188 - The <b>main stack</b> is used to run the RTX functionality. It is therefore required to configure sufficient stack for the RTX kernel execution.
189
190 <b>Code Example</b>
191 \code
192 osKernelInitialize();                            // initialize RTX
193 NVIC_SetPriorityGrouping (3);                    // setup priority grouping
194 tread_id = osThreadNew(tread_func, NULL, NULL);  // create some threads
195 osKernelStart ();                                // start RTX kernel
196 \endcode
197
198 \section cre_rtx_proj_specifics Add support for RTX specific functions
199 If you require some of the \ref rtx5_specific "RTX specific functions" in your application code, \#include the
200 \ref rtx_os_h "header file rtx_os.h". This enables \ref lowPower "low-power" and \ref TickLess "tick-less" operation modes.
201
202 \section cre_rtx_proj_er Add Event Recorder Visibility
203
204 RTX5 interfaces to the <a href="http://www.keil.com/pack/doc/compiler/EventRecorder/html/index.html" target="_blank"><b>Event Recorder</b></a> 
205 to provide event information which helps you to understand and analyze the operation.
206
207 - To use the Event Recorder together with RTX5, select the software component <b>Compiler:Event Recorder</b>.
208 - Select the \b Source variant of the software component <b>CMSIS:RTOS2 (API):Keil RTX5</b>.
209   \image html event_recorder_rte.png "Component selection for Event Recorder"
210 - Enable the related settings under \ref evtrecConfig.
211 - Build the application code and download it to the debug hardware.
212   
213 Once the target application generates event information, it can be viewed in the µVision debugger using the \b Event
214  \b Recorder.
215 */
216
217
218 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
219 /**
220 \page theory_of_operation Theory of Operation
221
222 Many aspects of the kernel are configurable and the configuration options are mentioned where applicable.
223
224 \section SystemStartup System Startup
225
226 Since main is no longer a thread RTX5 does not interfere with the system startup until main is reached.
227 Once the execution reaches \c main() there is a recommended order to initialize the hardware and start the kernel. This is
228 also reflected in the user code template file "CMSIS-RTOS2 'main' function" supplied with the RTX5 component.
229
230 Your application's \c main() should implement at least the following in the given order:
231 -# Initialization and configuration of hardware including peripherals, memory, pins, clocks and the interrupt system.
232 -# Update the system core clock using the respective
233    <a href=../../Core/html/group__system__init__gr.html>CMSIS-Core (Cortex-M)</a> or 
234    <a href=../../Core_A/html/group__system__init__gr.html>CMSIS-Core (Cortex-A)</a> function.
235 -# Initialize the CMSIS-RTOS kernel using \ref osKernelInitialize.
236 -# Optionally, create a new thread \c app_main, which is used as a main thread using \ref osThreadNew. Alternatively, threads
237    can be created in \c main() directly.
238 -# Start the RTOS scheduler using \ref osKernelStart which also configure system tick timer and RTOS specific interrupts.
239    This function does not return in case of successful execution. Any application code after \b osKernelStart will therefore not be executed.
240
241 \note Interrupts are initialized in \ref osKernelStart. Modifying basic In case priorities and
242 groupings in the NVIC are altered by the application after the above sequence it might be necessary to call
243 \ref osKernelInitialize again. Incorrect ossibly catched by \ref osRtxErrorNotify or causing a hard fault.
244
245 \note The tick timer is configured during \ref osKernelStart. 
246 \section Scheduler 
247
248 RTX5 implements a low-latency preemptive scheduler. Major parts of RTX5 are executed in handler mode such as
249   - \ref SysTick_Handler used for time-based scheduling.
250   - \ref SVC_Handler used for lock-based scheduling.
251   - \ref PendSV_Handler used for interrupt-based scheduling.
252
253 In order to be low-latency with respect to ISR execution those system exceptions are configured to use the
254 lowest priority groups available. The priorities are configured such that no preemption happens between them. Thus
255 no interrupt critical sections (i.e. interrupt locks) are needed to protect the scheduler.
256
257 \image html scheduling.png "Thread scheduling and interrupt execution"
258
259 The scheduler combines priority and round-robin based context switches. The example depicted in the image above contains
260 four threads (1, 2, 3, and 4). Threads 1 and 2 share the same priority, thread 3 has a higher one and thread 4 the highest
261 (\ref osThreadAttr_t::priority). As long as threads 3 and 4 are blocked the scheduler switches between thread 1 and 2 on
262 a time-slice basis (round-robin). The time-slice for round-robin scheduling can be configured, see Round-Robin Timeout in \ref systemConfig.
263
264 Thread 2 unblocks thread 3 by an arbitrary RTOS-call (executed in SVC handler mode) at time index 2. The scheduler switches to
265 thread 3 immediately because thread 3 has the highest priority. Thread 4 is still blocked.
266
267 At time index 4 an interrupt (ISR) occurs and preempts the SysTick_Handler. RTX does not add any latency to the interrupt
268 service execution. The ISR routine uses an RTOS-call that unblocks thread 4. Instead of switching to thread 4 immediately
269 the PendSV flag is set to defer the context switching. The PendSV_Handler is executed right after the SysTick_Handler returns
270 and the deferred context switch to thread 4 is carried out. As soon as highest priority thread 4 blocks again by using
271 a blocking RTOS-call execution is switched back to thread 3 immediately during time index 5.
272
273 At time index 5 thread 3 uses a blocking RTOS-call as well. Thus the scheduler switches back to thread 2 for time index 6.
274 At time index 7 the scheduler uses the round-robin mechanism to switch to thread 1 and so on.
275
276 \section MemoryAllocation Memory Allocation 
277
278 RTX5 objects (thread, mutex, semaphore, timer, message queue, thread and event flags, as well as memory pool) require
279 dedicated RAM memory. Objects can be created using os<i>Object</i>New() calls and deleted using os<i>Object</i>Delete()
280 calls. The related object memory needs to be available during the lifetime of the object.
281
282 RTX5 offers three different memory allocation methods for objects:
283   - \ref GlobalMemoryPool uses a single global memory pool for all objects. It is easy to configure, but may have 
284     the disadvantage for memory fragmentation when objects with different sizes are created and destroyed.
285   - \ref ObjectMemoryPool uses a fixed-size memory pool for each object type. The method is time deterministic
286      and avoids memory fragmentation.
287   - \ref StaticObjectMemory reserves memory during compile time and completely avoids that a system can be out of memory.
288     This is typically a required for some safety critical systems.
289
290 It possible to intermix all the memory allocation methods in the same application.
291
292 \subsection GlobalMemoryPool Global Memory Pool
293
294 The global memory pool allocates all objects from a memory area. This method of memory allocation is the default
295 configuration setting of RTX5.
296
297 \image html MemAllocGlob.png "Global Memory Pool for all objects"
298
299 When the memory pool does not provide sufficient memory, the creation of the object fails and the related
300 os<i>Object</i>New() function returns \token{NULL}.
301
302 Enabled in \ref systemConfig.
303
304 \subsection ObjectMemoryPool Object-specific Memory Pools
305
306 Object-specific memory pools avoids memory fragmentation with a dedicated fixed-size memory management for each object type.
307 This type of memory pools are fully time deterministic, which means that object creation and destruction takes always the
308 same fixed amount of time. As a fixed-size memory pool is specific to an object type, the handling of out-of-memory
309 situations is simplified.
310
311 \image html MemAllocSpec.png "One memory pool per object type"
312
313 Object-specific memory pools are selectively enabled for each object type, e.g: mutex or thread using the RTX configuration
314 file:
315  - Enabled in \ref threadConfig for thread objects.
316  - Enabled in \ref timerConfig for timer objects.
317  - Enabled in \ref eventFlagsConfig for event objects.
318  - Enabled in \ref mutexConfig for mutex objects.
319  - Enabled in \ref semaphoreConfig for semaphore.
320  - Enabled in \ref memPoolConfig for memory pools.
321  - Enabled in \ref msgQueueConfig for message objects.
322
323 When the memory pool does not provide sufficient memory, the creation of the object fails and the related
324 os<i>Object</i>New() function returns \token{NULL}.
325
326 \subsection StaticObjectMemory Static Object Memory
327 In contrast to the dynamic memory allocations, the static memory allocation requires compile-time allocation of object memory. 
328
329 \image html MemAllocStat.png "Statically allocated memory for all objects"
330
331 Static memory allocation can be achieved by providing user-defined memory using attributes at object creation,
332 see \ref CMSIS_RTOS_MemoryMgmt_Manual. Please take special note of the following restrictions:
333
334 Memory type                                  | Requirements
335 ---------------------------------------------|-------------------------------------------------------------------------------
336 Control Block (osXxxAttr_t::cb_mem)          | 4-Byte alignment. Size defined by \ref osRtxThreadCbSize, \ref osRtxTimerCbSize, \ref osRtxEventFlagsCbSize, \ref osRtxMutexCbSize, \ref osRtxSemaphoreCbSize, \ref osRtxMemoryPoolCbSize, \ref osRtxMessageQueueCbSize.
337 Thread Stack (osThreadAttr_t::stack_mem)     | 8-Byte alignment. Size is application specific, i.e. amount of stack variables and frames.
338 Memory Pool (osMemoryPoolAttr_t::mp_mem)     | 4-Byte alignment. Size calculated with \ref osRtxMemoryPoolMemSize.
339 Message Queue (osMessageQueueAttr_t::mq_mem) | 4-Byte alignment. Size calculated with \ref osRtxMessageQueueMemSize.
340
341
342 In order to allow RTX5 aware debugging, i.e. Component Viewer, to recognize control blocks these
343 needs to be placed in individual memory sections, i.e. using `__attribute__((section(...)))`.
344
345 RTX Object    | Linker Section 
346 --------------|------------------------
347 Thread        | `.bss.os.thread.cb`
348 Timer         | `.bss.os.timer.cb`
349 Event Flags   | `.bss.os.evflags.cb`
350 Mutex         | `.bss.os.mutex.cb`
351 Semaphore     | `.bss.os.semaphore.cb`
352 Memory Pool   | `.bss.os.mempool.cb`
353 Message Queue | `.bss.os.msgqueue.cb`
354
355 The following code example shows how to create an OS object using static memory.
356
357 <b> Code Example:</b> 
358 \code{.c}
359 /*----------------------------------------------------------------------------
360  * CMSIS-RTOS 'main' function template
361  *---------------------------------------------------------------------------*/
362
363 #include "RTE_Components.h"
364 #include  CMSIS_device_header
365 #include "cmsis_os2.h"
366  
367 //include rtx_os.h for types of RTX objects
368 #include "rtx_os.h"
369  
370 //The thread function instanced in this example
371 void worker(void *arg)
372 {
373   while(1) 
374   {
375     //work
376     osDelay(10000);
377   }  
378 }
379  
380 // Define objects that are statically allocated for worker thread 1
381 __attribute__((section(".bss.os.thread.cb")))
382 osRtxThread_t worker_thread_tcb_1;
383  
384 // Reserve two areas for the stacks of worker thread 1
385 // uint64_t makes sure the memory alignment is 8
386 uint64_t worker_thread_stk_1[64];
387  
388 // Define the attributes which are used for thread creation
389 // Optional const saves RAM memory and includes the values in periodic ROM tests 
390 const osThreadAttr_t worker_attr_1 = {
391   "wrk1",
392   osThreadJoinable,
393   &worker_thread_tcb_1,
394   sizeof(worker_thread_tcb_1),
395   &worker_thread_stk_1[0],
396   sizeof(worker_thread_stk_1),
397   osPriorityAboveNormal,
398   0
399 };
400  
401 // Define ID object for thread
402 osThreadId_t th1;
403  
404 /*----------------------------------------------------------------------------
405  * Application main thread
406  *---------------------------------------------------------------------------*/
407 void app_main (void *argument) {
408   uint32_t param = NULL;
409  
410   // Create an instance of the worker thread with static resources (TCB and stack)
411   th1 = osThreadNew(worker, &param, &worker_attr_1);
412  
413   for (;;) {}
414 }
415  
416 int main (void) {
417   // System Initialization
418   SystemCoreClockUpdate();
419   // ...
420
421   osKernelInitialize();                 // Initialize CMSIS-RTOS
422   osThreadNew(app_main, NULL, NULL);    // Create application main thread
423   osKernelStart();                      // Start thread execution
424   for (;;) {}
425 }
426 \endcode
427
428
429 \section ThreadStack Thread Stack Management
430
431 For Cortex-M processors without floating point unit the thread context requires 64 bytes on the local stack.
432
433 \note For Cortex-M4/M7 with FP the thread context requires 200 bytes on the local stack. For these devices the default stack
434 space should be increased to a minimum of 300 bytes.
435
436 Each thread is provided with a separate stack that holds the thread context and stack space for automatic variables and
437 return addresses for function call nesting. The stack sizes of RTX threads are flexibly configurable as explained in the
438 section \ref threadConfig. RTX offers a configurable checking for stack overflows and stack utilization. 
439
440
441 \section lowPower Low-Power Operation
442
443 The system thread \b osRtxIdleThread can be use to switch the system into a low-power mode. The easiest form to enter a
444 low-power mode is the execution of the \c __WFE function that puts the processor into a sleep mode where it waits for an
445 event.
446
447 <b>Code Example:</b>
448 \code
449 #include "RTE_Components.h"
450 #include CMSIS_device_header            /* Device definitions                 */
451  
452 void osRtxIdleThread (void) {
453   /* The idle demon is a system thread, running when no other thread is       */
454   /* ready to run.                                                            */
455  
456   for (;;) {
457     __WFE();                            /* Enter sleep mode                   */
458   }
459 }
460 \endcode
461
462 \note
463 \c __WFE() is not available in every Cortex-M implementation. Check device manuals for availability.
464
465
466 \section kernelTimer RTX Kernel Timer Tick
467
468 RTX uses the generic \ref CMSIS_RTOS_TickAPI to configure and control its periodic Kernel Tick.
469
470 To use an alternative timer as the Kernel Tick Timer one simply needs to implement a custom version
471 of the \ref CMSIS_RTOS_TickAPI.
472
473 \note The OS Tick implementation provided must asure that the used timer interrupt uses the same (low) priority group 
474 as the service interrupts, i.e. interrupts used by RTX must not preempt each other. Refer to the \ref Scheduler section
475 for more details.
476
477 \subsection TickLess Tick-less Low-Power Operation
478
479 RTX5 provides extension for tick-less operation which is useful for applications that use extensively low-power modes where
480 the SysTick timer is also disabled. To provide a time-tick in such power-saving modes, a wake-up timer is used to
481 derive timer intervals. The CMSIS-RTOS2 functions \ref osKernelSuspend and \ref osKernelResume control the tick-less
482 operation.
483
484 Using this functions allows the RTX5 thread scheduler to stop the periodic kernel tick interrupt. When all active threads
485 are suspended, the system enters power-down and calculates how long it can stay in this power-down mode. In the power-down
486 mode the processor and peripherals can be switched off. Only a wake-up timer must remain powered, because this timer is
487 responsible to wake-up the system after the power-down period expires.
488
489 The tick-less operation is controlled from the \b osRtxIdleThread thread. The wake-up timeout value is set before the system
490 enters the power-down mode. The function \ref osKernelSuspend calculates the wake-up timeout measured in RTX Timer Ticks;
491 this value is used to setup the wake-up timer that runs during the power-down mode of the system.
492
493 Once the system resumes operation (either by a wake-up time out or other interrupts) the RTX5 thread scheduler is started
494 with the function \ref osKernelResume. The parameter \a sleep_time specifies the time (in RTX Timer Ticks) that the system
495 was in power-down mode.
496
497 <b>Code Example:</b>
498 \code
499 #include "msp.h"                        // Device header
500
501 /*----------------------------------------------------------------------------
502  *      MSP432 Low-Power Extension Functions
503  *---------------------------------------------------------------------------*/
504 static void MSP432_LP_Entry(void) {
505   /* Enable PCM rude mode, which allows to device to enter LPM3 without waiting for peripherals */
506   PCM->CTL1 = PCM_CTL1_KEY_VAL | PCM_CTL1_FORCE_LPM_ENTRY;       
507   /* Enable all SRAM bank retentions prior to going to LPM3  */
508   SYSCTL->SRAM_BANKRET |= SYSCTL_SRAM_BANKRET_BNK7_RET;
509   __enable_interrupt();
510   NVIC_EnableIRQ(RTC_C_IRQn);
511   /* Do not wake up on exit from ISR */
512   SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
513   /* Setting the sleep deep bit */
514   SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);  
515 }
516  
517 static volatile unsigned int tc;
518 static volatile unsigned int tc_wakeup;
519  
520 void RTC_C_IRQHandler(void)
521 {
522   if (tc++ > tc_wakeup) 
523   {
524     SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;    
525     NVIC_DisableIRQ(RTC_C_IRQn);
526     NVIC_ClearPendingIRQ(RTC_C_IRQn);
527     return;
528   }
529   if (RTC_C->PS0CTL & RTC_C_PS0CTL_RT0PSIFG)
530   {
531     RTC_C->CTL0 = RTC_C_KEY_VAL;                 // Unlock RTC key protected registers
532     RTC_C->PS0CTL &= ~RTC_C_PS0CTL_RT0PSIFG;
533     RTC_C->CTL0 = 0;
534     SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);
535   }
536 }
537  
538 uint32_t g_enable_sleep = 0;
539   
540 void osRtxIdleThread (void) {
541   
542   for (;;) {
543     tc_wakeup = osKernelSuspend();
544     /* Is there some time to sleep? */
545     if (tc_wakeup > 0) {
546       tc = 0;
547       /* Enter the low power state */
548       MSP432_LP_Entry();
549       __WFE();
550     }
551     /* Adjust the kernel ticks with the amount of ticks slept */
552     osKernelResume (tc);
553   }
554 }
555 \endcode
556
557 \note
558 \c __WFE() is not available in every Arm Cortex-M implementation. Check device manuals for availability. 
559 The alternative using \c __WFI() has other issues, please take note of http://www.keil.com/support/docs/3591.htm as well.
560
561 \section rtx_os_h RTX5 Header File
562
563 Every implementation of the CMSIS-RTOS2 API can bring its own additional features. RTX5 adds a couple of
564 \ref rtx5_specific "functions" for the idle more, for error notifications, and special system timer functions. It also is
565 using macros for control block and memory sizes.
566
567 If you require some of the RTX specific functions in your application code, \#include the header file \b %rtx_os.h:
568
569 \include rtx_os.h
570
571
572 \section CMSIS_RTOS_TimeOutValue Timeout Value   
573
574 Timeout values are an argument to several \b osXxx functions to allow time for resolving a request. A timeout value of \b 0
575 means that the RTOS does not wait and the function returns instantly, even when no resource is available. A timeout value of
576 \ref osWaitForever means that the RTOS waits infinitely until a resource becomes available. Or one forces the thread to resume
577 using \ref osThreadResume which is discouraged.
578  
579 The timeout value specifies the number of timer ticks until the time delay elapses. The value is an upper bound and 
580 depends on the actual time elapsed since the last timer tick. 
581
582 Examples:
583   - timeout value \b 0 : the system does not wait, even when no resource is available the RTOS function returns instantly. 
584   - timeout value \b 1 : the system waits until the next timer tick occurs; depending on the previous timer tick, it may be a
585     very short wait time.
586   - timeout value \b 2 : actual wait time is between 1 and 2 timer ticks.
587   - timeout value \ref osWaitForever : system waits infinite until a resource becomes available. 
588   
589 \image html TimerValues.png "Example of timeout using osDelay()"
590
591
592 \section CMSIS_RTOS_ISR_Calls Calls from Interrupt Service Routines 
593
594 The following CMSIS-RTOS2 functions can be called from threads and Interrupt Service Routines (ISR):
595   - \ref osKernelGetInfo, \ref osKernelGetState,
596     \ref osKernelGetTickCount, \ref osKernelGetTickFreq, \ref osKernelGetSysTimerCount, \ref osKernelGetSysTimerFreq
597   - \ref osThreadGetId, \ref osThreadFlagsSet
598   - \ref osEventFlagsSet, \ref osEventFlagsClear, \ref osEventFlagsGet, \ref osEventFlagsWait
599   - \ref osSemaphoreAcquire, \ref osSemaphoreRelease, \ref osSemaphoreGetCount
600   - \ref osMemoryPoolAlloc, \ref osMemoryPoolFree, \ref osMemoryPoolGetCapacity, \ref osMemoryPoolGetBlockSize,
601     \ref osMemoryPoolGetCount, \ref osMemoryPoolGetSpace
602   - \ref osMessageQueuePut, \ref osMessageQueueGet, \ref osMessageQueueGetCapacity, \ref osMessageQueueGetMsgSize,
603     \ref osMessageQueueGetCount, \ref osMessageQueueGetSpace
604
605 Functions that cannot be called from an ISR are verifying the interrupt status and return the status code \b osErrorISR, in
606 case they are called from an ISR context. In some implementations, this condition might be caught using the HARD_FAULT
607 vector.
608 */
609
610 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
611 /**
612 \page config_rtx5 Configure RTX v5
613
614 The file "RTX_Config.h" defines the configuration parameters of CMSIS-RTOS RTX and must be part of every project that is
615 using the CMSIS-RTOS RTX kernel. The configuration options are explained in detail in the following sections:
616 - \ref systemConfig covers system-wide settings for the global memory pool, tick frequency, ISR event buffer and round-robin thread switching.
617 - \ref threadConfig provides several parameters to configure the \ref CMSIS_RTOS_ThreadMgmt functions.
618 - \ref timerConfig provides several parameters to configure the \ref CMSIS_RTOS_TimerMgmt functions.
619 - \ref eventFlagsConfig provides several parameters to configure the \ref CMSIS_RTOS_EventFlags functions.
620 - \ref mutexConfig provides several parameters to configure the \ref CMSIS_RTOS_MutexMgmt functions.
621 - \ref semaphoreConfig provides several parameters to configure the \ref CMSIS_RTOS_SemaphoreMgmt functions.
622 - \ref memPoolConfig provides several parameters to configure the \ref CMSIS_RTOS_PoolMgmt functions.
623 - \ref msgQueueConfig provides several parameters to configure the \ref CMSIS_RTOS_Message functions.
624 - \ref evtrecConfig provides several parameters to configure RTX for usage with <a href="http://www.keil.com/pack/doc/compiler/EventRecorder/html/index.html" target="_blank"><b>Event Recorder</b></a>.
625
626 The file "RTX_Config.c" contains default implementations of the functions \ref osRtxIdleThread and \ref osRtxErrorNotify. Both functions
627 can simply be overwritten with a customized behavior by redefining them as part of the user code.
628
629 The configuration file uses <b>Configuration Wizard Annotations</b>. Refer to <b>Pack - Configuration Wizard Annotations</b> for details.
630 Depending on the development tool, the annotations might lead to a more user-friendly graphical representation of the
631 settings. The picture below shows the µVision \b Configuration \b Wizard view in MDK:
632
633 \image html config_wizard.png "RTX_Config.h in Configuration Wizard View"
634
635 Alternatively one can provide configuration options using the compiler command line.
636
637 For example one can customize the used tick frequency to 100us by (overwriting) the configuration using
638 \code
639 cc -DOS_TICK_FREQ=100
640 \endcode
641
642 \section systemConfig System Configuration
643
644 The system configuration covers system-wide settings for the global memory pool, tick frequency, ISR event buffer and
645 round-robin thread switching.
646
647 <b>System Configuration Options</b>
648 \image html config_wizard_system.png "RTX_Config.h: System Configuration"
649
650 Name                                   | \#define                 | Description
651 ---------------------------------------|--------------------------|----------------------------------------------------------------
652 Global Dynamic Memory size [bytes]     | \c OS_DYNAMIC_MEM_SIZE   | Defines the combined global dynamic memory size for the \ref GlobalMemoryPool. Default value is \token{4096}. Value range is \token{[0-1073741824]} bytes, in multiples of \token{8} bytes.
653 Kernel Tick Frequency (Hz)             | \c OS_TICK_FREQ          | Defines base time unit for delays and timeouts in Hz. Default: 1000Hz = 1ms period.
654 Round-Robin Thread switching           | \c OS_ROBIN_ENABLE       | Enables Round-Robin Thread switching.
655 Round-Robin Timeout                    | \c OS_ROBIN_TIMEOUT      | Defines how long a thread will execute before a thread switch. Default value is \token{5}. Value range is \token{[1-1000]}.
656 ISR FIFO Queue                         | \c OS_ISR_FIFO_QUEUE     | RTOS Functions called from ISR store requests to this buffer. Default value is \token{16 entries}. Value range is \token{[4-256]} entries in multiples of \token{4}.
657 Object Memory usage counters           | \c OS_OBJ_MEM_USAGE      | Enables object memory usage counters to evaluate the maximum memory pool requirements individually for each RTOS object type.
658
659 \subsection systemConfig_glob_mem Global dynamic memory
660 Refer to \ref GlobalMemoryPool.
661
662
663 \subsection systemConfig_rr Round-Robin Thread Switching
664
665 RTX5 may be configured to use round-robin multitasking thread switching. Round-robin allows quasi-parallel execution of
666 several threads of the \a same priority. Threads are not really executed concurrently, but are scheduled where the available
667 CPU time is divided into time slices and RTX5 assigns a time slice to each thread. Because the time slice is typically short
668 (only a few milliseconds), it appears as though threads execute simultaneously.
669
670 Round-robin thread switching functions as follows:
671 - the tick is preloaded with the timeout value when a thread switch occurs
672 - the tick is decremented (if not already zero) each system tick if the same thread is still executing
673 - when the tick reaches 0 it indicates that a timeout has occurred. If there is another thread ready with the \a same
674   priority, then the system switches to that thread and the tick is preloaded with timeout again.
675
676 In other words, threads execute for the duration of their time slice (unless a thread's time slice is given up). Then, RTX
677 switches to the next thread that is in \b READY state and has the same priority. If no other thread with the same priority is
678 ready to run, the current running thread resumes it execution.
679
680 \note When switching to higher priority threads, the round-robin timeout value is reset.
681
682 Round-Robin multitasking is controlled with the <b>\#define OS_ROBIN_ENABLE</b>. The time slice period is configured (in RTX
683 timer ticks) with the <b>\#define OS_ROBIN_TIMEOUT</b>.
684
685
686 \subsection systemConfig_isr_fifo ISR FIFO Queue
687 The RTX functions (\ref CMSIS_RTOS_ISR_Calls), when called from and interrupt handler, store the request type and optional
688 parameter to the ISR FIFO queue buffer to be processed later, after the interrupt handler exits.
689
690 The scheduler is activated immediately after the IRQ handler has finished its execution to process the requests stored to the
691 FIFO queue buffer. The required size of this buffer depends on the number of functions that are called within the interrupt
692 handler. An insufficient queue size will be caught by \b osRtxErrorNotify with error code \b osRtxErrorISRQueueOverflow.
693
694
695 \subsection systemConfig_usage_counters Object Memory Usage Counters
696
697 Object memory usage counters help to evaluate the maximum memory pool requirements for each object type, just like stack
698 watermarking does for threads. The initial setup starts with a global memory pool for all object types. Consecutive runs of
699 the application with object memory usage counters enabled, help to introduce object specific memory pools for each object
700 type. Normally, this is required for applications that require a functional safety certification as global memory pools are
701 not allowed in this case.
702
703
704 \section threadConfig Thread Configuration
705
706 The RTX5 provides several parameters to configure the \ref CMSIS_RTOS_ThreadMgmt functions.
707
708 <b>Thread Configuration Options</b>
709 \image html config_wizard_threads.png "RTX_Config.h: Thread Configuration"
710
711 <br> 
712 Option                                                   | \#define               | Description
713 :--------------------------------------------------------------------------|:-------------------------------|:---------------------------------------------------------------
714 Object specific Memory allocation                        | \c OS_THREAD_OBJ_MEM   | Enables object specific memory allocation. See \ref ObjectMemoryPool.
715 Number of user Threads                                   | \c OS_THREAD_NUM       | Defines maximum number of user threads that can be active at the same time. Applies to user threads with system provided memory for control blocks. Default value is \token{1}. Value range is \token{[1-1000]}.
716 Number of user Threads with default Stack size  | \c OS_THREAD_DEF_STACK_NUM     | Defines maximum number of user threads with default stack size and applies to user threads with \token{0} stack size specified. Value range is \token{[0-1000]}.
717 Total Stack size [bytes] for user Threads with user-provided Stack size    | \c OS_THREAD_USER_STACK_SIZE | Defines the combined stack size for user threads with user-provided stack size. Default value is \token{0}. Value range is \token{[0-1073741824]} Bytes, in multiples of \token{8}. 
718 Default Thread Stack size [bytes]                        | \c OS_STACK_SIZE    | Defines stack size for threads with zero stack size specified. Default value is \token{200}. Value range is \token{[96-1073741824]} Bytes, in multiples of \token{8}. 
719 Idle Thread Stack size [bytes]                           | \c OS_IDLE_THREAD_STACK_SIZE              | Defines stack size for Idle thread. Default value is \token{200}. Value range is \token{[72-1073741824]} bytes, in multiples of \token{8}. 
720 Idle Thread TrustZone Module ID                                            | \c OS_IDLE_THREAD_TZ_MOD_ID    | Defines the \ref osThreadAttr_t::tz_module "TrustZone Module ID" the Idle Thread shall use. This needs to be set to a non-zero value if the Idle Thread need to call secure functions. Default value is \token{0}.
721 Stack overrun checking                                   | \c OS_STACK_CHECK   | Enable stack overrun checks at thread switch. 
722 Stack usage watermark                                    | \c OS_STACK_WATERMARK    | Initialize thread stack with watermark pattern for analyzing stack usage. Enabling this option increases significantly the execution time of thread creation.
723 Processor mode for Thread execution                      | \c OS_PRIVILEGE_MODE     | Controls the processor mode. Default value is \token{Privileged} mode. Value range is \token{[0=Unprivileged; 1=Privileged]} mode.
724
725 \subsection threadConfig_countstack Configuration of Thread Count and Stack Space
726
727 The RTX5 kernel uses a separate stack space for each thread and provides two methods for defining the stack requirements:
728  - <b>Static allocation</b>: when \ref osThreadAttr_t::stack_mem and \ref osThreadAttr_t::stack_size specify a memory area
729    which is used for the thread stack. \b Attention: The stack memory provided must be 64-bit aligned, i.e. by using uint64_t for declaration.
730  - <b>Dynamic allocation</b>: when \ref osThreadAttr_t is NULL or \ref osThreadAttr_t::stack_mem is NULL, the system
731    allocates the stack memory from:
732      - Object-specific Memory Pool (default Stack size) when "Object specific Memory allocation" is enabled and "Number of
733        user Threads with default Stack size" is not \token{0} and \ref osThreadAttr_t::stack_size is \token{0} (or
734        \ref osThreadAttr_t is NULL).
735      - Object-specific Memory Pool (user-provided Stack size) when "Object specific Memory allocation" is enabled and "Total
736        Stack size for user..."  is not \token{0} and \ref osThreadAttr_t::stack_size is not \token{0}.
737      - Global Memory Pool when "Object specific Memory allocation" is disabled or (\ref osThreadAttr_t::stack_size is not
738        \token{0} and "Total Stack size for user..." is \token{0}) or (\ref osThreadAttr_t::stack_size is \token{0} and
739        "Number of user Threads with default Stack size" is \token{0}).
740
741 \ref osThreadAttr_t is a parameter of the function \ref osThreadNew.
742
743 \note
744 Before the RTX kernel is started by the \ref osKernelStart() function, the main stack defined in startup_<i>device</i>.s is
745 used. The main stack is also used for:
746  - user application calls to RTX functions in \b thread \b mode using SVC calls
747  - interrupt/exception handlers.
748  
749 \subsection threadConfig_ovfcheck Stack Overflow Checking
750 RTX5 implements a software stack overflow checking that traps stack overruns. Stack is used for return addresses and
751 automatic variables. Extensive usage or incorrect stack configuration may cause a stack overflow. Software stack overflow
752 checking is controlled with the define \c OS_STACK_CHECK.
753  
754 If a stack overflow is detected, the function \ref osRtxErrorNotify with error code \ref osRtxErrorStackUnderflow is called. By
755 default, this function is implemented as an endless loop and will practically stop code execution.
756
757 \subsection threadConfig_watermark Stack Usage Watermark
758 RTX5 initializes thread stack with a watermark pattern (0xCC) when a thread is created. This allows the debugger to determine
759 the maximum stack usage for each thread. It is typically used during development but removed from the final application.
760 Stack usage watermark is controlled with the define \c OS_STACK_WATERMARK.
761   
762 Enabling this option significantly increases the execution time of \ref osThreadNew (depends on thread stack size).
763  
764 \subsection threadConfig_procmode Processor Mode for Thread Execution
765 RTX5 allows to execute threads in unprivileged or privileged processor mode. The processor mode is controlled with the
766 define \c OS_PRIVILEGE_MODE.
767  
768 In \b unprivileged processor mode, the application software:
769 - has limited access to the MSR and MRS instructions, and cannot use the CPS instruction.
770 - cannot access the system timer, NVIC, or system control block.
771 - might have restricted access to memory or peripherals.
772
773 In \b privileged processor mode, the application software can use all the instructions and has access to all resources.
774
775
776 \section timerConfig Timer Configuration
777
778 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_TimerMgmt functions.
779
780 <b>Timer Configuration Options</b>
781 \image html config_wizard_timer.png "RTX_Config.h: Timer Configuration"
782
783 Name                                   | \#define                 | Description
784 ---------------------------------------|--------------------------------|----------------------------------------------------------------
785 Object specific Memory allocation      | \c OS_TIMER_OBJ_MEM      | Enables object specific memory allocation. 
786 Number of Timer objects                | \c OS_TIMER_NUM          | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
787 Timer Thread Priority                  | \c OS_TIMER_THREAD_PRIO        | Defines priority for timer thread. Default value is \token{40}. Value range is \token{[8-48]}, in multiples of \token{8}. The numbers have the following priority correlation: \token{8=Low}; \token{16=Below Normal}; \token{24=Normal}; \token{32=Above Normal}; \token{40=High}; \token{48=Realtime} 
788 Timer Thread Stack size [bytes]        | \c OS_TIMER_THREAD_STACK_SIZE  | Defines stack size for Timer thread. May be set to 0 when timers are not used. Default value is \token{200}. Value range is \token{[0-1073741824]}, in multiples of \token{8}.
789 Timer Thread TrustZone Module ID       | \c OS_TIMER_THREAD_TZ_MOD_ID   | Defines the \ref osThreadAttr_t::tz_module "TrustZone Module ID" the Timer Thread shall use. This needs to be set to a non-zero value if any Timer Callbacks need to call secure functions. Default value is \token{0}.
790 Timer Callback Queue entries           | \c OS_TIMER_CB_QUEUE           | Number of concurrent active timer callback functions. May be set to 0 when timers are not used. Default value is \token{4}. Value range is \token{[0-256]}.
791
792 \subsection timerConfig_obj Object-specific memory allocation
793 See \ref ObjectMemoryPool.
794
795 \subsection timerConfig_user User Timer Thread
796 The RTX5 function \b osRtxTimerThread executes callback functions when a time period expires. The priority of the timer
797 subsystem within the complete RTOS system is inherited from the priority of the \b osRtxTimerThread. This is configured by
798 \c OS_TIMER_THREAD_PRIO. Stack for callback functions is supplied by \b osRtxTimerThread. \c OS_TIMER_THREAD_STACK_SIZE must
799 satisfy the stack requirements of the callback function with the highest stack usage. 
800
801
802 \section eventFlagsConfig Event Flags Configuration
803
804 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_EventFlags functions.
805
806 <b>Event Configuration Options</b>
807 \image html config_wizard_eventFlags.png "RTX_Config.h: Event Flags Configuration"
808
809 Name                                   | \#define                 | Description
810 ---------------------------------------|--------------------------|----------------------------------------------------------------
811 Object specific Memory allocation      | \c OS_EVFLAGS_OBJ_MEM    | Enables object specific memory allocation. See \ref ObjectMemoryPool.
812 Number of Event Flags objects          | \c OS_EVFLAGS_NUM        | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
813
814 \subsection eventFlagsConfig_obj Object-specific memory allocation
815 When object-specific memory is used, the pool size for all Event objects is specified by \c OS_EVFLAGS_NUM. Refer to
816 \ref ObjectMemoryPool.
817
818
819 \section mutexConfig Mutex Configuration
820 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_MutexMgmt functions.
821
822 <b>Mutex Configuration Options</b>
823 \image html config_wizard_mutex.png "RTX_Config.h: Mutex Configuration"
824
825
826 Name                                   | \#define                 | Description
827 ---------------------------------------|--------------------------|----------------------------------------------------------------
828 Object specific Memory allocation      | \c OS_MUTEX_OBJ_MEM      | Enables object specific memory allocation. See \ref ObjectMemoryPool.
829 Number of Mutex objects                | \c OS_MUTEX_NUM          | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
830
831 \subsection mutexConfig_obj Object-specific Memory Allocation
832 When object-specific memory is used, the pool size for all Mutex objects is specified by \c OS_MUTEX_NUM. Refer to
833 \ref ObjectMemoryPool.
834
835
836 \section semaphoreConfig Semaphore Configuration
837
838 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_SemaphoreMgmt functions.
839
840 <b>Semaphore Configuration Options</b>
841 \image html config_wizard_semaphore.png "RTX_Config.h: Semaphore Configuration"
842
843
844 Name                                   | \#define                 | Description
845 ---------------------------------------|--------------------------|----------------------------------------------------------------
846 Object specific Memory allocation      | \c OS_SEMAPHORE_OBJ_MEM  | Enables object specific memory allocation. See \ref ObjectMemoryPool.
847 Number of Semaphore objects            | \c OS_SEMAPHORE_NUM      | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
848
849 \subsection semaphoreConfig_obj Object-specific memory allocation
850 When Object-specific Memory is used, the pool size for all Semaphore objects is specified by \c OS_SEMAPHORE_NUM. Refer to
851 \ref ObjectMemoryPool.
852
853
854 \section memPoolConfig Memory Pool Configuration
855
856 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_PoolMgmt functions.
857
858 <b>Memory Pool Configuration Options</b>
859 \image html config_wizard_memPool.png "RTX_Config.h: Memory Pool Configuration"
860
861 Name                                   | \#define                 | Description
862 ---------------------------------------|--------------------------|----------------------------------------------------------------
863 Object specific Memory allocation      | \c OS_MEMPOOL_OBJ_MEM    | Enables object specific memory allocation. See \ref ObjectMemoryPool.
864 Number of Memory Pool objects          | \c OS_MEMPOOL_NUM        | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
865 Data Storage Memory size [bytes]       | \c OS_MEMPOOL_DATA_SIZE  | Defines the combined data storage memory size. Applies to objects with system provided memory for data storage. Default value is \token{0}. Value range is \token{[0-1073741824]}, in multiples of \token{8}.
866
867 \subsection memPoolConfig_obj Object-specific memory allocation
868 When object-specific memory is used, the number of pools for all MemoryPool objects is specified by \c OS_MEMPOOL_NUM. The
869 total storage size reserved for all pools is configured in \c OS_MEMPOOL_DATA_SIZE. Refer to \ref ObjectMemoryPool.
870
871
872 \section msgQueueConfig Message Queue Configuration
873
874 RTX5 provides several parameters to configure the \ref CMSIS_RTOS_Message functions.
875
876 <b>MessageQueue Configuration Options</b>
877 \image html config_wizard_msgQueue.png "RTX_Config.h: Message Queue Configuration"
878
879 Name                                   | \#define                 | Description
880 ---------------------------------------|--------------------------|----------------------------------------------------------------
881 Object specific Memory allocation      | \c OS_MSGQUEUE_OBJ_MEM   | Enables object specific memory allocation. See \ref ObjectMemoryPool.
882 Number of Message Queue objects        | \c OS_MSGQUEUE_NUM       | Defines maximum number of objects that can be active at the same time. Applies to objects with system provided memory for control blocks. Value range is \token{[1-1000]}.
883 Data Storage Memory size [bytes]       | \c OS_MSGQUEUE_DATA_SIZE | Defines the combined data storage memory size. Applies to objects with system provided memory for data storage. Default value is \token{0}. Value range is \token{[0-1073741824]}, in multiples of \token{8}.
884
885 \subsection msgQueueConfig_obj Object-specific memory allocation
886 When Object-specific Memory is used, the number of queues for all Message Queue objects is specified by \c OS_MSGQUEUE_NUM.
887 The total storage size reserved for all queues is configured in \c OS_MSGQUEUE_DATA_SIZE. Refer to \ref ObjectMemoryPool.
888
889
890 \section evtrecConfig Event Recorder Configuration
891
892 This section describes the configuration settings for the <a href="http://www.keil.com/pack/doc/compiler/EventRecorder/html/index.html" target="_blank">Event Recorder</a>
893 annotations. The usage requires the source variant of RTX5; refer to \ref cre_rtx_proj_er for more information.
894
895 \subsection evtrecConfigGlobIni Global Configuration
896 Initialize Event Recorder during the \ref osKernelInitialize and optionally start event recording.
897
898 \image html config_wizard_evtrecGlobIni.png "RTX_Config.h: Initialization and filter setup configuration"
899
900 <br/>
901
902 Name                  | \#define        | Description
903 ----------------------|-----------------|----------------------------------------------------------------
904 Global Initialization | \c OS_EVR_INIT  | Initialize Event Recorder during \ref osKernelInitialize.
905 Start Recording       | \c OS_EVR_START | Start event recording after initialization.
906
907 \note
908 - If <b>Global Initialization (\c OS_EVR_INIT)</b> is set, an explicit call to \c EventRecorderInitialize is not required.
909 - If <b>Start Recording (\c OS_EVR_START)</b> is set, an explicit call to \c EventRecorderStart is not required. You may call the function \c EventRecorderStop to stop recording.
910
911
912 <b>Global Event Filter Setup</b>
913
914 These event filter settings are applied to all software component numbers, including MDK middleware and user components.
915
916 \image html config_wizard_evtrecGlobEvtFiltSetup.png "RTX_Config.h: Global Event Filter Setup"
917
918 <br/>
919
920 Name                      | \#define         | Description
921 --------------------------|------------------|----------------------------------------------------------------
922 Error events              | \c OS_EVR_LEVEL  | Enable error events.
923 API function call events  | \c OS_EVR_LEVEL  | Enable API function call events.
924 Operation events          | \c OS_EVR_LEVEL  | Enable operation events.
925 Detailed operation events | \c OS_EVR_LEVEL  | Enable detailed operation events.
926
927 \note
928 You may disable event recording for specific software components by calling the function \c EventRecorderDisable.
929
930 <b>RTOS Event Filter Setup</b>
931
932 These event filter settings are applied to specific RTX component groups with sub-options for:
933 - Error events
934 - API function call events
935 - Operation events
936 - Detailed operation events
937
938 The generation of events must be enabled as explained under \ref evtrecConfigEvtGen.
939
940
941 \image html config_wizard_evtrecRTOSEvtFilterSetup.png "RTX_Config.h: RTOS Event Filter Setup"
942
943 <br/>
944
945 Name              | \#define                   | Description
946 ------------------|----------------------------|----------------------------------------------------------------
947 Memory Management | \c OS_EVR_MEMORY_FILTER    | Filter enable for Memory Management events.
948 Kernel            | \c OS_EVR_KERNEL_FILTER    | Filter enable for Kernel events.
949 Thread            | \c OS_EVR_THREAD_FILTER    | Filter enable for Thread events.
950 Generic Wait      | \c OS_EVR_WAIT_FILTER      | Filter enable for Generic Wait events.
951 Thread Flags      | \c OS_EVR_THFLAGS_FILTER   | Filter enable for Thread Flags events.
952 Event Flags       | \c OS_EVR_EVFLAGS_FILTER   | Filter enable for Event Flags events.
953 Timer             | \c OS_EVR_TIMER_FILTER     | Filter enable for Timer events.
954 Mutex             | \c OS_EVR_MUTEX_FILTER     | Filter enable for Mutex events.
955 Semaphore         | \c OS_EVR_SEMAPHORE_FILTER | Filter enable for Semaphore events.
956 Memory Pool       | \c OS_EVR_MEMPOOL_FILTER   | Filter enable for Memory Pool events.
957 Message Queue     | \c OS_EVR_MSGQUEUE_FILTER  | Filter enable for Message Queue events.
958  
959
960 \subsection evtrecConfigEvtGen RTOS Event Generation
961
962 Enable the event generation for specific RTX component groups. This requires the RTX source variant (refer to \ref cre_rtx_proj_er for more information).
963
964 \image html config_wizard_evtrecGeneration.png "RTX_Config.h: Event generation configuration"
965
966 <br/>
967
968 Name              | \#define                 | Description
969 ------------------|--------------------------|----------------------------------------------------------------
970 Memory Management | \c OS_EVR_MEMORY         | Enables Memory Management events generation.
971 Kernel            | \c OS_EVR_KERNEL         | Enables Kernel events generation.
972 Thread            | \c OS_EVR_THREAD         | Enables Thread events generation.
973 Generic Wait      | \c OS_EVR_WAIT           | Enables Generic Wait events generation.
974 Thread Flags      | \c OS_EVR_THFLAGS        | Enables Thread Flags events generation.
975 Event Flags       | \c OS_EVR_EVFLAGS        | Enables Event Flags events generation.
976 Timer             | \c OS_EVR_TIMER          | Enables Timer events generation.
977 Mutex             | \c OS_EVR_MUTEX          | Enables Mutex events generation.
978 Semaphore         | \c OS_EVR_SEMAPHORE      | Enables Semaphore events generation.
979 Memory Pool       | \c OS_EVR_MEMPOOL        | Enables Memory Pool events generation.
980 Message Queue     | \c OS_EVR_MSGQUEUE       | Enables Message Queue events generation.
981
982 \note
983 If event generation for a component is disabled, the code that generates the related events is not included. Thus, \ref evtrecConfigGlobIni "filters" for this
984 component will have no effect and the debugger is unable to display any events for the related component group.
985
986
987 \subsection systemConfig_event_recording Manual event configuration
988
989 To disable the generation of events for a specific RTX API call, use the following \#define settings (from <b>rtx_evrt.h</b>) and add these manually 
990 to the <b>RTX_Config.h</b> file:
991
992 \b Memory \b events \n
993 \c EVR_RTX_MEMORY_INIT_DISABLE, \c EVR_RTX_MEMORY_ALLOC_DISABLE, \c EVR_RTX_MEMORY_FREE_DISABLE,
994 \c EVR_RTX_MEMORY_BLOCK_INIT_DISABLE, \c EVR_RTX_MEMORY_BLOCK_ALLOC_DISABLE, \c EVR_RTX_MEMORY_BLOCK_FREE_DISABLE
995
996 \b Kernel \b events \n
997 \c EVR_RTX_KERNEL_ERROR_DISABLE, \c EVR_RTX_KERNEL_INITIALIZE_DISABLE, \c EVR_RTX_KERNEL_INITIALIZED_DISABLE,
998 \c EVR_RTX_KERNEL_GET_INFO_DISABLE, \c EVR_RTX_KERNEL_INFO_RETRIEVED_DISABLE, \c EVR_RTX_KERNEL_GET_STATE_DISABLE,
999 \c EVR_RTX_KERNEL_START_DISABLE, \c EVR_RTX_KERNEL_STARTED_DISABLE, \c EVR_RTX_KERNEL_LOCK_DISABLE,
1000 \c EVR_RTX_KERNEL_LOCKED_DISABLE, \c EVR_RTX_KERNEL_UNLOCK_DISABLE, \c EVR_RTX_KERNEL_UNLOCKED_DISABLE,
1001 \c EVR_RTX_KERNEL_RESTORE_LOCK_DISABLE, \c EVR_RTX_KERNEL_LOCK_RESTORED_DISABLE, \c EVR_RTX_KERNEL_SUSPEND_DISABLE,
1002 \c EVR_RTX_KERNEL_SUSPENDED_DISABLE, \c EVR_RTX_KERNEL_RESUME_DISABLE, \c EVR_RTX_KERNEL_RESUMED_DISABLE,
1003 \c EVR_RTX_KERNEL_GET_TICK_COUNT_DISABLE, \c EVR_RTX_KERNEL_GET_TICK_FREQ_DISABLE,
1004 \c EVR_RTX_KERNEL_GET_SYS_TIMER_COUNT_DISABLE, \c EVR_RTX_KERNEL_GET_SYS_TIMER_FREQ_DISABLE
1005
1006 \b Thread \b events \n
1007 \c EVR_RTX_THREAD_ERROR_DISABLE, \c EVR_RTX_THREAD_NEW_DISABLE, \c EVR_RTX_THREAD_CREATED_DISABLE,
1008 \c EVR_RTX_THREAD_GET_NAME_DISABLE, \c EVR_RTX_THREAD_GET_ID_DISABLE, \c EVR_RTX_THREAD_GET_STATE_DISABLE,
1009 \c EVR_RTX_THREAD_GET_STACK_SIZE_DISABLE, \c EVR_RTX_THREAD_GET_STACK_SPACE_DISABLE, \c EVR_RTX_THREAD_SET_PRIORITY_DISABLE,
1010 \c EVR_RTX_THREAD_PRIORITY_UPDATED_DISABLE, \c EVR_RTX_THREAD_GET_PRIORITY_DISABLE, \c EVR_RTX_THREAD_YIELD_DISABLE,
1011 \c EVR_RTX_THREAD_SUSPEND_DISABLE, \c EVR_RTX_THREAD_SUSPENDED_DISABLE, \c EVR_RTX_THREAD_RESUME_DISABLE,
1012 \c EVR_RTX_THREAD_RESUMED_DISABLE, \c EVR_RTX_THREAD_DETACH_DISABLE, \c EVR_RTX_THREAD_DETACHED_DISABLE,
1013 \c EVR_RTX_THREAD_JOIN_DISABLE, \c EVR_RTX_THREAD_JOIN_PENDING_DISABLE, \c EVR_RTX_THREAD_JOINED_DISABLE,
1014 \c EVR_RTX_THREAD_BLOCKED_DISABLE, \c EVR_RTX_THREAD_UNBLOCKED_DISABLE, \c EVR_RTX_THREAD_PREEMPTED_DISABLE,
1015 \c EVR_RTX_THREAD_SWITCHED_DISABLE, \c EVR_RTX_THREAD_EXIT_DISABLE, \c EVR_RTX_THREAD_TERMINATE_DISABLE,
1016 \c EVR_RTX_THREAD_DESTROYED_DISABLE, \c EVR_RTX_THREAD_GET_COUNT_DISABLE, \c EVR_RTX_THREAD_ENUMERATE_DISABLE
1017
1018 \b Generic \b wait \b events \n
1019 \c EVR_RTX_DELAY_ERROR_DISABLE, \c EVR_RTX_DELAY_DISABLE, \c EVR_RTX_DELAY_UNTIL_DISABLE,
1020 \c EVR_RTX_DELAY_STARTED_DISABLE, \c EVR_RTX_DELAY_UNTIL_STARTED_DISABLE, \c EVR_RTX_DELAY_COMPLETED_DISABLE 
1021
1022 \b Thread \b flag \b events \n
1023 \c EVR_RTX_THREAD_FLAGS_ERROR_DISABLE, \c EVR_RTX_THREAD_FLAGS_SET_DISABLE, \c EVR_RTX_THREAD_FLAGS_SET_DONE_DISABLE,
1024 \c EVR_RTX_THREAD_FLAGS_CLEAR_DISABLE, \c EVR_RTX_THREAD_FLAGS_CLEAR_DONE_DISABLE, \c EVR_RTX_THREAD_FLAGS_GET_DISABLE,
1025 \c EVR_RTX_THREAD_FLAGS_WAIT_DISABLE, \c EVR_RTX_THREAD_FLAGS_WAIT_PENDING_DISABLE, \c EVR_RTX_THREAD_FLAGS_WAIT_TIMEOUT_DISABLE,
1026 \c EVR_RTX_THREAD_FLAGS_WAIT_COMPLETED_DISABLE, \c EVR_RTX_THREAD_FLAGS_WAIT_NOT_COMPLETED_DISABLE
1027
1028 \b Event \b flag \b events \n
1029 \c EVR_RTX_EVENT_FLAGS_ERROR_DISABLE, \c EVR_RTX_EVENT_FLAGS_NEW_DISABLE, \c EVR_RTX_EVENT_FLAGS_CREATED_DISABLE,
1030 \c EVR_RTX_EVENT_FLAGS_GET_NAME_DISABLE, \c EVR_RTX_EVENT_FLAGS_SET_DISABLE, \c EVR_RTX_EVENT_FLAGS_SET_DONE_DISABLE,
1031 \c EVR_RTX_EVENT_FLAGS_CLEAR_DISABLE, \c EVR_RTX_EVENT_FLAGS_CLEAR_DONE_DISABLE, \c EVR_RTX_EVENT_FLAGS_GET_DISABLE,
1032 \c EVR_RTX_EVENT_FLAGS_WAIT_DISABLE, \c EVR_RTX_EVENT_FLAGS_WAIT_PENDING_DISABLE,
1033 \c EVR_RTX_EVENT_FLAGS_WAIT_TIMEOUT_DISABLE, \c EVR_RTX_EVENT_FLAGS_WAIT_COMPLETED_DISABLE,
1034 \c EVR_RTX_EVENT_FLAGS_WAIT_NOT_COMPLETED_DISABLE, \c EVR_RTX_EVENT_FLAGS_DELETE_DISABLE,
1035 \c EVR_RTX_EVENT_FLAGS_DESTROYED_DISABLE
1036
1037 \b Timer \b events \n
1038 \c EVR_RTX_TIMER_ERROR_DISABLE, \c EVR_RTX_TIMER_CALLBACK_DISABLE, \c EVR_RTX_TIMER_NEW_DISABLE,
1039 \c EVR_RTX_TIMER_CREATED_DISABLE, \c EVR_RTX_TIMER_GET_NAME_DISABLE, \c EVR_RTX_TIMER_START_DISABLE,
1040 \c EVR_RTX_TIMER_STARTED_DISABLE, \c EVR_RTX_TIMER_STOP_DISABLE, \c EVR_RTX_TIMER_STOPPED_DISABLE,
1041 \c EVR_RTX_TIMER_IS_RUNNING_DISABLE, \c EVR_RTX_TIMER_DELETE_DISABLE, \c EVR_RTX_TIMER_DESTROYED_DISABLE
1042
1043 \b Mutex \b events \n
1044 \c EVR_RTX_MUTEX_ERROR_DISABLE, \c EVR_RTX_MUTEX_NEW_DISABLE, \c EVR_RTX_MUTEX_CREATED_DISABLE,
1045 \c EVR_RTX_MUTEX_GET_NAME_DISABLE, \c EVR_RTX_MUTEX_ACQUIRE_DISABLE, \c EVR_RTX_MUTEX_ACQUIRE_PENDING_DISABLE,
1046 \c EVR_RTX_MUTEX_ACQUIRE_TIMEOUT_DISABLE, \c EVR_RTX_MUTEX_ACQUIRED_DISABLE, \c EVR_RTX_MUTEX_NOT_ACQUIRED_DISABLE,
1047 \c EVR_RTX_MUTEX_RELEASE_DISABLE, \c EVR_RTX_MUTEX_RELEASED_DISABLE, \c EVR_RTX_MUTEX_GET_OWNER_DISABLE,
1048 \c EVR_RTX_MUTEX_DELETE_DISABLE, \c EVR_RTX_MUTEX_DESTROYED_DISABLE
1049
1050 \b Semaphore \b events \n
1051 \c EVR_RTX_SEMAPHORE_ERROR_DISABLE, \c EVR_RTX_SEMAPHORE_NEW_DISABLE, \c EVR_RTX_SEMAPHORE_CREATED_DISABLE,
1052 \c EVR_RTX_SEMAPHORE_GET_NAME_DISABLE, \c EVR_RTX_SEMAPHORE_ACQUIRE_DISABLE, \c EVR_RTX_SEMAPHORE_ACQUIRE_PENDING_DISABLE,
1053 \c EVR_RTX_SEMAPHORE_ACQUIRE_TIMEOUT_DISABLE, \c EVR_RTX_SEMAPHORE_ACQUIRED_DISABLE,
1054 \c EVR_RTX_SEMAPHORE_NOT_ACQUIRED_DISABLE, \c EVR_RTX_SEMAPHORE_RELEASE_DISABLE, \c EVR_RTX_SEMAPHORE_RELEASED_DISABLE,
1055 \c EVR_RTX_SEMAPHORE_GET_COUNT_DISABLE, \c EVR_RTX_SEMAPHORE_DELETE_DISABLE, \c EVR_RTX_SEMAPHORE_DESTROYED_DISABLE
1056
1057 \b Memory \b pool \b events \n
1058 \c EVR_RTX_MEMORY_POOL_ERROR_DISABLE, \c EVR_RTX_MEMORY_POOL_NEW_DISABLE, \c EVR_RTX_MEMORY_POOL_CREATED_DISABLE,
1059 \c EVR_RTX_MEMORY_POOL_GET_NAME_DISABLE, \c EVR_RTX_MEMORY_POOL_ALLOC_DISABLE, \c EVR_RTX_MEMORY_POOL_ALLOC_PENDING_DISABLE,
1060 \c EVR_RTX_MEMORY_POOL_ALLOC_TIMEOUT_DISABLE, \c EVR_RTX_MEMORY_POOL_ALLOCATED_DISABLE,
1061 \c EVR_RTX_MEMORY_POOL_ALLOC_FAILED_DISABLE, \c EVR_RTX_MEMORY_POOL_FREE_DISABLE, \c EVR_RTX_MEMORY_POOL_DEALLOCATED_DISABLE,
1062 \c EVR_RTX_MEMORY_POOL_FREE_FAILED_DISABLE, \c EVR_RTX_MEMORY_POOL_GET_CAPACITY_DISABLE,
1063 \c EVR_RTX_MEMORY_POOL_GET_BLOCK_SZIE_DISABLE, \c EVR_RTX_MEMORY_POOL_GET_COUNT_DISABLE,
1064 \c EVR_RTX_MEMORY_POOL_GET_SPACE_DISABLE, \c EVR_RTX_MEMORY_POOL_DELETE_DISABLE, \c EVR_RTX_MEMORY_POOL_DESTROYED_DISABLE
1065
1066 \b Message \b queue \b events \n
1067 \c EVR_RTX_MESSAGE_QUEUE_ERROR_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_NEW_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_CREATED_DISABLE,
1068 \c EVR_RTX_MESSAGE_QUEUE_GET_NAME_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_PUT_DISABLE,
1069 \c EVR_RTX_MESSAGE_QUEUE_PUT_PENDING_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_PUT_TIMEOUT_DISABLE,
1070 \c EVR_RTX_MESSAGE_QUEUE_INSERT_PENDING_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_INSERTED_DISABLE,
1071 \c EVR_RTX_MESSAGE_QUEUE_NOT_INSERTED_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_GET_DISABLE,
1072 \c EVR_RTX_MESSAGE_QUEUE_GET_PENDING_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_GET_TIMEOUT_DISABLE,
1073 \c EVR_RTX_MESSAGE_QUEUE_RETRIEVED_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_NOT_RETRIEVED_DISABLE,
1074 \c EVR_RTX_MESSAGE_QUEUE_GET_CAPACITY_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_GET_MSG_SIZE_DISABLE,
1075 \c EVR_RTX_MESSAGE_QUEUE_GET_COUNT_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_GET_SPACE_DISABLE,
1076 \c EVR_RTX_MESSAGE_QUEUE_RESET_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_RESET_DONE_DISABLE,
1077 \c EVR_RTX_MESSAGE_QUEUE_DELETE_DISABLE, \c EVR_RTX_MESSAGE_QUEUE_DESTROYED_DISABLE
1078
1079
1080 */
1081
1082
1083 /* ========================================================================================================================== */
1084 /** 
1085 \page creating_RTX5_LIB Building the RTX5 Library
1086
1087 The CMSIS Pack contains a µVision project for building the complete set of RTX5 libraries. This project can also be used as
1088 a reference for building the RTX5 libraries using a tool-chain of your choice.
1089
1090 -# Open the project \b RTX_CM.uvprojx from the pack folder <b>CMSIS/RTOS2/RTX/Library/ARM/MDK</b> in µVision.
1091 -# Select the project target that matches your device's processor core. 
1092    \n The project provides target configuration for all supported Cortex-M targets supported by RTX5.
1093 -# You can find out about the required preprocessor defines in the dialogs <b>Options for Target - C/C++</b> and
1094    <b>Options for Target - Asm</b>. Note the need to use at least the C99 compiler mode when building RTX from source.
1095 -# From the <b>Project</b> window you find the list of source files required for a complete library build.
1096 -# Build the library of your choice using \b Project - \b Build \b Target (or press F7).
1097
1098 \image html own_lib_projwin.png "Project with files for Armv8-M Mainline"
1099 */
1100
1101
1102
1103 /* ========================================================================================================================== */
1104 /** 
1105 \page technicalData5 Technical Data
1106
1107 The following section contains technical information about RTX v5.
1108
1109  - \subpage pHardwareRequirements lists the resource requirements of the RTX v5 kernel along with hardware dependencies.
1110  - \subpage pControlBlockSizes provides memory size information for \ref StaticObjectMemory "object-specific control block memory allocation".
1111  - \subpage pDirectory_Files is an overview of the supplied files that belong to RTX v5
1112  - \subpage pToolchains details about the compiler support which includes ArmCC (MDK, DS-5), IAR EW-ARM, and GCC.
1113  
1114
1115
1116 \page pHardwareRequirements Hardware Requirements
1117
1118 The following section lists the hardware requirements for RTX v5 on the various supported target processors:
1119
1120 \section tpProcessor Processor Requirements
1121
1122 RTX assumes a fully function-able processor and uses the following hardware features. It does not implement any confidence test for processor validation which should be provided by an user-supplied software test library.
1123
1124
1125 \subsection tpCortexM0_M0P_M23 Cortex-M0/M0+/M23 target processor
1126
1127
1128 Hardware Requirement       | Description
1129 :--------------------------|:------------------------------------------------------
1130 SysTick timer              | The SysTick timer generates the kernel tick interrupts and the interface is implemented in %os_systick.c using the \ref CMSIS_RTOS_TickAPI
1131 Exception Handler          | RTX implements exception handlers for SVC, PendSV, and SysTick interrupt
1132 Core Registers             | The processor status is read using the following core registers: CONTROL, IPSR, PRIMASK
1133 System Control Block (SBC) | To control and setup the processor exceptions including PendSV and SVC
1134 Interrupt Control          | The CMSIS-Core functions __disable_irq and __enable_irq to control the interrupt system via the CPSR core register.
1135
1136 The interface files to the processor hardware are: 
1137  - <b>%irq_cm0.s</b> defines exception handlers for Cortex-M0/M0+
1138  - <b>%irq_armv8mbl_common.s</b> defines exception handlers for Cortex-M23
1139  - <b>%rtx_core_cm.h</b> defines processor specific helper functions and the interfaces to Core Registers and Core Peripherals.
1140  - <b>%os_tick.h</b> is the \ref CMSIS_RTOS_TickAPI that defines the interface functions to the SysTick timer.
1141
1142 \note
1143  - The CMSIS-Core variable \c SystemCoreClock is used to configure the SysTick timer. 
1144
1145 \subsection tpCortexM3_M4_M7_M33_M35P Cortex-M3/M4/M7/M33/M35P target processor
1146
1147
1148 Hardware Requirement       | Description
1149 :--------------------------|:------------------------------------------------------
1150 SysTick timer              | The SysTick timer generates the kernel tick interrupts and the interface is implemented in %os_systick.c using the \ref CMSIS_RTOS_TickAPI
1151 Exception Handler          | RTX implements exception handlers for SVC, PendSV, and SysTick interrupt
1152 Core Registers             | The processor status is read using the following core registers: CONTROL, IPSR, PRIMASK, BASEPRI
1153 System Control Block (SBC) | To control and setup the processor exceptions including PendSV and SVC
1154 NVIC Interface             | The CMSIS-Core function NVIC_GetPriorityGrouping to setup interrupt priorities.
1155 LDREX, STREX instruction   | Atomic execution avoids the requirement to disable interrupts and is implemented via exclusive access instructions.
1156
1157 The interface files to the processor hardware are: 
1158  - <b>%irq_cm3.s</b> defines exception handlers for Cortex-M3 and Cortex-M4/M7 without floating point unit.
1159  - <b>%irq_cm4f.s</b> defines exception handlers for Cortex-M4/M7 with floating point unit.
1160  - <b>%irq_armv8mml_common.s</b> defines exception handlers for Cortex-M33/M35P
1161  - <b>%rtx_core_cm.h</b> defines processor specific helper functions and the interfaces to Core Registers and Core Peripherals.
1162  - <b>%os_tick.h</b> is the \ref CMSIS_RTOS_TickAPI that defines the interface functions to the SysTick timer.
1163
1164 \note
1165  - The CMSIS-Core variable \c SystemCoreClock is used to configure the SysTick timer. 
1166
1167 \subsection tpCortexA5_A7_A9 Cortex-A5/A7/A9 target processor
1168
1169
1170 Hardware Requirement       | Description
1171 :--------------------------|:------------------------------------------------------
1172 Timer Peripheral           | An arbitrary timer peripheral generates the kernel tick interrupts. The interfaces for Cortex-A Generic Timer and Private Timer are implemented in %os_tick_gtim.c and %os_tick_ptim.c using the \ref CMSIS_RTOS_TickAPI
1173 Exception Handler          | RTX implements exception handlers for SVC, IRQ, Data Abort, Prefetch Abort and Undefined Instruction interrupt.
1174 Core Registers             | The processor status is read using the following core registers: CPSR, CPACR and FPSCR.
1175 LDREX, STREX instruction   | Atomic execution avoids the requirement to disable interrupts and is implemented via exclusive access instructions.
1176 Interrupt Controller       | An interrupt controller interface is required to setup and control Timer Peripheral interrupt. The interface for Arm GIC (Generic Interrupt Controller) is implemented in %irq_ctrl_gic.c using the <a class="el" href="../../Core_A/html/group__irq__ctrl__gr.html">IRQ Controller API</a>.
1177
1178 The interface files to the processor hardware are: 
1179  - <b>%irq_ca.s</b> defines SVC, IRQ, Data Abort, Prefetch Abort and Undefined Instruction exception handlers.
1180  - <b>%rtx_core_ca.h</b> defines processor specific helper functions and the interfaces to Core Registers and Core Peripherals.
1181  - <b>%os_tick.h</b> is the \ref CMSIS_RTOS_TickAPI that defines the interface functions to the timer peripheral.
1182  - <b>%irq_ctrl.h</b> is the <a class="el" href="../../Core_A/html/group__irq__ctrl__gr.html">IRQ Controller API</a> that defines the interface functions to the interrupt controller.
1183
1184 \note
1185  - The CMSIS-Core variable \c SystemCoreClock is used to configure the timer peripheral.
1186
1187 \section rMemory Memory Requirements
1188 RTX requires RAM memory that is accessible with contiguous linear addressing.  When memory is split across multiple memory banks, some systems 
1189 do not accept multiple load or store operations on this memory blocks. 
1190
1191 RTX does not implement any confidence test for memory validation. This should be implemented by an user-supplied software test library.
1192
1193
1194
1195 \page pControlBlockSizes Control Block Sizes
1196
1197 Keil RTX v5 specific control block definitions (including sizes) as well as memory pool and message queue memory requirements
1198 are defined in the header file <b>rtx_os.h</b>:
1199
1200 If you provide memory for the RTOS objects, you need to know the size that is required for each object control block.
1201 The memory of the control block is provided by the parameter \em attr of the related \em osXxxxNew function.
1202 The element \em cb_mem is the memory address, \em cb_size is the size of the control block memory.
1203
1204 Refer to \ref StaticObjectMemory for more information.
1205
1206 The following table lists the control block sizes:
1207
1208 Category                      | Control Block Size Attribute      | Size       | \#define symbol
1209 :-----------------------------|:----------------------------------|:-----------|:--------------------
1210 \ref CMSIS_RTOS_ThreadMgmt    | \ref osThreadAttr_t::cb_mem       | 68 bytes   | \ref osRtxThreadCbSize
1211 \ref CMSIS_RTOS_TimerMgmt     | \ref osTimerAttr_t::cb_mem        | 32 bytes   | \ref osRtxTimerCbSize
1212 \ref CMSIS_RTOS_EventFlags    | \ref osEventFlagsAttr_t::cb_mem   | 16 bytes   | \ref osRtxEventFlagsCbSize
1213 \ref CMSIS_RTOS_MutexMgmt     | \ref osMutexAttr_t::cb_mem        | 28 bytes   | \ref osRtxMutexCbSize
1214 \ref CMSIS_RTOS_SemaphoreMgmt | \ref osSemaphoreAttr_t::cb_mem    | 16 bytes   | \ref osRtxSemaphoreCbSize
1215 \ref CMSIS_RTOS_PoolMgmt      | \ref osMemoryPoolAttr_t::cb_mem   | 36 bytes   | \ref osRtxMemoryPoolCbSize
1216 \ref CMSIS_RTOS_Message       | \ref osMessageQueueAttr_t::cb_mem | 52 bytes   | \ref osRtxMessageQueueCbSize
1217
1218
1219
1220 \page pDirectory_Files Directory Structure and File Overview
1221
1222 The following section provides an overview of the directory structure and the files that are relevant for the user's for
1223 CMSIS-RTOS RTX v5. The following directory references start below the CMSIS pack installation path, for example
1224 ARM/CMSIS/<i>version</i>/CMSIS/RTOS2.
1225
1226 \section Folders RTX v5 Directory Structure
1227
1228 The CMSIS-RTOS RTX v5 is delivered in source code and several examples are provided. 
1229
1230 <table class="cmtable" summary="CMSIS-RTOS RTX Library Files">
1231     <tr>
1232       <th>Directory</th>
1233       <th>Content</th>
1234     </tr>
1235     <tr>
1236       <td>Include</td>
1237       <td>Header files: \b %cmsis_os2.h for \ref rtos_api2 and \b %os_tick.h for \ref rtos_os_tick_api.</td>
1238     </tr>
1239     <tr>
1240       <td>Source</td>
1241       <td>Generic <b>OS tick</b> implementations for various processors based on \ref rtos_os_tick_api.</td>
1242     </tr>
1243     <tr>
1244       <td>Template</td>
1245       <td><a class="el" href="../../RTOS/html/index.html">CMSIS-RTOS API v1</a> template source and header file.</td>
1246     </tr>
1247     <tr>
1248       <td>RTX</td>
1249       <td>Directory with RTX specific files and folders. Also contains the component viewer description file.</td>
1250     </tr>
1251     <tr>
1252       <td>RTX/Config</td>
1253       <td>CMSIS-RTOS RTX configuration files %RTX_Config.h and %RTX_Config.c.</td>
1254     </tr>
1255     <tr>
1256       <td>RTX/Examples</td>
1257       <td>Example projects that can be directly used in development tools.</td>
1258     </tr>
1259     <tr>
1260       <td>RTX/Include</td>
1261       <td>RTX v5 specific include files.</td>
1262     </tr>
1263     <tr>
1264       <td>RTX/Include1</td>
1265       <td>CMSIS-RTOS v1 API header file.</td>
1266     </tr>
1267     <tr>
1268       <td>RTX/Library</td>
1269       <td>Pre-built libraries (see next table for details).</td>
1270     </tr>
1271     <tr>
1272       <td>RTX/Source</td>
1273       <td>Source code that can be used with ARMCC and GCC.</td>
1274     </tr>
1275     <tr>
1276       <td>RTX/Template</td>
1277       <td>User code templates for creating application projects with CMSIS-RTOS RTX v5.</td>
1278     </tr>
1279 </table>
1280
1281 \section libFiles RTX v5 Library Files
1282
1283 The CMSIS-RTOS RTX Library is available pre-compiled for ARMCC and GCC compilers and supports all Cortex-M
1284 processor variants in every configuration, including Arm Cortex-M23, Cortex-M33 and Cortex-M35P.
1285
1286 <table class="cmtable" summary="CMSIS-RTOS RTX Library Files">
1287     <tr>
1288       <th>Library File</th>
1289       <th>Processor Configuration</th>
1290     </tr>
1291     <tr>
1292       <td>Library/ARM/RTX_CM0.lib</td>
1293       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Cortex-M0 and M1, little-endian.</td>
1294     </tr>
1295     <tr>
1296       <td>Library/ARM/RTX_CM3.lib</td>
1297       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Cortex-M3, M4, and M7 without FPU, little-endian.</td>
1298     </tr>
1299     <tr>
1300       <td>Library/ARM/RTX_CM4F.lib</td>
1301       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Cortex-M4 and M7 with FPU, little-endian.</td>
1302     </tr>
1303     <tr>
1304       <td>Library/ARM/RTX_V8MB.lib</td>
1305       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Baseline.</td>
1306     </tr>
1307     <tr>
1308       <td>Library/ARM/RTX_V8MBN.lib</td>
1309       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Baseline, non-secure.</td>
1310     </tr>
1311     <tr>
1312       <td>Library/ARM/RTX_V8MM.lib</td>
1313       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Mainline.</td>
1314     </tr>
1315     <tr>
1316       <td>Library/ARM/RTX_V8MMF.lib</td>
1317       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Mainline with FPU.</td>
1318     </tr>
1319     <tr>
1320       <td>Library/ARM/RTX_V8MMFN.lib</td>
1321       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Mainline with FPU, non-secure.</td>
1322     </tr>
1323     <tr>
1324       <td>Library/ARM/RTX_V8MMN.lib</td>
1325       <td>CMSIS-RTOS RTX Library for ARMCC Compiler, Armv8-M Mainline, non-secure.</td>
1326     </tr>
1327     <tr>
1328       <td>Library/GCC/libRTX_CM0.a</td>
1329       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Cortex-M0 and M1, little-endian.</td>
1330     </tr>
1331     <tr>
1332       <td>Library/GCC/libRTX_CM3.a</td>
1333       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Cortex-M3, M4, and M7 without FPU, little-endian.</td>
1334     </tr>
1335     <tr>
1336       <td>Library/GCC/libRTX_CM4F.a</td>
1337       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Cortex-M4 and M7 with FPU, little-endian.</td>
1338     </tr>
1339     <tr>
1340       <td>Library/GCC/libRTX_V8MB.a</td>
1341       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Baseline.</td>
1342     </tr>
1343     <tr>
1344       <td>Library/GCC/libRTX_V8MBN.a</td>
1345       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Baseline, non-secure.</td>
1346     </tr>
1347     <tr>
1348       <td>Library/GCC/libRTX_V8MM.a</td>
1349       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Mainline.</td>
1350     </tr>
1351     <tr>
1352       <td>Library/GCC/libRTX_V8MMF.a</td>
1353       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Mainline with FPU.</td>
1354     </tr>
1355     <tr>
1356       <td>Library/GCC/libRTX_V8MMFN.a</td>
1357       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Mainline with FPU, non-secure.</td>
1358     </tr>
1359     <tr>
1360       <td>Library/GCC/libRTX_V8MMN.a</td>
1361       <td>CMSIS-RTOS libRTX Library for GCC Compiler, Armv8-M Mainline, non-secure.</td>
1362     </tr>
1363 </table>
1364
1365  
1366 \page pToolchains Supported Toolchains
1367
1368 Keil RTX5 is developed and tested using the common toolchains and development environments.
1369
1370 \section technicalData_Toolchain_ARM Arm Compiler (Arm/Keil MDK, uVision5)
1371
1372 RTX5 is initially developed and optimized using Arm Compiler and Arm/Keil MDK.
1373 The current release is tested with the following versions:
1374 <ul>
1375  <li>Arm Compiler 5.06 Update 6</li>
1376  <li>Arm Compiler 6.6.2 (Long Term Maintenance)</li>
1377  <li>Arm Compiler 6.9</li>
1378  <li>RTOS-aware debugging with uVision 5.24</li>
1379 </ul>
1380
1381 \section technicalData_Toolchain_IAR IAR Embedded Workbench
1382
1383 RTX5 has been ported to the IAR Embedded Workbench. The following releases are known to work:
1384 <ul>
1385  <li>IAR Embedded Workbench 7.7 (<a href="https://github.com/ARM-software/CMSIS_5/issues/201">community report</a>)</li>
1386  <li>IAR Embedded Workbench 7.80.4</li>
1387  <li><b>IAR Embedded Workbench 8.20.1</b></li>
1388 </ul>
1389
1390 \section technicalData_Toolchain_GCC GNU Compiler Collection
1391
1392 RTX5 has also been ported to support GCC, maintenance mainly relays on community contribution.
1393 Active development is currently tested with:
1394 <ul>
1395  <li>GNU Tools for Arm Embedded 6.3.1 20170620</li>
1396 </ul>
1397
1398 */
1399
1400 /* ========================================================================================================================== */
1401 /** 
1402 \page CodingRules Coding Rules
1403
1404 CMSIS components use <a href="../../General/html/index.html#CodingRules"><b>general coding rules</b></a> across the various components.
1405
1406 The CMSIS-RTOS2 API is using the following <b>Namespace</b> prefixes:
1407   - <b>os</b> for all definitions and function names.
1408   - <b>os</b> with postfix <b>_t</b> for all typedefs.
1409   
1410 The CMSIS-RTOS2 RTX v5 implementation is using the following <b>Namespace</b> prefixes for public symbol definitions:
1411   - <b>osRtx</b> for all general definitions and function names that relate to the RTX kernel.
1412   - <b>osRtx</b> with postfix <b>_t</b> for all typedefs.
1413   - <b>OS_Tick_</b> for interface functions to the hardware system tick timer.
1414   - <b>EvrRtx</b> for event function annotations that interface to the Event Recorder.
1415 */
1416
1417 /* ========================================================================================================================== */
1418 /** 
1419 \page misraCompliance5 MISRA C:2012 Compliance 
1420 The RTX5 C source files use <b><a class=el href="http://www.misra.org.uk/" target="_blank">MISRA C:2012</a></b> guidelines as underlying coding standard.
1421
1422 For MISRA validation, <b><a class=el href="http://www.gimpel.com/" target="_blank">PC-lint</a></b> V9.00L is used with configuration for Arm Compiler V6.9.
1423 The PC-Lint validation setup is part of the project file <b>.\\CMSIS\\RTOS2\\RTX\\Library\\ARM\\MDK\\RTX_CM.uvprojx</b> as shown below. 
1424 Refer to <b><a class=el href="http://www.keil.com/support/man/docs/uv4/uv4_ut_pclint_validation.htm" target="_blank">Setup for PC-Lint</a></b> for more information.
1425
1426 \image html "PC-Lint.png" "Running PC-Lint within MDK - uVision"
1427
1428 The PC-Lint configuration uses the following Options under <b>Tools - PC-Lint Setup...</b>:
1429  - Config File: co-ARMCC-6.lnt (20-Mar-2017) with additional options:
1430 \code
1431    +rw(__restrict)
1432    -esym(526,__builtin_*) -esym(628,__builtin_*)
1433    -sem(__builtin_clz, pure)
1434    +doffsetof(t,m)=((size_t)&((t*)0)->m) -emacro((413,923,9078),offsetof)
1435    -ecall(534,__disable_irq)
1436 \endcode
1437  - Included Project Information: 
1438    - Enable: Add 'Include' paths
1439    - Enable: Add 'Software Packs' paths
1440    - Enable: Verify 'Software Packs' includes
1441    - Enable: Add 'Preprocessor' symbols
1442    - Enable: Add 'Define' symbols
1443  - MISRA  Rules Setup and Configuration: 
1444    - MISRQ_C_2012_Config.lnt; all rules enabled
1445    - includes definition file: au-misra3.lnt (12-Jun-2014)
1446  - Additional Lint Commands (for both single and mutiple files):
1447 \code
1448    - emacro(835,osRtxConfigPrivilegedMode)
1449 \endcode
1450
1451 The C source code is annotated with PC-Lint control comments to allows MISRA deviations.
1452 These deviations with the underlaying design decisions are described in the following.
1453    
1454 Deviations
1455 ----------
1456
1457 The RTX source code has the following deviations from MISRA:
1458   - \ref MISRA_1
1459   - \ref MISRA_2
1460   - \ref MISRA_3
1461   - \ref MISRA_4
1462   - \ref MISRA_5
1463   - \ref MISRA_6
1464   - \ref MISRA_7
1465   - \ref MISRA_8
1466   - \ref MISRA_9
1467   - \ref MISRA_10
1468   - \ref MISRA_11
1469   - \ref MISRA_12
1470   - \ref MISRA_13
1471
1472 All source code deviations are clearly marked and in summary these deviations affect the following MISRA rules:
1473  - [MISRA 2012 Directive  4.9,  advisory]: A function should be used in preference to a function-like macro where yet are interchangeable
1474  - [MISRA 2012 Rule       1.3,  required]: There shall be no occurrence of undefined or critical unspecified behavior
1475  - [MISRA 2012 Rule      10.3,  required]: Expression assigned to a narrower or different essential type
1476  - [MISRA 2012 Rule      10.5,  advisory]: Impermissible cast; cannot cast from 'essentially unsigned' to 'essentially enum\<i\>'
1477  - [MISRA 2012 Rule      11.1,  required]: Conversions shall not be performed between a pointer to a function and any other type
1478  - [MISRA 2012 Rule      11.3,  required]: A cast shall not be performed between a pointer to object type and a pointer to a different object type
1479  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1480  - [MISRA 2012 Rule      11.5,  advisory]: A conversion should not be performed from pointer to void into pointer to object
1481  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1482  - [MISRA 2012 Rule      15.5,  advisory]: A function should have a single point of exit at the end
1483  - [MISRA 2012 Rule      20.10, advisory]: The # and ## preprocessor operators should not be used
1484
1485 In the following all deviations are described in detail.
1486
1487 \section MISRA_1 [MISRA Note 1]: Return statements for parameter checking
1488
1489 Return statements are used at the beginning of several functions to validate parameter values and object states.
1490 The function returns immediately without any side-effects and typically an error status is set. This structure
1491 keeps the source code better structured and easier to understand.
1492
1493 This design decision implies the following MISRA deviation:
1494  - [MISRA 2012 Rule      15.5,  advisory]: A function should have a single point of exit at the end
1495
1496 All locations in the source code are marked with: 
1497 \code
1498   //lint -e{904} "Return statement before end of function" [MISRA Note 1]
1499 \endcode 
1500
1501
1502 \section MISRA_2 [MISRA Note 2]: Object identifiers are void pointers
1503
1504 CMSIS-RTOS is independant of an underlying RTOS implementation. The object idenifiers are therefore defined as void pointers to:
1505   - allow application programs that are agnostic from an underlying RTOS implementation.
1506   - avoid accidently accesses an RTOS control block from an application program.
1507
1508 This design decisions imply the following MISRA deviations:
1509  - [MISRA 2012 Rule      11.3,  required]: A cast shall not be performed between a pointer to object type and a pointer to a different object type
1510  - [MISRA 2012 Rule      11.5,  advisory]: A conversion should not be performed from pointer to void into pointer to object
1511
1512 All locations in the source code are marked with: 
1513 \code
1514   //lint -e{9079} -e{9087} "cast from pointer to void to pointer to object type" [MISRA Note 2]
1515 \endcode 
1516
1517 In the RTX5 implementation the requried pointer conversions are implemented in the header file rtx_lib.h with the following inline functions:
1518
1519 \code
1520 osRtxThread_t       *osRtxThreadId (osThread_t thread_id);
1521 osRtxTimer_t        *osRtxTimerId (osTimer_t timer_id);
1522 osRtxEventFlags_t   *osRtxEventFlagsId (osEventFlags_t ef_id);
1523 osRtxMutex_t        *osRtxMutexId (osMutex_t mutex_id);
1524 osRtxSemaphore_t    *osRtxSemaphoreId (osSemaphore_t semaphore_id);
1525 osRtxMemoryPool_t   *osRtxMemoryPoolId (osMemoryPoolId_t mp_id);
1526 osRtxMessageQueue_t *osRtxMessageQueueId(osMessageQueueId_t mq_id);
1527 \endcode
1528
1529 \section MISRA_3 [MISRA Note 3]: Conversion to unified object control blocks
1530
1531 RTX uses a unified object control block structure that contains common object members.
1532 The unified control blocks use a fixed layout at the beginning of the sturcture and starts always with an object identifier.
1533 This allows common object functions that receive a pointer to a unified object control block and reference only the
1534 pointer or the members in the fixed layout. Using common object functions and data (for example the ISR queue) reduces 
1535 code complexity and keeps the source code better structured.  Refer also to \ref MISRA_4
1536
1537 This design decisions imply the following MISRA deviations:
1538  - [MISRA 2012 Rule      11.3,  required]: A cast shall not be performed between a pointer to object type and a pointer to a different object type
1539  - [MISRA 2012 Rule      11.5,  advisory]: A conversion should not be performed from pointer to void into pointer to object
1540
1541 All locations in the source code are marked with: 
1542 \code
1543   //lint -e{9079} -e{9087} "cast from pointer to void to pointer to object type" [MISRA Note 3]
1544 \endcode 
1545
1546
1547 In the RTX5 implementation the requried pointer conversions are implemented in the header file \em rtx_lib.h with the following inline function:
1548
1549 \code
1550 osRtxObject_t *osRtxObject (void *object);
1551 \endcode
1552
1553
1554 \section MISRA_4 [MISRA Note 4]: Conversion from unified object control blocks
1555
1556 RTX uses a unified object control block structure that contains common object members. Refer to \ref MISRA_3 for more information.
1557 To process specifc control block data, pointer conversions are required.
1558
1559 This design decisions imply the following MISRA deviations:
1560  - [MISRA 2012 Rule       1.3,  required]: There shall be no occurrence of undefined or critical unspecified behavior
1561  - [MISRA 2012 Rule      11.3,  required]: A cast shall not be performed between a pointer to object type and a pointer to a different object type
1562 In addition PC-Lint issues:
1563  - Info  826: Suspicious pointer-to-pointer conversion (area too small)
1564
1565 All locations in the source code are marked with: 
1566 \code
1567   //lint -e{740} -e{826} -e{9087} "cast from pointer to generic object to specific object" [MISRA Note 4]
1568 \endcode 
1569
1570 In the RTX5 source code the requried pointer conversions are implemented in the header file \em rtx_lib.h with the following inline functions:
1571
1572 \code
1573 osRtxThread_t       *osRtxThreadObject (osRtxObject_t *object);
1574 osRtxTimer_t        *osRtxTimerObject (osRtxObject_t *object);
1575 osRtxEventFlags_t   *osRtxEventFlagsObject (osRtxObject_t *object);
1576 osRtxMutex_t        *osRtxMutexObject (osRtxObject_t *object);
1577 osRtxSemaphore_t    *osRtxSemaphoreObject (osRtxObject_t *object);
1578 osRtxMemoryPool_t   *osRtxMemoryPoolObject (osRtxObject_t *object);
1579 osRtxMessageQueue_t *osRtxMessageQueueObject (osRtxObject_t *object);
1580 osRtxMessage_t      *osRtxMessageObject (osRtxObject_t *object);
1581 \endcode
1582
1583 \section MISRA_5 [MISRA Note 5]: Conversion to object types
1584
1585 The RTX5 kernel has common memory management functions that use void pointers. These memory allocation fuctions returns 
1586 a void pointer which is correctly aligned for object types.
1587
1588 This design decision implies the following MISRA deviations:
1589  - [MISRA 2012 Rule      11.5,  advisory]: A conversion should not be performed from pointer to void into pointer to object
1590
1591 All locations in the source code are marked with: 
1592 \code
1593   //lint -e{9079} "conversion from pointer to void to pointer to other type" [MISRA Note 5]
1594 \endcode 
1595
1596 Code example:
1597
1598 \code 
1599   os_thread_t  *thread;
1600    :
1601   //lint -e{9079} "conversion from pointer to void to pointer to other type" [MISRA Note 5]
1602   thread = osRtxMemoryPoolAlloc(osRtxInfo.mpi.thread);
1603 \endcode
1604
1605
1606
1607 \section MISRA_6 [MISRA Note 6]: Conversion from user provided storage
1608
1609 CMSIS-RTOS2 and RTX5 support user provided storage for object control blocks, stack, and data storage.
1610 The API uses void pointers to define the location of this user provided storage. It is therefore
1611 required to cast the void pointer to underlying storage types. Alignment restrictions of user provided storage 
1612 are checked before accessing memory. Refer also to \ref MISRA_7.
1613
1614 This design decisions imply the following MISRA deviations:
1615  - [MISRA 2012 Rule      11.3,  required]: A cast shall not be performed between a pointer to object type and a pointer to a different object type
1616  - [MISRA 2012 Rule      11.5,  advisory]: A conversion should not be performed from pointer to void into pointer to object
1617
1618 All locations in the source code are marked with: 
1619 \code
1620   //lint -e{9079} "conversion from pointer to void to pointer to other type" [MISRA Note 6]
1621 \endcode 
1622
1623 Code example:
1624 \code
1625 static osTimerId_t svcRtxTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) {
1626   os_timer_t *timer;
1627     :
1628   if (attr != NULL) {
1629     :
1630     //lint -e{9079} "conversion from pointer to void to pointer to other type" [MISRA Note 6]
1631     timer = attr->cb_mem;
1632         :
1633 \endcode        
1634
1635 \section MISRA_7 [MISRA Note 7]: Check for proper pointer alignment
1636
1637 RTX5 verifies the alignment of user provided storage for object control blocks, stack, and data storage.
1638 Refer also to \ref MISRA_6 for more information.
1639
1640 This design decision implies the following MISRA deviations:
1641  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1642  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1643
1644 All locations in the source code are marked with: 
1645 \code
1646   //lint -e(923) -e(9078) "cast from pointer to unsigned int" [MISRA Note 7]
1647 \endcode
1648
1649 Code example:
1650 \code
1651 static osThreadId_t svcRtxThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
1652     :
1653   void         *stack_mem;
1654     :
1655   if (stack_mem != NULL) {
1656     //lint -e(923) -e(9078) "cast from pointer to unsigned int" [MISRA Note 7]
1657     if ((((uint32_t)stack_mem & 7U) != 0U) || (stack_size == 0U)) {
1658     :
1659 \endcode        
1660
1661 \section MISRA_8 [MISRA Note 8]: Memory allocation management
1662
1663 RTX5 implements memory allocation functions which require pointer arithmetic to manage memory.
1664 The structure with the type \em mem_block_t that is used to menage memory allocation blocks is defined in \em rtx_memory.c
1665
1666 This design decision implies the following MISRA deviations:
1667  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1668  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1669
1670 All locations in the source code are marked with: 
1671 \code
1672   //lint -e(923) -e(9078) "cast from pointer to unsigned int" [MISRA Note 8]
1673 \endcode
1674
1675 The required pointer arithmetic is implemented in \em rtx_memory.c with the following function:
1676 \code
1677 __STATIC_INLINE mem_block_t *MemBlockPtr (void *mem, uint32_t offset) {
1678   uint32_t     addr;
1679   mem_block_t *ptr;
1680
1681   //lint --e{923} --e{9078} "cast between pointer and unsigned int" [MISRA Note 8]
1682   addr = (uint32_t)mem + offset;
1683   ptr  = (mem_block_t *)addr;
1684
1685   return ptr;
1686 }
1687 \endcode
1688
1689 \section MISRA_9 [MISRA Note 9]: Pointer conversions for register access
1690
1691 The CMSIS-Core peripheral register blocks are accessed using a structure. The memory address of this structure 
1692 is specified as unsigned integer number. Pointer conversions are required to access the specific registers.
1693
1694 This design decision implies the following MISRA deviations:
1695  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1696  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1697
1698 All locations in the source code are marked with: 
1699 \code
1700   //lint -emacro((923,9078),SCB) "cast from unsigned long to pointer" [MISRA Note 9]
1701 \endcode
1702
1703
1704 Code example:
1705 \code
1706 #define SCS_BASE  (0xE000E000UL)
1707 #define SCB      ((SCB_Type *)SCB_BASE)
1708 typedef struct {...} SCB_Type;
1709
1710 SCB->... = ...;
1711 \endcode
1712
1713 \section MISRA_10 [MISRA Note 10]: SVC calls use function-like macros
1714
1715 RTX5 is using SVC (Service Calls) to switch between thread mode (for user code execution) and handler mode (for RTOS kernel execution).
1716 The SVC function call mechanism is implemented with assembly instructions to construct the code for SVC.
1717 The source code uses C macros and are designed as C function-like macros to generate parameter passing
1718 for variables depending on macro parameters. An alternative replacement code would be complex.
1719 The C macros use multiple '##' operators however it has been verified that the order of evaluation is irrelevant 
1720 and result of macro expansion is always predictable.
1721
1722 This design decision implies the following MISRA deviations:
1723  - [MISRA 2012 Directive  4.9,  advisory]: A function should be used in preference to a function-like macro where yet are interchangeable
1724  - [MISRA 2012 Rule       1.3,  required]: There shall be no occurrence of undefined or critical unspecified behavior
1725  - [MISRA 2012 Rule      20.10, advisory]: The # and ## preprocessor operators should not be used
1726
1727 The relevant source code is in the file \em rtx_core_cm.h and is marked with: 
1728 \code
1729   //lint -save -e9023 -e9024 -e9026 "Function-like macros using '#/##'" [MISRA Note 10]
1730 \endcode
1731
1732
1733 \section MISRA_11 [MISRA Note 11]: SVC calls use assembly code
1734
1735 The SVC (Service Call) functions are constructed as a mix of C and inline assembly as it is required to access CPU registers
1736 for parameter passing. The function parameters are mapped to the CPU registers R0..R3 and SVC function number to 
1737 CPU register R12 (or R7). For assembly inter-working the function parameters are casted to unsigned int values.
1738
1739 The function return value after SVC call is mapped to the CPU register R0. Return value is casted from unsigned int 
1740 to the target value. 
1741
1742 It has been verified that this method has has no side-effects and is well defined.
1743
1744 This design decision implies the following MISRA deviations:
1745  - [MISRA 2012 Rule      10.3,  required]: Expression assigned to a narrower or different essential type
1746  - [MISRA 2012 Rule      10.5,  advisory]: Impermissible cast; cannot cast from 'essentially unsigned' to 'essentially enum\<i\>'
1747  - [MISRA 2012 Rule      11.1,  required]: Conversions shall not be performed between a pointer to a function and any other type
1748  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1749  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1750
1751 SVC functions are marked as library modules and not processed by PC-lint. The relevant source code is marked with: 
1752 \code
1753   //lint ++flb "Library Begin" [MISRA Note 11]
1754     :
1755   //lint --flb "Library End"
1756 \endcode
1757
1758 Code example:
1759 \code
1760 //  Service Calls definitions
1761 //lint ++flb "Library Begin" [MISRA Note 11]
1762 SVC0_1(Delay,      osStatus_t, uint32_t)
1763 SVC0_1(DelayUntil, osStatus_t, uint32_t)
1764 //lint --flb "Library End"
1765 \endcode
1766
1767 PC-lint does not process ASM input/output operand lists and therefore falsely identifies issues:
1768  - Last value assigned to variable not used
1769  - Symbol not subsequently referenced
1770 \todo: what has been done to mitigate that?
1771
1772
1773 \section MISRA_12 [MISRA Note 12]: Usage of exclusive access instructions
1774
1775 The RTX5 implementation uses the CPU instructions LDREX and STREX (when supported by the processor) to implement atomic operations.
1776 This atomic operations elimite the requirement for interrupt lock-outs. The atomic operations are implemented using 
1777 inline assembly.
1778
1779 PC-lint cannot process assembler instructions including the input/output operand lists and therefore falsely identifies issues:
1780  - Symbol not initialized
1781  - Symbol not subsequently referenced
1782  - Symbol not referenced
1783  - Pointer parameter could be declared as pointing to const
1784
1785 It has been verified that atomic operations have no side-effects and are well defined.
1786
1787 The functions that implement atomic instructions are marked as library modules and not processed by PC-lint. The relevant source code is marked with: 
1788 \code
1789   //lint ++flb "Library Begin" [MISRA Note 12]
1790     :
1791   //lint --flb "Library End"
1792 \endcode
1793
1794
1795 \section MISRA_13 [MISRA Note 13]: Usage of Event Recorder
1796
1797 The Event Recorder is a generic event logger and the related functions are called to record an event.
1798 The function parameters are 32-bit id, 32-bit values, pointer to void (data) and are recorded as 32-bit numbers.
1799 The parameters for the Event Recorder may require cast opertions to unsigned int which however has no side-effects 
1800 and is well defined. 
1801
1802 The return value indicates success or failure. There is no need to check the return value since no action is 
1803 taken when a Event Recorder function fail. The EventID macro (part of external Event Recorder) constructs the 
1804 ID based on input parameters which are shifted, masked with '&' and combined with '|'.
1805 Zero value input parameters are valid and cause zero used with '&' and '|'.
1806
1807 The usage of the Event Recorder implies the following MISRA deviations:
1808  - [MISRA 2012 Rule      11.1,  required]: Conversions shall not be performed between a pointer to a function and any other type
1809  - [MISRA 2012 Rule      11.4,  advisory]: A conversion should not be performed between a pointer to object and an integer type
1810  - [MISRA 2012 Rule      11.6,  required]: A cast shall not be performed between pointer to void and an arithmetic type
1811 In addition PC-Lint issues:
1812  - Info  835: A zero has been given as left argument to operator '&'
1813  - Info  845: The right argument to operator '|' is certain to be 0
1814
1815 The functions that call the Event Recorder are in the module \em rtx_evr.c and the related PC-Lint messages are disabled with:
1816 \code
1817   //lint -e923 -e9074 -e9078 -emacro((835,845),EventID) [MISRA Note 13]
1818 \endcode
1819
1820 */
1821
1822 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
1823 /**
1824 \page functionOverview Function Overview
1825
1826 CMSIS-RTOS2 provides multiple API interfaces:
1827   - \subpage rtos_api2 is the new C function interface that supports dynamic object creation and Armv8-M (Arm Cortex-M23,
1828     Cortex-M33 and Cortex-M35P).
1829   - <a class="el" href="../../RTOS/html/functionOverview.html">CMSIS-RTOS C API v1</a> is a C function API that is backward
1830     compatible with CMSIS-RTOS v1.
1831   - \subpage rtos_apicpp is a C++ class function API (future extension).
1832
1833 It is possible to intermix the different API variants in the same application and even in the same C/C++ source module.
1834 However, the functions of the <a class="el" href="../../RTOS/html/functionOverview.html">CMSIS-RTOS C API v1</a> may be deprecated in future versions of CMSIS-RTOS.
1835
1836 CMSIS-RTOS2 defines also a generic system timer interface that works across the supported Arm Cortex processors:
1837   - \subpage rtos_os_tick_api is the interface to a kernel system timer.
1838 */
1839
1840 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
1841 /**
1842 \page rtos_api2 CMSIS-RTOS C API v2
1843
1844 Overview of all CMSIS-RTOS C API v2 functions that are implemented in the \subpage cmsis_os2_h. 
1845
1846 \section rtos_api2_basics Common Design Concepts
1847
1848 All RTOS objects share a common design concept. The overall life-cycle of
1849 an object can be summarized as created -> in use -> destroyed.
1850
1851 <b>Create Objects</b>
1852
1853 An object is created by calling its `osXxxNew` function. The new function returns an identifier
1854 that can be used to operate with the new object. The actual state of an object is typically stored
1855 in an object specific control block. The memory layout (and size needed) for the control
1856 block is implementation specific. One should not make any specific assumptions about the control
1857 block. The control block layout might change and hence should be seen as an implementation
1858 internal detail.
1859
1860 In order to expose control about object specific options all `osXxxNew` functions provide an
1861 optional `attr` argument, which can be left as \token{NULL} by default. It takes a pointer to
1862 an object specific attribute structure, commonly containing the fields
1863  - `name` to attach a human readable name to the object for identification,
1864  - `attr_bits` to control object-specific options,
1865  - `cb_mem` to provide memory for the control block manually, and
1866  - `cb_size` to quantify the memory size provided for the control block.
1867
1868 The `name` attribute is only used for object identification, e.g. using RTOS-aware debugging. The
1869 attached string is not used for any other purposes internally.
1870
1871 The `cb_mem` and `cb_size` attributes can be used to provide memory for the control block manually
1872 instead of relying on the implementation internal memory allocation. One has to assure that the
1873 amount of memory pointed to by `cb_mem` is sufficient for the objects control block structure. If
1874 the size given as `cb_size` is not sufficient the `osXxxNew` function returns with an error, i.e.
1875 returning \token{NULL}. Furthermore providing control block memory manually is less portable. Thus
1876 one has to take care about implementation specific alignment and placement requirements for instance.
1877 Refer to \ref CMSIS_RTOS_MemoryMgmt for further details.
1878
1879 <b>Object Usage</b>
1880
1881 After an object has been created successfully it can be used until it is destroyed. The actions
1882 defined for an object depends on its type. Commonly all the `osXxxDoSomething` access function
1883 require the reference to the object to work with as the first `xxx_id` parameter.
1884
1885 The access function can be assumed to apply some sort of sanity checking on the id parameter. So
1886 that it is assured one cannot accidentally call an access function with a \token{NULL} object
1887 reference. Furthermore the concrete object type is verified, i.e. one cannot call access functions
1888 of one object type with a reference to another object type.
1889
1890 All further parameter checks applied are either object and action specific or may even be implementation
1891 specific. Thus one should always check action function return values for `osErrorParameter` to asure the
1892 provided arguments were accepted.
1893
1894 As a rule of thumb only non-blocking access function can be used from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines" (ISR).
1895 This incorporates `osXxxWait` functions (and similar) limited to be called with parameter `timeout`
1896 set to \token{0}, i.e. usage of try-semantics.
1897
1898 <b>Object Destruction</b>
1899
1900 Objects that are not needed anymore can be destructed on demand to free the control block memory. Objects
1901 are not destructed implicitly. Thus one can assume an object id to be valid until `osXxxDelete` is called
1902 explicitly. The delete function finally frees the control block memory. In case of user provided control
1903 block memory, see above, the memory must be freed manually as well. 
1904
1905 The only exception one has to take care of are Threads which do not have an explicit `osThreadDelete` function.
1906 Threads can either be `detached` or `joinable`. Detached threads are automatically destroyed on termination,
1907 i.e. call to \ref osThreadTerminate or \ref osThreadExit or return from thread function. On the other hand joinable
1908 threads are kept alive until one explicitly calls \ref osThreadJoin.
1909
1910 \section rtos_api2_functions Function Reference
1911
1912  - \ref CMSIS_RTOS_KernelCtrl
1913    - \ref osKernelGetInfo : \copybrief osKernelGetInfo
1914    - \ref osKernelGetState : \copybrief osKernelGetState
1915    - \ref osKernelGetSysTimerCount : \copybrief osKernelGetSysTimerCount
1916    - \ref osKernelGetSysTimerFreq : \copybrief osKernelGetSysTimerFreq
1917    - \ref osKernelInitialize : \copybrief osKernelInitialize
1918    - \ref osKernelLock : \copybrief osKernelLock
1919    - \ref osKernelUnlock : \copybrief osKernelUnlock
1920    - \ref osKernelRestoreLock : \copybrief osKernelRestoreLock
1921    - \ref osKernelResume : \copybrief osKernelResume
1922    - \ref osKernelStart : \copybrief osKernelStart
1923    - \ref osKernelSuspend : \copybrief osKernelSuspend
1924    - \ref osKernelGetTickCount : \copybrief osKernelGetTickCount
1925    - \ref osKernelGetTickFreq : \copybrief osKernelGetTickFreq
1926
1927  - \ref CMSIS_RTOS_ThreadMgmt
1928    - \ref osThreadDetach : \copybrief osThreadDetach
1929    - \ref osThreadEnumerate : \copybrief osThreadEnumerate
1930    - \ref osThreadExit : \copybrief osThreadExit
1931    - \ref osThreadGetCount : \copybrief osThreadGetCount
1932    - \ref osThreadGetId : \copybrief osThreadGetId
1933    - \ref osThreadGetName : \copybrief osThreadGetName
1934    - \ref osThreadGetPriority : \copybrief osThreadGetPriority
1935    - \ref osThreadGetStackSize : \copybrief osThreadGetStackSize
1936    - \ref osThreadGetStackSpace : \copybrief osThreadGetStackSpace
1937    - \ref osThreadGetState : \copybrief osThreadGetState
1938    - \ref osThreadJoin : \copybrief osThreadJoin
1939    - \ref osThreadNew : \copybrief osThreadNew
1940    - \ref osThreadResume : \copybrief osThreadResume
1941    - \ref osThreadSetPriority : \copybrief osThreadSetPriority
1942    - \ref osThreadSuspend : \copybrief osThreadSuspend
1943    - \ref osThreadTerminate : \copybrief osThreadTerminate
1944    - \ref osThreadYield : \copybrief osThreadYield
1945
1946  - \ref CMSIS_RTOS_ThreadFlagsMgmt
1947    - \ref osThreadFlagsSet : \copybrief osThreadFlagsSet
1948    - \ref osThreadFlagsClear : \copybrief osThreadFlagsClear
1949    - \ref osThreadFlagsGet : \copybrief osThreadFlagsGet
1950    - \ref osThreadFlagsWait : \copybrief osThreadFlagsWait
1951
1952  - \ref CMSIS_RTOS_EventFlags
1953    - \ref osEventFlagsGetName : \copybrief osEventFlagsGetName
1954    - \ref osEventFlagsNew : \copybrief osEventFlagsNew
1955    - \ref osEventFlagsDelete : \copybrief osEventFlagsDelete
1956    - \ref osEventFlagsSet : \copybrief osEventFlagsSet
1957    - \ref osEventFlagsClear : \copybrief osEventFlagsClear
1958    - \ref osEventFlagsGet : \copybrief osEventFlagsGet
1959    - \ref osEventFlagsWait : \copybrief osEventFlagsWait
1960
1961  - \ref CMSIS_RTOS_Wait
1962    - \ref osDelay : \copybrief osDelay
1963    - \ref osDelayUntil : \copybrief osDelayUntil
1964
1965  - \ref CMSIS_RTOS_TimerMgmt
1966    - \ref osTimerDelete : \copybrief osTimerDelete
1967    - \ref osTimerGetName : \copybrief osTimerGetName
1968    - \ref osTimerIsRunning : \copybrief osTimerIsRunning
1969    - \ref osTimerNew : \copybrief osTimerNew
1970    - \ref osTimerStart : \copybrief osTimerStart
1971    - \ref osTimerStop : \copybrief osTimerStop
1972
1973  - \ref CMSIS_RTOS_MutexMgmt
1974    - \ref osMutexAcquire : \copybrief osMutexAcquire
1975    - \ref osMutexDelete : \copybrief osMutexDelete
1976    - \ref osMutexGetName : \copybrief osMutexGetName
1977    - \ref osMutexGetOwner : \copybrief osMutexGetOwner
1978    - \ref osMutexNew : \copybrief osMutexNew
1979    - \ref osMutexRelease : \copybrief osMutexRelease
1980
1981  - \ref CMSIS_RTOS_SemaphoreMgmt
1982    - \ref osSemaphoreAcquire : \copybrief osSemaphoreAcquire
1983    - \ref osSemaphoreDelete : \copybrief osSemaphoreDelete
1984    - \ref osSemaphoreGetCount : \copybrief osSemaphoreGetCount
1985    - \ref osSemaphoreGetName : \copybrief osSemaphoreGetName
1986    - \ref osSemaphoreNew : \copybrief osSemaphoreNew
1987    - \ref osSemaphoreRelease : \copybrief osSemaphoreRelease
1988
1989  - \ref CMSIS_RTOS_PoolMgmt
1990    - \ref osMemoryPoolAlloc : \copybrief osMemoryPoolAlloc
1991    - \ref osMemoryPoolDelete : \copybrief osMemoryPoolDelete
1992    - \ref osMemoryPoolFree : \copybrief osMemoryPoolFree
1993    - \ref osMemoryPoolGetBlockSize : \copybrief osMemoryPoolGetBlockSize
1994    - \ref osMemoryPoolGetCapacity : \copybrief osMemoryPoolGetCapacity
1995    - \ref osMemoryPoolGetCount : \copybrief osMemoryPoolGetCount
1996    - \ref osMemoryPoolGetName : \copybrief osMemoryPoolGetName
1997    - \ref osMemoryPoolGetSpace : \copybrief osMemoryPoolGetSpace
1998    - \ref osMemoryPoolNew : \copybrief osMemoryPoolNew
1999
2000  - \ref CMSIS_RTOS_Message
2001    - \ref osMessageQueueDelete : \copybrief osMessageQueueDelete
2002    - \ref osMessageQueueGet : \copybrief osMessageQueueGet
2003    - \ref osMessageQueueGetCapacity : \copybrief osMessageQueueGetCapacity
2004    - \ref osMessageQueueGetCount : \copybrief osMessageQueueGetCount
2005    - \ref osMessageQueueGetMsgSize : \copybrief osMessageQueueGetMsgSize
2006    - \ref osMessageQueueGetName : \copybrief osMessageQueueGetName
2007    - \ref osMessageQueueGetSpace : \copybrief osMessageQueueGetSpace
2008    - \ref osMessageQueueNew : \copybrief osMessageQueueNew
2009    - \ref osMessageQueuePut : \copybrief osMessageQueuePut
2010    - \ref osMessageQueueReset : \copybrief osMessageQueueReset
2011  
2012 \todo restructure
2013  - \ref rtx5_specific
2014    - \ref osRtxErrorNotify : \copybrief osRtxErrorNotify
2015    - \ref osRtxIdleThread : \copybrief osRtxIdleThread
2016
2017 The following CMSIS-RTOS C API v2 functions can be called from threads and \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines"
2018 (ISR):
2019    - \ref osKernelGetInfo, \ref osKernelGetState,
2020      \ref osKernelGetTickCount, \ref osKernelGetTickFreq, \ref osKernelGetSysTimerCount, \ref osKernelGetSysTimerFreq
2021    - \ref osThreadGetId, \ref osThreadFlagsSet
2022    - \ref osEventFlagsSet, \ref osEventFlagsClear, \ref osEventFlagsGet, \ref osEventFlagsWait
2023    - \ref osSemaphoreAcquire, \ref osSemaphoreRelease, \ref osSemaphoreGetCount
2024    - \ref osMemoryPoolAlloc, \ref osMemoryPoolFree, \ref osMemoryPoolGetCapacity, \ref osMemoryPoolGetBlockSize,
2025      \ref osMemoryPoolGetCount, \ref osMemoryPoolGetSpace
2026    - \ref osMessageQueuePut, \ref osMessageQueueGet, \ref osMessageQueueGetCapacity, \ref osMessageQueueGetMsgSize,
2027      \ref osMessageQueueGetCount, \ref osMessageQueueGetSpace
2028 */
2029
2030
2031 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2032 /**
2033 \page rtos_apicpp CMSIS-RTOS C++ API
2034
2035 A C++11/C++14 interface is planned for the future.
2036 */
2037
2038 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2039 /**
2040 \page rtos_os_tick_api OS Tick API
2041
2042 The CMSIS OS Tick API may be used by an RTOS implementation to be easily potable across the different Cortex-M and Cortex-A processors.
2043 It provides a generic interface to a kernel system tick timer and defines the following functions:
2044
2045  - The Reference for \ref CMSIS_RTOS_TickAPI provides details about these functions:
2046    - \ref OS_Tick_Setup : \copybrief OS_Tick_Setup
2047    - \ref OS_Tick_Enable : \copybrief OS_Tick_Enable
2048    - \ref OS_Tick_Disable : \copybrief OS_Tick_Disable
2049    - \ref OS_Tick_AcknowledgeIRQ : \copybrief OS_Tick_AcknowledgeIRQ
2050    - \ref OS_Tick_GetIRQn : \copybrief OS_Tick_GetIRQn
2051    - \ref OS_Tick_GetClock : \copybrief OS_Tick_GetClock
2052    - \ref OS_Tick_GetInterval : \copybrief OS_Tick_GetInterval
2053    - \ref OS_Tick_GetCount : \copybrief OS_Tick_GetCount
2054    - \ref OS_Tick_GetOverflow : \copybrief OS_Tick_GetOverflow
2055
2056 */
2057
2058
2059 /* ======================================================================================================================== */
2060 // Group creation for Reference 
2061 /* 
2062 \addtogroup CMSIS_RTOS1 CMSIS-RTOS API v1
2063 \brief This section describes the CMSIS-RTOS API v1. 
2064 \details 
2065 The CMSIS-RTOS is a generic API layer that interfaces to an existing RTOS kernel.
2066
2067 CMSIS-RTOS2 provides an translation layer for the
2068 <a class="el" href="../../RTOS/html/index.html">CMSIS-RTOS API v1</a> that simplifies migration.
2069
2070 Refer to the <a class="el" href="../../RTOS/html/modules.html">Reference</a> guide of the CMSIS-RTOS API v1 for details.
2071 */
2072
2073 // Group creation for Reference 
2074 /** 
2075 \addtogroup CMSIS_RTOS CMSIS-RTOS API v2
2076 \brief C interface of \ref rtos_api2 defined in cmsis_os2.h
2077 \details 
2078 The CMSIS-RTOS2 is a generic API layer that interfaces to an RTOS kernel.
2079
2080 The complete API interface is defined in the \ref cmsis_os2_h. When using dynamic memory allocation for objects, source code
2081 or libraries require no modifications when using on a different CMSIS-RTOS2 implementation.
2082
2083 Refer to \ref rtos_api2_basics for further details.
2084 */
2085
2086 /**
2087 \addtogroup CMSIS_RTOS_MemoryMgmt Memory Management
2088 \ingroup CMSIS_RTOS
2089 \brief Information about memory management possibilities
2090 \details
2091 The \ref CMSIS_RTOS offers two options for memory management the user can choose. For object storage one can either use
2092  - \ref CMSIS_RTOS_MemoryMgmt_Automatic (fully portable), or
2093  - \ref CMSIS_RTOS_MemoryMgmt_Manual (implementation specific).
2094  
2095 In order to affect the memory allocation scheme all RTOS objects that can be created on request, i.e. those having a `osXxxNew`
2096 function, accept an optional `osXxxAttr_t attr` argument on creation. As a rule of thumb the object attributes at least have
2097 members to assign custom control block memory, i.e. `cb_mem` and `cb_size` members. By default, i.e. `attr` is `NULL`
2098 or `cb_mem` is `NULL`, \ref CMSIS_RTOS_MemoryMgmt_Automatic is used. Providing a pointer to user memory in `cb_mem` switches
2099 to \ref CMSIS_RTOS_MemoryMgmt_Manual.
2100
2101 \note For detailed information about memory allocation strategies provided in RTX5 refer to \ref MemoryAllocation.
2102
2103 \section CMSIS_RTOS_MemoryMgmt_Automatic Automatic Dynamic Allocation
2104
2105 The automatic allocation is the default and viable for many use-cases. Moreover it is fully portable across different
2106 implementations of the \ref CMSIS_RTOS. The common drawback of dynamic memory allocation is the possibility of memory
2107 fragmentation and exhaustion. Given that all needed objects are created once upon system initialization and never
2108 deleted at runtime this class of runtime failures can be prevented, though.
2109
2110 The actual allocation strategy used is implementation specific, i.e. whether global heap or preallocated memory pools are used.
2111
2112 <b> Code Example:</b> 
2113 \code{.c}
2114 #include "cmsis_os2.h"                          // implementation agnostic
2115   
2116 osMutexId_t mutex_id;
2117 osMutexId_t mutex2_id;
2118   
2119 const osMutexAttr_t Thread_Mutex_attr = {
2120   "myThreadMutex",                              // human readable mutex name
2121   osMutexRecursive | osMutexPrioInherit,        // attr_bits
2122   NULL,                                         // memory for control block (default)
2123   0U                                            // size for control block (default)
2124 };
2125   
2126 void CreateMutex (void)  {
2127   mutex_id = osMutexNew(NULL);                  // use default values for all attributes
2128   mutex2_id = osMutexNew(&Thread_Mutex_attr);   // use attributes from defined structure
2129   :
2130 }
2131 \endcode
2132
2133 The Mutexes in this example are created using automatic memory allocation.
2134
2135 \section CMSIS_RTOS_MemoryMgmt_Manual Manual User-defined Allocation
2136
2137 One can get fine grained control over memory allocation by providing user-defined memory.
2138 The actual requirements such user-defined memory are implementation specific. Thus one
2139 needs to carefully refer to the size and alignment rules of the implementation used, e.g.
2140 for RTX see \ref StaticObjectMemory.
2141
2142 <b> Code Example:</b> 
2143 \code{.c}
2144 #include "rtx_os.h"                             // implementation specific
2145   
2146 osMutexId_t mutex_id;
2147   
2148 static uint32_t mutex_cb[osRtxMutexCbSize/4U];  // implementation specific
2149   
2150 const osMutexAttr_t Thread_Mutex_attr = {
2151   "myThreadMutex",                              // human readable mutex name
2152   osMutexRecursive | osMutexPrioInherit,        // attr_bits
2153   mutex_cb,                                     // memory for control block (user-defined)
2154   sizeof(mutex_cb)                              // size for control block (user-defined)
2155 };
2156   
2157 void CreateMutex (void)  {
2158   mutex_id = osMutexNew(&Thread_Mutex_attr);    // use attributes from defined structure
2159   :
2160 }
2161 \endcode
2162
2163 The above example uses user-defined memory for the mutex control block. Depending on the actual
2164 implementation used one needs to include the specific header file, `rtx_os.h` in this case.
2165
2166 */
2167
2168 // Group creation for Reference 
2169 /** 
2170 \addtogroup CMSIS_RTOS CMSIS-RTOS API v2
2171 \brief C interface of \ref rtos_api2 defined in <b>%cmsis_os2.h</b>
2172 \details 
2173 The CMSIS-RTOS2 is a generic API layer that interfaces to an RTOS kernel.
2174
2175 The complete API interface is defined in the \ref cmsis_os2_h. When using dynamic memory allocation for objects, source code
2176 or libraries require no modifications when using on a different CMSIS-RTOS2 implementation.
2177
2178 Refer to \ref rtos_api2_basics for further details.
2179 */
2180