11#ifndef __STATIC_INLINE
12#define __STATIC_INLINE static inline
15#define __INLINE inline
22#define ARCH_STK_ALIGN_SIZ (8)
23#define ARCH_ALIGN_STK __attribute__((aligned(ARCH_STK_ALIGN_SIZ)))
25#define SCB_ICSR_REG (*((uint32_t *)0xE000ED04UL))
26#define SCB_ICSR_PENDSVSET_BIT (0x10000000);
27static __inline__
void *get_pc(
void)
30 asm(
"mov %0, pc" :
"=r"(pc));
40extern volatile uint32_t critical_count;
41extern volatile uint32_t lockPC;
42extern volatile uint32_t OSISRLevel32;
46#if defined OS_MAX_IRQ_MASK && (OS_MAX_IRQ_MASK < CPU_MAX_IRQ)
47#define NBRTOS_ENTER_CRITICAL() \
49 __set_BASEPRI((CPU_MAX_IRQ - OS_MAX_IRQ_MASK) << (8 - __NVIC_PRIO_BITS)); \
50 asm volatile("dsb" ::: "memory"); \
52#define NBRTOS_EXIT_CRITICAL() \
54 if (critical_count <= 0) \
56 __set_BASEPRI(OSISRLevel32 << (8 - __NVIC_PRIO_BITS)); \
57 asm volatile("dsb" ::: "memory"); \
61#define USER_ENTER_CRITICAL() \
63 __set_BASEPRI((CPU_MAX_IRQ - OS_MAX_IRQ_MASK) << (8 - __NVIC_PRIO_BITS)); \
64 asm volatile("dsb" ::: "memory"); \
68#define USER_EXIT_CRITICAL() \
70 if (--critical_count <= 0) \
72 __set_BASEPRI(OSISRLevel32 << (8 - __NVIC_PRIO_BITS)); \
73 asm volatile("dsb" ::: "memory"); \
80#define NBRTOS_ENTER_CRITICAL() asm volatile("cpsid i\nisb");
81#define NBRTOS_EXIT_CRITICAL() \
83 if (critical_count <= 0) { asm volatile("cpsie i"); } \
86#define USER_ENTER_CRITICAL() \
88 asm volatile("cpsid i\nisb"); \
92#define USER_EXIT_CRITICAL() \
94 if (--critical_count <= 0) { asm volatile("cpsie i"); } \
99extern volatile uint32_t dbgState;
100#define DBG_STATE_INT_MASK (0x2)
101#define DBG_CRITMASK_RTOS (0x4)
102#define DBG_CRITMASK_USER (0x8)
103#define DBG_CRITMASK_GDB (0x10)
105#define NBRTOS_ENTER_CRITICAL() \
107 asm volatile("cpsid i\nisb"); \
108 __set_BASEPRI(1 << (8 - __NVIC_PRIO_BITS)); \
109 asm volatile("cpsie i"); \
110 dbgState |= DBG_CRITMASK_RTOS; \
112#define NBRTOS_EXIT_CRITICAL() \
114 dbgState &= ~DBG_CRITMASK_RTOS; \
115 if ((critical_count <= 0) || (OSISRLevel32)) \
117 if (!(dbgState & (DBG_STATE_INT_MASK | DBG_CRITMASK_GDB))) { __set_BASEPRI(OSISRLevel32 << (8 - __NVIC_PRIO_BITS)); } \
121#define USER_ENTER_CRITICAL() \
123 asm volatile("cpsid i\nisb"); \
124 __set_BASEPRI(1 << (8 - __NVIC_PRIO_BITS)); \
125 asm volatile("cpsie i"); \
127 dbgState |= DBG_CRITMASK_USER; \
130#define USER_EXIT_CRITICAL() \
132 if (--critical_count <= 0) \
134 dbgState &= ~DBG_CRITMASK_USER; \
135 if (!(dbgState & (DBG_STATE_INT_MASK | DBG_CRITMASK_GDB))) { __set_BASEPRI(OSISRLevel32 << (8 - __NVIC_PRIO_BITS)); } \
141#define OS_TASK_SW() \
143 SCB_ICSR_REG = SCB_ICSR_PENDSVSET_BIT; \
144 NBRTOS_EXIT_CRITICAL(); \
145 asm(".global RTOSWAITS_HERE"); \
146 asm("RTOSWAITS_HERE:"); \
147 NBRTOS_ENTER_CRITICAL(); \
150#define OSIntCtxSw() \
152 SCB_ICSR_REG = SCB_ICSR_PENDSVSET_BIT; \
155#define FORCE_TRAP() asm volatile("udf")
157#define OSInIrq() (__get_IPSR() != 0)
165void FlushCache_ByAddr(uint32_t *addr, uint32_t len);
166void InvalidateCache_ByAddr(uint32_t *addr, uint32_t len);
168void MPU_DumpRegions();
169void MPU_DumpRegion(
int region);
170int MPU_GetRegionCount();
211 MPU_MEMTYPE__STRONG_ORDER = 0x00,
212 MPU_MEMTYPE__DEV_SHARED = 0x01,
213 MPU_MEMTYPE__NORM_WR_THRU = 0x02,
214 MPU_MEMTYPE__NORM_NO_WR_ALLOC= 0x03,
215 MPU_MEMTYPE__NORM_NON_CACHE = 0x04,
216 MPU_MEMTYPE__NORM_WR_ALLOC = 0x07,
217 MPU_MEMTYPE__DEV_NON_SHARED = 0x08,
221 MPU_PERMS__PRIV_NONE_UNPRIV_NONE = 0x00,
222 MPU_PERMS__PRIV_RDWR_UNPRIV_NONE = 0x01,
223 MPU_PERMS__PRIV_RDWR_UNPRIV_READ = 0x02,
224 MPU_PERMS__PRIV_RDWR_UNPRIV_RDWR = 0x03,
225 MPU_PERMS__INVALID = 0x04,
226 MPU_PERMS__PRIV_READ_UNPRIV_NONE = 0x05,
227 MPU_PERMS__PRIV_READ_UNPRIV_READ = 0x06,
228 MPU_PERMS__PRIV_READ_UNPRIV_READ_ALSO = 0x07,
231struct MPU_RegionCfg {
234 uint8_t subRegionDisable;
242 MPU_RegionCfg(
int region);
243 bool ContainsVal(uint32_t addr, uint32_t valLen);
246int MPU_GetRegionCount();
247int MPU_GetRegionConfig(
int region, MPU_RegionCfg *cfg);
248bool MPU_AddrContainedInRegion(
int region, uint32_t addr, uint32_t size);
249int MPU_GetRegionPermissions(
int region);
250void MPU_DumpRegion(
int region);
251void MPU_DumpRegions();