34 #define MICRIUM_SOURCE
40 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
41 const CPU_CHAR *os_tls__c =
"$Id: $";
44 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
52 #if (_DLIB_FILE_DESCRIPTOR > 0) && (_FILE_OP_LOCKS > 0)
53 #define OS_TLS_LOCK_MAX ((_MAX_LOCK) + (_FOPEN_MAX))
55 #define OS_TLS_LOCK_MAX (_MAX_LOCK)
64 typedef struct os_tls_lock OS_TLS_LOCK;
82 static OS_TLS_LOCK OS_TLS_LockPoolTbl[OS_TLS_LOCK_MAX];
83 static OS_TLS_LOCK *OS_TLS_LockPoolListPtr = (OS_TLS_LOCK *)0;
91 static void OS_TLS_LockCreate (
void **p_lock);
92 static void OS_TLS_LockDel (
void *p_lock);
93 static void OS_TLS_LockAcquire (
void *p_lock);
94 static void OS_TLS_LockRelease (
void *p_lock);
115 OS_TLS_ID OS_TLS_GetID (
OS_ERR *p_err)
122 #ifdef OS_SAFETY_CRITICAL
123 if (p_err == (
OS_ERR *)0) {
124 OS_SAFETY_CRITICAL_EXCEPTION();
136 id = OS_TLS_NextAvailID;
137 OS_TLS_NextAvailID++;
173 OS_TLS OS_TLS_GetValue (OS_TCB *p_tcb,
182 #ifdef OS_SAFETY_CRITICAL
183 if (p_err == (
OS_ERR *)0) {
184 OS_SAFETY_CRITICAL_EXCEPTION();
190 #if OS_CFG_ARG_CHK_EN > 0u
191 if (
id >= OS_TLS_NextAvailID) {
198 if (p_tcb == (OS_TCB *)0) {
207 value = p_tcb->TLS_Tbl[id];
210 return ((OS_TLS)value);
252 void OS_TLS_SetDestruct (OS_TLS_ID
id,
253 OS_TLS_DESTRUCT_PTR p_destruct,
293 void OS_TLS_SetValue (OS_TCB *p_tcb,
302 #ifdef OS_SAFETY_CRITICAL
303 if (p_err == (
OS_ERR *)0) {
304 OS_SAFETY_CRITICAL_EXCEPTION();
309 #if OS_CFG_ARG_CHK_EN > 0u
310 if (
id >= OS_TLS_NextAvailID) {
317 if (p_tcb == (OS_TCB *)0) {
326 p_tcb->TLS_Tbl[id] = value;
365 void OS_TLS_Init (
OS_ERR *p_err)
373 OS_TLS_NextAvailID = 0u;
374 OS_TLS_LibID = OS_TLS_GetID(p_err);
378 for (ix = 0u; ix < (OS_TLS_LOCK_MAX - 1u); ix++) {
379 p_lock = &OS_TLS_LockPoolTbl[ix];
380 p_lock->NextPtr = &OS_TLS_LockPoolTbl[ix + 1u];
383 p_lock = &OS_TLS_LockPoolTbl[OS_TLS_LOCK_MAX - 1u];
384 p_lock->NextPtr = (OS_TLS_LOCK *)0;
386 OS_TLS_LockPoolListPtr = &OS_TLS_LockPoolTbl[0];
410 void OS_TLS_TaskCreate (OS_TCB *p_tcb)
417 p_tls = (OS_TLS)__iar_dlib_perthread_allocate();
418 __iar_dlib_perthread_initialize(p_tls);
419 p_tcb->TLS_Tbl[OS_TLS_LibID] = p_tls;
438 void OS_TLS_TaskDel (OS_TCB *p_tcb)
444 p_tls = p_tcb->TLS_Tbl[OS_TLS_LibID];
445 __iar_dlib_perthread_destroy();
446 __iar_dlib_perthread_deallocate((
void *)p_tls);
447 p_tcb->TLS_Tbl[OS_TLS_LibID] = (OS_TLS)0;
469 void OS_TLS_TaskSw (
void)
501 void OS_TLS_LockCreate (
void **p_lock)
503 OS_TLS_LOCK *p_tls_lock;
508 if (p_lock == (
void **)0) {
512 if (OS_TLS_LockPoolListPtr == (OS_TLS_LOCK *)0) {
517 p_tls_lock = OS_TLS_LockPoolListPtr;
519 OSMutexCreate((OS_MUTEX *)&p_tls_lock->Mutex,
529 OS_TLS_LockPoolListPtr = p_tls_lock->NextPtr;
532 *p_lock = (
void *)p_tls_lock;
554 void OS_TLS_LockDel (
void *p_lock)
556 OS_TLS_LOCK *p_tls_lock;
561 if (p_lock == (
void *)0) {
565 p_tls_lock = (OS_TLS_LOCK *)p_lock;
567 (void)OSMutexDel((OS_MUTEX *)&p_tls_lock->Mutex,
574 if (OS_TLS_LockPoolListPtr == (OS_TLS_LOCK *)0) {
575 p_tls_lock->NextPtr = (OS_TLS_LOCK *)0;
577 p_tls_lock->NextPtr = OS_TLS_LockPoolListPtr;
579 OS_TLS_LockPoolListPtr = p_tls_lock;
602 void OS_TLS_LockAcquire (
void *p_lock)
604 OS_TLS_LOCK *p_tls_lock;
608 if ((p_lock == (
void *)0 ) ||
613 p_tls_lock = (OS_TLS_LOCK *)p_lock;
614 OSMutexPend((OS_MUTEX *)&p_tls_lock->Mutex,
640 static void OS_TLS_LockRelease (
void *p_lock)
642 OS_TLS_LOCK *p_tls_lock;
646 if ((p_lock == (
void *)0 ) ||
651 p_tls_lock = (OS_TLS_LOCK *)p_lock;
652 OSMutexPost((OS_MUTEX *)&p_tls_lock->Mutex,
681 void __iar_system_Mtxinit (__iar_Rmtx *p_lock)
683 OS_TLS_LockCreate((
void **)p_lock);
699 void __iar_system_Mtxdst(__iar_Rmtx *p_lock)
701 OS_TLS_LockDel((
void *)*p_lock);
717 void __iar_system_Mtxlock(__iar_Rmtx *p_lock)
719 OS_TLS_LockAcquire((
void *)*p_lock);
735 void __iar_system_Mtxunlock(__iar_Rmtx *p_lock)
737 OS_TLS_LockRelease((
void *)*p_lock);
753 void __iar_file_Mtxinit (__iar_Rmtx *p_lock)
755 OS_TLS_LockCreate((
void **)p_lock);
771 void __iar_file_Mtxdst(__iar_Rmtx *p_lock)
773 OS_TLS_LockDel((
void *)*p_lock);
789 void __iar_file_Mtxlock(__iar_Rmtx *p_lock)
791 OS_TLS_LockAcquire((
void *)*p_lock);
807 void __iar_file_Mtxunlock(__iar_Rmtx *p_lock)
809 OS_TLS_LockRelease((
void *)*p_lock);
828 void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access (
void _DLIB_TLS_MEMORY *symbp)
830 void _DLIB_TLS_MEMORY *p_tls;
832 uintptr_t tls_offset;
837 p_tls = (OS_TLS)__segment_begin(
"__DLIB_PERTHREAD");
839 p_tls = (
void *)
OSTCBCurPtr->TLS_Tbl[OS_TLS_LibID];
842 tls_start = (uintptr_t)(p_tls);
843 tls_offset = (uintptr_t)(__IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp));
844 p_tls = (
void _DLIB_TLS_MEMORY *)(tls_start + tls_offset);