gonzui


Format: Advanced Search

mtkernel_3/kernel/sysdepend/cpu/core/armv7m/cpu_status.hbare sourcepermlink (0.00 seconds)

Search this content:

    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_ */