mtkernel_3/kernel/sysdepend/cpu/core/armv7m/cpu_status.h | bare source | permlink (0.00 seconds) |
1: /* 2: *---------------------------------------------------------------------- 3: * micro T-Kernel 3.00.03 4: * 5: * Copyright (C) 2006-2021 by Ken Sakamura. 6: * This software is distributed under the T-License 2.2. 7: *---------------------------------------------------------------------- 8: * 9: * Released by TRON Forum(http://www.tron.org) at 2021/03/31. 10: * 11: *---------------------------------------------------------------------- 12: */ 13: 14: /* 15: * cpu_status.h (ARMv7-M) 16: * CPU-Dependent Status Definition 17: */ 18: 19: #ifndef _SYSDEPEND_CPU_CORE_STATUS_ 20: #define _SYSDEPEND_CPU_CORE_STATUS_ 21: 22: #include <tk/syslib.h> 23: #include <sys/sysdef.h> 24: 25: #include "sysdepend.h" 26: /* 27: * Start/End critical section 28: */ 29: #define BEGIN_CRITICAL_SECTION { UINT _basepri_ = disint(); 30: #define END_CRITICAL_SECTION if ( !isDI(_basepri_) \ 31: && knl_ctxtsk != knl_schedtsk \ 32: && !knl_dispatch_disabled ) { \ 33: knl_dispatch(); \ 34: } \ 35: set_basepri(_basepri_); } 36: 37: /* 38: * Start/End interrupt disable section 39: */ 40: #define BEGIN_DISABLE_INTERRUPT { UINT _basepri_ = disint(); 41: #define END_DISABLE_INTERRUPT set_basepri(_basepri_); } 42: 43: /* 44: * Interrupt enable/disable 45: */ 46: #define ENABLE_INTERRUPT { set_basepri(0); } 47: #define DISABLE_INTERRUPT { disint(); } 48: 49: /* 50: * Enable interrupt nesting 51: * Enable the interrupt that has a higher priority than 'level.' 52: */ 53: #define ENABLE_INTERRUPT_UPTO(level) { set_basepri(0); } 54: 55: /* 56: * Task-independent control 57: */ 58: IMPORT W knl_taskindp; /* Task independent status */ 59: 60: /* 61: * If it is the task-independent part, TRUE 62: */ 63: Inline BOOL knl_isTaskIndependent( void ) 64: { 65: return ( knl_taskindp > 0 )? TRUE: FALSE; 66: } 67: /* 68: * Move to/Restore task independent part 69: */ 70: Inline void knl_EnterTaskIndependent( void ) 71: { 72: knl_taskindp++; 73: } 74: Inline void knl_LeaveTaskIndependent( void ) 75: { 76: knl_taskindp--; 77: } 78: 79: /* 80: * Move to/Restore task independent part 81: */ 82: #define ENTER_TASK_INDEPENDENT { knl_EnterTaskIndependent(); } 83: #define LEAVE_TASK_INDEPENDENT { knl_LeaveTaskIndependent(); } 84: 85: /* ----------------------------------------------------------------------- */ 86: /* 87: * Check system state 88: */ 89: 90: /* 91: * When a system call is called from the task independent part, TRUE 92: */ 93: #define in_indp() ( knl_isTaskIndependent() || knl_ctxtsk == NULL ) 94: 95: /* 96: * When a system call is called during dispatch disable, TRUE 97: * Also include the task independent part as during dispatch disable. 98: */ 99: #define in_ddsp() ( knl_dispatch_disabled \ 100: || in_indp() \ 101: || isDI(get_basepri()) ) 102: 103: /* 104: * When a system call is called during CPU lock (interrupt disable), TRUE 105: * Also include the task independent part as during CPU lock. 106: */ 107: #define in_loc() ( isDI(get_basepri()) \ 108: || in_indp() ) 109: 110: /* 111: * When a system call is called during executing the quasi task part, TRUE 112: * Valid only when in_indp() == FALSE because it is not discriminated from 113: * the task independent part. 114: */ 115: #define in_qtsk() ( knl_ctxtsk->sysmode > knl_ctxtsk->isysmode ) 116: 117: 118: #endif /* _SYSDEPEND_CPU_CORE_STATUS_ */