473 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			473 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2013-2019 Arm Limited. All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Licensed under the Apache License, Version 2.0 (the License); you may
							 | 
						||
| 
								 | 
							
								 * not use this file except in compliance with the License.
							 | 
						||
| 
								 | 
							
								 * You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Unless required by applicable law or agreed to in writing, software
							 | 
						||
| 
								 | 
							
								 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
							 | 
						||
| 
								 | 
							
								 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
							 | 
						||
| 
								 | 
							
								 * See the License for the specific language governing permissions and
							 | 
						||
| 
								 | 
							
								 * limitations under the License.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * -----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Project:     CMSIS-RTOS RTX
							 | 
						||
| 
								 | 
							
								 * Title:       RTX OS definitions
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * -----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#ifndef RTX_OS_H_
							 | 
						||
| 
								 | 
							
								#define RTX_OS_H_
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#include <stdint.h>
							 | 
						||
| 
								 | 
							
								#include <stddef.h>
							 | 
						||
| 
								 | 
							
								#include "cmsis_os2.h"
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#ifdef  __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C"
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Kernel Information
							 | 
						||
| 
								 | 
							
								#define osRtxVersionAPI      20010003   ///< API version (2.1.3)
							 | 
						||
| 
								 | 
							
								#define osRtxVersionKernel   50050002   ///< Kernel version (5.5.2)
							 | 
						||
| 
								 | 
							
								#define osRtxKernelId     "RTX V5.5.2"  ///< Kernel identification string
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Common definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Object Identifier definitions
							 | 
						||
| 
								 | 
							
								#define osRtxIdInvalid          0x00U
							 | 
						||
| 
								 | 
							
								#define osRtxIdThread           0xF1U
							 | 
						||
| 
								 | 
							
								#define osRtxIdTimer            0xF2U
							 | 
						||
| 
								 | 
							
								#define osRtxIdEventFlags       0xF3U
							 | 
						||
| 
								 | 
							
								#define osRtxIdMutex            0xF5U
							 | 
						||
| 
								 | 
							
								#define osRtxIdSemaphore        0xF6U
							 | 
						||
| 
								 | 
							
								#define osRtxIdMemoryPool       0xF7U
							 | 
						||
| 
								 | 
							
								#define osRtxIdMessage          0xF9U
							 | 
						||
| 
								 | 
							
								#define osRtxIdMessageQueue     0xFAU
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Object Flags definitions
							 | 
						||
| 
								 | 
							
								#define osRtxFlagSystemObject   0x01U
							 | 
						||
| 
								 | 
							
								#define osRtxFlagSystemMemory   0x02U
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Kernel definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Kernel State definitions
							 | 
						||
| 
								 | 
							
								#define osRtxKernelInactive             ((uint8_t)osKernelInactive)
							 | 
						||
| 
								 | 
							
								#define osRtxKernelReady                ((uint8_t)osKernelReady)
							 | 
						||
| 
								 | 
							
								#define osRtxKernelRunning              ((uint8_t)osKernelRunning)
							 | 
						||
| 
								 | 
							
								#define osRtxKernelLocked               ((uint8_t)osKernelLocked)
							 | 
						||
| 
								 | 
							
								#define osRtxKernelSuspended            ((uint8_t)osKernelSuspended)
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Thread definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Thread State definitions (extending osThreadState)
							 | 
						||
| 
								 | 
							
								#define osRtxThreadStateMask            0x0FU
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#define osRtxThreadInactive             ((uint8_t)osThreadInactive)
							 | 
						||
| 
								 | 
							
								#define osRtxThreadReady                ((uint8_t)osThreadReady)
							 | 
						||
| 
								 | 
							
								#define osRtxThreadRunning              ((uint8_t)osThreadRunning)
							 | 
						||
| 
								 | 
							
								#define osRtxThreadBlocked              ((uint8_t)osThreadBlocked)
							 | 
						||
