| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- /*
- * Copyright (c) 2013-2023 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"
- #include "rtx_def.h"
-
- #ifdef __cplusplus
- extern "C"
- {
- #endif
-
-
- /// Kernel Information
- #define osRtxVersionAPI 20020000 ///< API version (2.2.0)
- #define osRtxVersionKernel 50070000 ///< Kernel version (5.7.0)
- #define osRtxKernelId "RTX V5.7.0" ///< 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
-
- /// Object Attribute Class definitions
- #define osRtxAttrClass_Pos 4U
- #define osRtxAttrClass_Msk 0xF0U
-
-
- // ==== 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)
-
- /// Kernel Protect definitions
- #define osRtxKernelProtectPrivileged 0x01U
- #define osRtxKernelProtectClass_Pos 4U
- #define osRtxKernelProtectClass_Msk 0xF0U
-
-
- // ==== 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/Round Robin Time Tick
- 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
- uint8_t zone; ///< Thread Zone
- uint8_t reserved[3];
- struct osRtxThread_s *wdog_next; ///< Link pointer to next Thread in Watchdog list
- uint32_t wdog_tick; ///< Watchdog tick counter
- } osRtxThread_t;
-
-
- // ==== Timer definitions ====
-
- /// Timer State definitions
- #define osRtxTimerInactive 0x00U ///< Timer Inactive
- #define osRtxTimerStopped 0x01U ///< Timer Stopped
- #define osRtxTimerRunning 0x02U ///< Timer Running
-
- /// Timer attribute definitions
- #define osRtxTimerPeriodic 0x01U ///< Timer Periodic mode
-
- /// 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 attr; ///< Object Attributes
- 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 attr; ///< Object Attributes
- 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 attr; ///< Object Attributes
- 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 attr; ///< Object Attributes
- 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 attr; ///< Object Attributes
- 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 attr; ///< Object Attributes
- 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 protect; ///< Protect options
- 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
- osRtxThread_t *wdog_list; ///< Watchdog List
- struct { ///< Thread Round Robin Info
- osRtxThread_t *thread; ///< Round Robin Thread
- 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 ///< \deprecated Superseded by \ref osRtxErrorStackOverflow.
- #define osRtxErrorStackOverflow 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.
- #define osRtxErrorSVC 6U ///< Invalid SVC function called.
-
- /// OS Error Callback function
- extern uint32_t osRtxErrorNotify (uint32_t code, void *object_id);
- extern uint32_t osRtxKernelErrorNotify (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 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
- #define osRtxConfigSafetyFeatures (1UL<<3) ///< Safety features enabled
- #define osRtxConfigSafetyClass (1UL<<4) ///< Safety Class feature enabled
- #define osRtxConfigExecutionZone (1UL<<5) ///< Execution Zone enabled
- #define osRtxConfigThreadWatchdog (1UL<<6) ///< Thread Watchdog enabled
- #define osRtxConfigObjPtrCheck (1UL<<7) ///< Object Pointer Checking enabled
- #define osRtxConfigSVCPtrCheck (1UL<<8) ///< SVC Pointer Checking enabled
-
- /// 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
- void (*timer_thread)(void *); ///< Timer Thread Function
- int32_t (*timer_setup)(void); ///< Timer Setup Function
- 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_
|