Nut/OS  5.0.5
API Reference
core_cmFunc.h
Go to the documentation of this file.
00001 /**************************************************************************/
00024 #ifndef __CORE_CMFUNC_H
00025 #define __CORE_CMFUNC_H
00026 
00027 
00028 /* ###########################  Core Function Access  ########################### */
00034 #if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
00035 /* ARM armcc specific functions */
00036 
00037 #if (__ARMCC_VERSION < 400677)
00038   #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
00039 #endif
00040 
00041 /* intrinsic void __enable_irq();     */
00042 /* intrinsic void __disable_irq();    */
00043 
00050 __STATIC_INLINE uint32_t __get_CONTROL(void)
00051 {
00052   register uint32_t __regControl         __ASM("control");
00053   return(__regControl);
00054 }
00055 
00056 
00063 __STATIC_INLINE void __set_CONTROL(uint32_t control)
00064 {
00065   register uint32_t __regControl         __ASM("control");
00066   __regControl = control;
00067 }
00068 
00069 
00076 __STATIC_INLINE uint32_t __get_IPSR(void)
00077 {
00078   register uint32_t __regIPSR          __ASM("ipsr");
00079   return(__regIPSR);
00080 }
00081 
00082 
00089 __STATIC_INLINE uint32_t __get_APSR(void)
00090 {
00091   register uint32_t __regAPSR          __ASM("apsr");
00092   return(__regAPSR);
00093 }
00094 
00095 
00102 __STATIC_INLINE uint32_t __get_xPSR(void)
00103 {
00104   register uint32_t __regXPSR          __ASM("xpsr");
00105   return(__regXPSR);
00106 }
00107 
00108 
00115 __STATIC_INLINE uint32_t __get_PSP(void)
00116 {
00117   register uint32_t __regProcessStackPointer  __ASM("psp");
00118   return(__regProcessStackPointer);
00119 }
00120 
00121 
00128 __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
00129 {
00130   register uint32_t __regProcessStackPointer  __ASM("psp");
00131   __regProcessStackPointer = topOfProcStack;
00132 }
00133 
00134 
00141 __STATIC_INLINE uint32_t __get_MSP(void)
00142 {
00143   register uint32_t __regMainStackPointer     __ASM("msp");
00144   return(__regMainStackPointer);
00145 }
00146 
00147 
00154 __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
00155 {
00156   register uint32_t __regMainStackPointer     __ASM("msp");
00157   __regMainStackPointer = topOfMainStack;
00158 }
00159 
00160 
00167 __STATIC_INLINE uint32_t __get_PRIMASK(void)
00168 {
00169   register uint32_t __regPriMask         __ASM("primask");
00170   return(__regPriMask);
00171 }
00172 
00173 
00180 __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
00181 {
00182   register uint32_t __regPriMask         __ASM("primask");
00183   __regPriMask = (priMask);
00184 }
00185 
00186 
00187 #if       (__CORTEX_M >= 0x03)
00188 
00194 #define __enable_fault_irq                __enable_fiq
00195 
00196 
00202 #define __disable_fault_irq               __disable_fiq
00203 
00204 
00211 __STATIC_INLINE uint32_t  __get_BASEPRI(void)
00212 {
00213   register uint32_t __regBasePri         __ASM("basepri");
00214   return(__regBasePri);
00215 }
00216 
00217 
00224 __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
00225 {
00226   register uint32_t __regBasePri         __ASM("basepri");
00227   __regBasePri = (basePri & 0xff);
00228 }
00229 
00230 
00237 __STATIC_INLINE uint32_t __get_FAULTMASK(void)
00238 {
00239   register uint32_t __regFaultMask       __ASM("faultmask");
00240   return(__regFaultMask);
00241 }
00242 
00243 
00250 __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
00251 {
00252   register uint32_t __regFaultMask       __ASM("faultmask");
00253   __regFaultMask = (faultMask & (uint32_t)1);
00254 }
00255 
00256 #endif /* (__CORTEX_M >= 0x03) */
00257 
00258 
00259 #if       (__CORTEX_M == 0x04)
00260 
00267 __STATIC_INLINE uint32_t __get_FPSCR(void)
00268 {
00269 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00270   register uint32_t __regfpscr         __ASM("fpscr");
00271   return(__regfpscr);
00272 #else
00273    return(0);
00274 #endif
00275 }
00276 
00277 
00284 __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
00285 {
00286 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00287   register uint32_t __regfpscr         __ASM("fpscr");
00288   __regfpscr = (fpscr);
00289 #endif
00290 }
00291 
00292 #endif /* (__CORTEX_M == 0x04) */
00293 
00294 
00295 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
00296 /* IAR iccarm specific functions */
00297 
00298 #include <cmsis_iar.h>
00299 
00300 
00301 #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
00302 /* TI CCS specific functions */
00303 
00304 #include <cmsis_ccs.h>
00305 
00306 
00307 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
00308 /* GNU gcc specific functions */
00309 
00315 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
00316 {
00317   __ASM volatile ("cpsie i");
00318 }
00319 
00320 
00326 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
00327 {
00328   __ASM volatile ("cpsid i");
00329 }
00330 
00331 
00338 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
00339 {
00340   uint32_t result;
00341 
00342   __ASM volatile ("MRS %0, control" : "=r" (result) );
00343   return(result);
00344 }
00345 
00346 
00353 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
00354 {
00355   __ASM volatile ("MSR control, %0" : : "r" (control) );
00356 }
00357 
00358 
00365 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
00366 {
00367   uint32_t result;
00368 
00369   __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
00370   return(result);
00371 }
00372 
00373 
00380 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
00381 {
00382   uint32_t result;
00383 
00384   __ASM volatile ("MRS %0, apsr" : "=r" (result) );
00385   return(result);
00386 }
00387 
00388 
00395 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
00396 {
00397   uint32_t result;
00398 
00399   __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
00400   return(result);
00401 }
00402 
00403 
00410 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
00411 {
00412   register uint32_t result;
00413 
00414   __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
00415   return(result);
00416 }
00417 
00418 
00425 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
00426 {
00427   __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );
00428 }
00429 
00430 
00437 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
00438 {
00439   register uint32_t result;
00440 
00441   __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
00442   return(result);
00443 }
00444 
00445 
00452 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
00453 {
00454   __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );
00455 }
00456 
00457 
00464 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
00465 {
00466   uint32_t result;
00467 
00468   __ASM volatile ("MRS %0, primask" : "=r" (result) );
00469   return(result);
00470 }
00471 
00472 
00479 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
00480 {
00481   __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
00482 }
00483 
00484 
00485 #if       (__CORTEX_M >= 0x03)
00486 
00492 __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
00493 {
00494   __ASM volatile ("cpsie f");
00495 }
00496 
00497 
00503 __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
00504 {
00505   __ASM volatile ("cpsid f");
00506 }
00507 
00508 
00515 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
00516 {
00517   uint32_t result;
00518 
00519   __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
00520   return(result);
00521 }
00522 
00523 
00530 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
00531 {
00532   __ASM volatile ("MSR basepri, %0" : : "r" (value) );
00533 }
00534 
00535 
00542 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
00543 {
00544   uint32_t result;
00545 
00546   __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
00547   return(result);
00548 }
00549 
00550 
00557 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
00558 {
00559   __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
00560 }
00561 
00562 #endif /* (__CORTEX_M >= 0x03) */
00563 
00564 
00565 #if       (__CORTEX_M == 0x04)
00566 
00573 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
00574 {
00575 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00576   uint32_t result;
00577 
00578   __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
00579   return(result);
00580 #else
00581    return(0);
00582 #endif
00583 }
00584 
00585 
00592 __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
00593 {
00594 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
00595   __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );
00596 #endif
00597 }
00598 
00599 #endif /* (__CORTEX_M == 0x04) */
00600 
00601 
00602 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
00603 /* TASKING carm specific functions */
00604 
00605 /*
00606  * The CMSIS functions have been implemented as intrinsics in the compiler.
00607  * Please use "carm -?i" to get an up to date list of all instrinsics,
00608  * Including the CMSIS ones.
00609  */
00610 
00611 #endif
00612 
00616 #endif /* __CORE_CMFUNC_H */