| 
								 | 
							
								#define osRtxThreadTerminated           ((uint8_t)osThreadTerminated)
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingDelay         ((uint8_t)(osRtxThreadBlocked | 0x10U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingJoin          ((uint8_t)(osRtxThreadBlocked | 0x20U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingThreadFlags   ((uint8_t)(osRtxThreadBlocked | 0x30U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingEventFlags    ((uint8_t)(osRtxThreadBlocked | 0x40U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingMutex         ((uint8_t)(osRtxThreadBlocked | 0x50U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingSemaphore     ((uint8_t)(osRtxThreadBlocked | 0x60U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingMemoryPool    ((uint8_t)(osRtxThreadBlocked | 0x70U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingMessageGet    ((uint8_t)(osRtxThreadBlocked | 0x80U))
							 | 
						||
| 
								 | 
							
								#define osRtxThreadWaitingMessagePut    ((uint8_t)(osRtxThreadBlocked | 0x90U))
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Thread Flags definitions
							 | 
						||
| 
								 | 
							
								#define osRtxThreadFlagDefStack 0x10U   ///< Default Stack flag
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Stack Marker definitions
							 | 
						||
| 
								 | 
							
								#define osRtxStackMagicWord     0xE25A2EA5U ///< Stack Magic Word (Stack Base)
							 | 
						||
| 
								 | 
							
								#define osRtxStackFillPattern   0xCCCCCCCCU ///< Stack Fill Pattern 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Thread Control Block
							 | 
						||
| 
								 | 
							
								typedef struct osRtxThread_s {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t                       state;  ///< Object State
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                        attr;  ///< Object Attributes
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  struct osRtxThread_s   *thread_next;  ///< Link pointer to next Thread in Object list
							 | 
						||
| 
								 | 
							
								  struct osRtxThread_s   *thread_prev;  ///< Link pointer to previous Thread in Object list
							 | 
						||
| 
								 | 
							
								  struct osRtxThread_s    *delay_next;  ///< Link pointer to next Thread in Delay list
							 | 
						||
| 
								 | 
							
								  struct osRtxThread_s    *delay_prev;  ///< Link pointer to previous Thread in Delay list
							 | 
						||
| 
								 | 
							
								  struct osRtxThread_s   *thread_join;  ///< Thread waiting to Join
							 | 
						||
| 
								 | 
							
								  uint32_t                      delay;  ///< Delay Time
							 | 
						||
| 
								 | 
							
								  int8_t                     priority;  ///< Thread Priority
							 | 
						||
| 
								 | 
							
								  int8_t                priority_base;  ///< Base Priority
							 | 
						||
| 
								 | 
							
								  uint8_t                 stack_frame;  ///< Stack Frame (EXC_RETURN[7..0])
							 | 
						||
| 
								 | 
							
								  uint8_t               flags_options;  ///< Thread/Event Flags Options
							 | 
						||
| 
								 | 
							
								  uint32_t                 wait_flags;  ///< Waiting Thread/Event Flags
							 | 
						||
| 
								 | 
							
								  uint32_t               thread_flags;  ///< Thread Flags
							 | 
						||
| 
								 | 
							
								  struct osRtxMutex_s     *mutex_list;  ///< Link pointer to list of owned Mutexes
							 | 
						||
| 
								 | 
							
								  void                     *stack_mem;  ///< Stack Memory
							 | 
						||
| 
								 | 
							
								  uint32_t                 stack_size;  ///< Stack Size
							 | 
						||
| 
								 | 
							
								  uint32_t                         sp;  ///< Current Stack Pointer
							 | 
						||
| 
								 | 
							
								  uint32_t                thread_addr;  ///< Thread entry address
							 | 
						||
| 
								 | 
							
								  uint32_t                  tz_memory;  ///< TrustZone Memory Identifier
							 | 
						||
| 
								 | 
							
								#ifdef RTX_TF_M_EXTENSION
							 | 
						||
| 
								 | 
							
								  uint32_t                  tz_module;  ///< TrustZone Module Identifier
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								} osRtxThread_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Timer definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Timer State definitions
							 | 
						||
| 
								 | 
							
								#define osRtxTimerInactive      0x00U   ///< Timer Inactive
							 | 
						||
| 
								 | 
							
								#define osRtxTimerStopped       0x01U   ///< Timer Stopped
							 | 
						||
| 
								 | 
							
								#define osRtxTimerRunning       0x02U   ///< Timer Running
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Timer Type definitions
							 | 
						||
| 
								 | 
							
								#define osRtxTimerPeriodic      ((uint8_t)osTimerPeriodic)
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Timer Function Information
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  osTimerFunc_t                  func;  ///< Function Pointer
							 | 
						||
| 
								 | 
							
								  void                           *arg;  ///< Function Argument
							 | 
						||
| 
								 | 
							
								} osRtxTimerFinfo_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Timer Control Block
							 | 
						||
| 
								 | 
							
								typedef struct osRtxTimer_s {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t                       state;  ///< Object State
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                        type;  ///< Timer Type (Periodic/One-shot)
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  struct osRtxTimer_s           *prev;  ///< Pointer to previous active Timer
							 | 
						||
| 
								 | 
							
								  struct osRtxTimer_s           *next;  ///< Pointer to next active Timer
							 | 
						||
| 
								 | 
							
								  uint32_t                       tick;  ///< Timer current Tick
							 | 
						||
| 
								 | 
							
								  uint32_t                       load;  ///< Timer Load value
							 | 
						||
| 
								 | 
							
								  osRtxTimerFinfo_t             finfo;  ///< Timer Function Info
							 | 
						||
| 
								 | 
							
								} osRtxTimer_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Event Flags definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Event Flags Control Block
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    reserved;
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Waiting Threads List
							 | 
						||
| 
								 | 
							
								  uint32_t                event_flags;  ///< Event Flags
							 | 
						||
| 
								 | 
							
								} osRtxEventFlags_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Mutex definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Mutex Control Block
							 | 
						||
| 
								 | 
							
								typedef struct osRtxMutex_s {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                        attr;  ///< Object Attributes
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Waiting Threads List
							 | 
						||
| 
								 | 
							
								  osRtxThread_t         *owner_thread;  ///< Owner Thread
							 | 
						||
| 
								 | 
							
								  struct osRtxMutex_s     *owner_prev;  ///< Pointer to previous owned Mutex
							 | 
						||
| 
								 | 
							
								  struct osRtxMutex_s     *owner_next;  ///< Pointer to next owned Mutex
							 | 
						||
| 
								 | 
							
								  uint8_t                        lock;  ///< Lock counter
							 | 
						||
| 
								 | 
							
								  uint8_t                  padding[3];
							 | 
						||
| 
								 | 
							
								} osRtxMutex_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Semaphore definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Semaphore Control Block
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    reserved;
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Waiting Threads List
							 | 
						||
| 
								 | 
							
								  uint16_t                     tokens;  ///< Current number of tokens
							 | 
						||
| 
								 | 
							
								  uint16_t                 max_tokens;  ///< Maximum number of tokens
							 | 
						||
| 
								 | 
							
								} osRtxSemaphore_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Memory Pool definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Memory Pool Information
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint32_t                 max_blocks;  ///< Maximum number of Blocks
							 | 
						||
| 
								 | 
							
								  uint32_t                used_blocks;  ///< Number of used Blocks
							 | 
						||
| 
								 | 
							
								  uint32_t                 block_size;  ///< Block Size
							 | 
						||
| 
								 | 
							
								  void                    *block_base;  ///< Block Memory Base Address
							 | 
						||
| 
								 | 
							
								  void                     *block_lim;  ///< Block Memory Limit Address
							 | 
						||
| 
								 | 
							
								  void                    *block_free;  ///< First free Block Address
							 | 
						||
| 
								 | 
							
								} osRtxMpInfo_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Memory Pool Control Block
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    reserved;
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Waiting Threads List
							 | 
						||
| 
								 | 
							
								  osRtxMpInfo_t               mp_info;  ///< Memory Pool Info
							 | 
						||
| 
								 | 
							
								} osRtxMemoryPool_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Message Queue definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Message Control Block
							 | 
						||
| 
								 | 
							
								typedef struct osRtxMessage_s {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    priority;  ///< Message Priority
							 | 
						||
| 
								 | 
							
								  struct osRtxMessage_s         *prev;  ///< Pointer to previous Message
							 | 
						||
| 
								 | 
							
								  struct osRtxMessage_s         *next;  ///< Pointer to next Message
							 | 
						||
| 
								 | 
							
								} osRtxMessage_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Message Queue Control Block
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t              reserved_state;  ///< Object State (not used)
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    reserved;
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Waiting Threads List
							 | 
						||
| 
								 | 
							
								  osRtxMpInfo_t               mp_info;  ///< Memory Pool Info
							 | 
						||
| 
								 | 
							
								  uint32_t                   msg_size;  ///< Message Size
							 | 
						||
| 
								 | 
							
								  uint32_t                  msg_count;  ///< Number of queued Messages
							 | 
						||
| 
								 | 
							
								  osRtxMessage_t           *msg_first;  ///< Pointer to first Message
							 | 
						||
| 
								 | 
							
								  osRtxMessage_t            *msg_last;  ///< Pointer to last Message
							 | 
						||
| 
								 | 
							
								} osRtxMessageQueue_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== Generic Object definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Generic Object Control Block
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint8_t                          id;  ///< Object Identifier
							 | 
						||
| 
								 | 
							
								  uint8_t                       state;  ///< Object State
							 | 
						||
| 
								 | 
							
								  uint8_t                       flags;  ///< Object Flags
							 | 
						||
| 
								 | 
							
								  uint8_t                    reserved;
							 | 
						||
| 
								 | 
							
								  const char                    *name;  ///< Object Name
							 | 
						||
| 
								 | 
							
								  osRtxThread_t          *thread_list;  ///< Threads List
							 | 
						||
| 
								 | 
							
								} osRtxObject_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== OS Runtime Information definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Runtime Information structure
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  const char                   *os_id;  ///< OS Identification
							 | 
						||
| 
								 | 
							
								  uint32_t                    version;  ///< OS Version
							 | 
						||
| 
								 | 
							
								  struct {                              ///< Kernel Info
							 | 
						||
| 
								 | 
							
								    uint8_t                     state;  ///< State
							 | 
						||
| 
								 | 
							
								    volatile uint8_t          blocked;  ///< Blocked
							 | 
						||
| 
								 | 
							
								    uint8_t                    pendSV;  ///< Pending SV
							 | 
						||
| 
								 | 
							
								    uint8_t                  reserved;
							 | 
						||
| 
								 | 
							
								    uint32_t                     tick;  ///< Tick counter
							 | 
						||
| 
								 | 
							
								  } kernel;
							 | 
						||
| 
								 | 
							
								  int32_t                   tick_irqn;  ///< Tick Timer IRQ Number
							 | 
						||
| 
								 | 
							
								  struct {                              ///< Thread Info
							 | 
						||
| 
								 | 
							
								    struct {                            ///< Thread Run Info
							 | 
						||
| 
								 | 
							
								      osRtxThread_t             *curr;  ///< Current running Thread
							 | 
						||
| 
								 | 
							
								      osRtxThread_t             *next;  ///< Next Thread to Run
							 | 
						||
| 
								 | 
							
								    } run;
							 | 
						||
| 
								 | 
							
								    osRtxObject_t               ready;  ///< Ready List Object
							 | 
						||
| 
								 | 
							
								    osRtxThread_t               *idle;  ///< Idle Thread
							 | 
						||
| 
								 | 
							
								    osRtxThread_t         *delay_list;  ///< Delay List
							 | 
						||
| 
								 | 
							
								    osRtxThread_t          *wait_list;  ///< Wait List (no Timeout)
							 | 
						||
| 
								 | 
							
								    osRtxThread_t     *terminate_list;  ///< Terminate Thread List
							 | 
						||
| 
								 | 
							
								    struct {                            ///< Thread Round Robin Info
							 | 
						||
| 
								 | 
							
								      osRtxThread_t           *thread;  ///< Round Robin Thread
							 | 
						||
| 
								 | 
							
								      uint32_t                   tick;  ///< Round Robin Time Tick
							 | 
						||
| 
								 | 
							
								      uint32_t                timeout;  ///< Round Robin Timeout
							 | 
						||
| 
								 | 
							
								    } robin;
							 | 
						||
| 
								 | 
							
								  } thread;
							 | 
						||
| 
								 | 
							
								  struct {                              ///< Timer Info
							 | 
						||
| 
								 | 
							
								    osRtxTimer_t                *list;  ///< Active Timer List
							 | 
						||
| 
								 | 
							
								    osRtxThread_t             *thread;  ///< Timer Thread
							 | 
						||
| 
								 | 
							
								    osRtxMessageQueue_t           *mq;  ///< Timer Message Queue
							 | 
						||
| 
								 | 
							
								    void                (*tick)(void);  ///< Timer Tick Function
							 | 
						||
| 
								 | 
							
								  } timer;
							 | 
						||
| 
								 | 
							
								  struct {                              ///< ISR Post Processing Queue
							 | 
						||
| 
								 | 
							
								    uint16_t                      max;  ///< Maximum Items
							 | 
						||
| 
								 | 
							
								    uint16_t                      cnt;  ///< Item Count
							 | 
						||
| 
								 | 
							
								    uint16_t                       in;  ///< Incoming Item Index
							 | 
						||
| 
								 | 
							
								    uint16_t                      out;  ///< Outgoing Item Index
							 | 
						||
| 
								 | 
							
								    void                       **data;  ///< Queue Data
							 | 
						||
| 
								 | 
							
								  } isr_queue;
							 | 
						||
| 
								 | 
							
								  struct {                                      ///< ISR Post Processing functions
							 | 
						||
| 
								 | 
							
								    void          (*thread)(osRtxThread_t*);    ///< Thread Post Processing function
							 | 
						||
| 
								 | 
							
								    void (*event_flags)(osRtxEventFlags_t*);    ///< Event Flags Post Processing function
							 | 
						||
| 
								 | 
							
								    void    (*semaphore)(osRtxSemaphore_t*);    ///< Semaphore Post Processing function
							 | 
						||
| 
								 | 
							
								    void (*memory_pool)(osRtxMemoryPool_t*);    ///< Memory Pool Post Processing function
							 | 
						||
| 
								 | 
							
								    void        (*message)(osRtxMessage_t*);    ///< Message Post Processing function
							 | 
						||
| 
								 | 
							
								  } post_process;
							 | 
						||
| 
								 | 
							
								  struct {                              ///< Memory Pools (Variable Block Size)
							 | 
						||
| 
								 | 
							
								    void                       *stack;  ///< Stack Memory
							 | 
						||
| 
								 | 
							
								    void                     *mp_data;  ///< Memory Pool Data Memory
							 | 
						||
| 
								 | 
							
								    void                     *mq_data;  ///< Message Queue Data Memory
							 | 
						||
| 
								 | 
							
								    void                      *common;  ///< Common Memory
							 | 
						||
| 
								 | 
							
								  } mem;
							 | 
						||
| 
								 | 
							
								  struct {                              ///< Memory Pools (Fixed Block Size)
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t              *stack;  ///< Stack for Threads
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t             *thread;  ///< Thread Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t              *timer;  ///< Timer Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t        *event_flags;  ///< Event Flags Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t              *mutex;  ///< Mutex Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t          *semaphore;  ///< Semaphore Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t        *memory_pool;  ///< Memory Pool Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t      *message_queue;  ///< Message Queue Control Blocks
							 | 
						||
| 
								 | 
							
								  } mpi;
							 | 
						||
| 
								 | 
							
								} osRtxInfo_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								extern osRtxInfo_t osRtxInfo;           ///< OS Runtime Information
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Runtime Object Memory Usage structure
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint32_t cnt_alloc;                   ///< Counter for alloc
							 | 
						||
| 
								 | 
							
								  uint32_t cnt_free;                    ///< Counter for free
							 | 
						||
| 
								 | 
							
								  uint32_t max_used;                    ///< Maximum used
							 | 
						||
| 
								 | 
							
								} osRtxObjectMemUsage_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Runtime Object Memory Usage variables
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxThreadMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxTimerMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxEventFlagsMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxMutexMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxSemaphoreMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxMemoryPoolMemUsage;
							 | 
						||
| 
								 | 
							
								extern osRtxObjectMemUsage_t osRtxMessageQueueMemUsage;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== OS API definitions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								// Object Limits definitions
							 | 
						||
| 
								 | 
							
								#define osRtxThreadFlagsLimit    31U    ///< number of Thread Flags available per thread
							 | 
						||
| 
								 | 
							
								#define osRtxEventFlagsLimit     31U    ///< number of Event Flags available per object
							 | 
						||
| 
								 | 
							
								#define osRtxMutexLockLimit      255U   ///< maximum number of recursive mutex locks
							 | 
						||
| 
								 | 
							
								#define osRtxSemaphoreTokenLimit 65535U ///< maximum number of tokens per semaphore
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								// Control Block sizes
							 | 
						||
| 
								 | 
							
								#define osRtxThreadCbSize        sizeof(osRtxThread_t)
							 | 
						||
| 
								 | 
							
								#define osRtxTimerCbSize         sizeof(osRtxTimer_t)
							 | 
						||
| 
								 | 
							
								#define osRtxEventFlagsCbSize    sizeof(osRtxEventFlags_t)
							 | 
						||
| 
								 | 
							
								#define osRtxMutexCbSize         sizeof(osRtxMutex_t)
							 | 
						||
| 
								 | 
							
								#define osRtxSemaphoreCbSize     sizeof(osRtxSemaphore_t)
							 | 
						||
| 
								 | 
							
								#define osRtxMemoryPoolCbSize    sizeof(osRtxMemoryPool_t)
							 | 
						||
| 
								 | 
							
								#define osRtxMessageQueueCbSize  sizeof(osRtxMessageQueue_t)
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Memory size in bytes for Memory Pool storage.
							 | 
						||
| 
								 | 
							
								/// \param         block_count   maximum number of memory blocks in memory pool.
							 | 
						||
| 
								 | 
							
								/// \param         block_size    memory block size in bytes.
							 | 
						||
| 
								 | 
							
								#define osRtxMemoryPoolMemSize(block_count, block_size) \
							 | 
						||
| 
								 | 
							
								  (4*(block_count)*(((block_size)+3)/4))
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// Memory size in bytes for Message Queue storage.
							 | 
						||
| 
								 | 
							
								/// \param         msg_count     maximum number of messages in queue.
							 | 
						||
| 
								 | 
							
								/// \param         msg_size      maximum message size in bytes.
							 | 
						||
| 
								 | 
							
								#define osRtxMessageQueueMemSize(msg_count, msg_size) \
							 | 
						||
| 
								 | 
							
								  (4*(msg_count)*(3+(((msg_size)+3)/4)))
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== OS External Functions ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								// OS Error Codes
							 | 
						||
| 
								 | 
							
								#define osRtxErrorStackUnderflow        1U  ///< Stack overflow, i.e. stack pointer below its lower memory limit for descending stacks.
							 | 
						||
| 
								 | 
							
								#define osRtxErrorISRQueueOverflow      2U  ///< ISR Queue overflow detected when inserting object.
							 | 
						||
| 
								 | 
							
								#define osRtxErrorTimerQueueOverflow    3U  ///< User Timer Callback Queue overflow detected for timer.
							 | 
						||
| 
								 | 
							
								#define osRtxErrorClibSpace             4U  ///< Standard C/C++ library libspace not available: increase \c OS_THREAD_LIBSPACE_NUM.
							 | 
						||
| 
								 | 
							
								#define osRtxErrorClibMutex             5U  ///< Standard C/C++ library mutex initialization failed.
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Error Callback function
							 | 
						||
| 
								 | 
							
								extern uint32_t osRtxErrorNotify (uint32_t code, void *object_id);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Idle Thread
							 | 
						||
| 
								 | 
							
								extern void osRtxIdleThread (void *argument);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Exception handlers
							 | 
						||
| 
								 | 
							
								extern void SVC_Handler     (void);
							 | 
						||
| 
								 | 
							
								extern void PendSV_Handler  (void);
							 | 
						||
| 
								 | 
							
								extern void SysTick_Handler (void);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Trusted Firmware M Extension
							 | 
						||
| 
								 | 
							
								#ifdef RTX_TF_M_EXTENSION
							 | 
						||
| 
								 | 
							
								extern uint32_t osRtxTzGetModuleId (void);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								//  ==== OS External Configuration ====
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Configuration flags
							 | 
						||
| 
								 | 
							
								#define osRtxConfigPrivilegedMode   (1UL<<0)    ///< Threads in Privileged mode
							 | 
						||
| 
								 | 
							
								#define osRtxConfigStackCheck       (1UL<<1)    ///< Stack overrun checking
							 | 
						||
| 
								 | 
							
								#define osRtxConfigStackWatermark   (1UL<<2)    ///< Stack usage Watermark
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/// OS Configuration structure
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint32_t                             flags;   ///< OS Configuration Flags
							 | 
						||
| 
								 | 
							
								  uint32_t                         tick_freq;   ///< Kernel Tick Frequency
							 | 
						||
| 
								 | 
							
								  uint32_t                     robin_timeout;   ///< Round Robin Timeout Tick
							 | 
						||
| 
								 | 
							
								  struct {                                      ///< ISR Post Processing Queue
							 | 
						||
| 
								 | 
							
								    void                              **data;   ///< Queue Data
							 | 
						||
| 
								 | 
							
								    uint16_t                             max;   ///< Maximum Items
							 | 
						||
| 
								 | 
							
								    uint16_t                         padding;
							 | 
						||
| 
								 | 
							
								  } isr_queue;
							 | 
						||
| 
								 | 
							
								  struct {                                      ///< Memory Pools (Variable Block Size)
							 | 
						||
| 
								 | 
							
								    void                         *stack_addr;   ///< Stack Memory Address
							 | 
						||
| 
								 | 
							
								    uint32_t                      stack_size;   ///< Stack Memory Size
							 | 
						||
| 
								 | 
							
								    void                       *mp_data_addr;   ///< Memory Pool Memory Address
							 | 
						||
| 
								 | 
							
								    uint32_t                    mp_data_size;   ///< Memory Pool Memory Size
							 | 
						||
| 
								 | 
							
								    void                       *mq_data_addr;   ///< Message Queue Data Memory Address
							 | 
						||
| 
								 | 
							
								    uint32_t                    mq_data_size;   ///< Message Queue Data Memory Size
							 | 
						||
| 
								 | 
							
								    void                        *common_addr;   ///< Common Memory Address
							 | 
						||
| 
								 | 
							
								    uint32_t                     common_size;   ///< Common Memory Size
							 | 
						||
| 
								 | 
							
								  } mem;
							 | 
						||
| 
								 | 
							
								  struct {                                      ///< Memory Pools (Fixed Block Size)
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t                     *stack;   ///< Stack for Threads
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t                    *thread;   ///< Thread Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t                     *timer;   ///< Timer Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t               *event_flags;   ///< Event Flags Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t                     *mutex;   ///< Mutex Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t                 *semaphore;   ///< Semaphore Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t               *memory_pool;   ///< Memory Pool Control Blocks
							 | 
						||
| 
								 | 
							
								    osRtxMpInfo_t             *message_queue;   ///< Message Queue Control Blocks
							 | 
						||
| 
								 | 
							
								  } mpi;
							 | 
						||
| 
								 | 
							
								  uint32_t                 thread_stack_size;   ///< Default Thread Stack Size
							 | 
						||
| 
								 | 
							
								  const 
							 | 
						||
| 
								 | 
							
								  osThreadAttr_t           *idle_thread_attr;   ///< Idle Thread Attributes
							 | 
						||
| 
								 | 
							
								  const
							 | 
						||
| 
								 | 
							
								  osThreadAttr_t          *timer_thread_attr;   ///< Timer Thread Attributes
							 | 
						||
| 
								 | 
							
								  const
							 | 
						||
| 
								 | 
							
								  osMessageQueueAttr_t        *timer_mq_attr;   ///< Timer Message Queue Attributes
							 | 
						||
| 
								 | 
							
								  uint32_t                     timer_mq_mcnt;   ///< Timer Message Queue maximum Messages
							 | 
						||
| 
								 | 
							
								} osRtxConfig_t;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								extern const osRtxConfig_t osRtxConfig;         ///< OS Configuration
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#ifdef  __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								#endif  // RTX_OS_H_
							 |