S32 SDK
s32_core_cm4.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2016 Freescale Semiconductor, Inc.
3  * Copyright 2016 NXP
4  * All rights reserved.
5  *
6  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
7  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
9  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
10  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
11  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
12  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
14  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
15  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
16  * THE POSSIBILITY OF SUCH DAMAGE.
17  *
18  */
36 /*
37  * Tool Chains:
38  * __GNUC__ : GNU Compiler Collection
39  * __ghs__ : Green Hills ARM Compiler
40  * __ICCARM__ : IAR ARM Compiler
41  * __CSMC__ : Cosmic C Cross Compiler
42  * __DCC__ : Wind River Diab Compiler
43  */
44 
45 #if !defined (CORE_CM4_H)
46 #define CORE_CM4_H
47 
48 
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52 
57 #if defined (__GNUC__)
58 #if defined (__VFP_FP__) && !defined (__SOFTFP__)
59 #define ENABLE_FPU
60 #endif
61 
62 #elif defined (__ICCARM__)
63 #if defined __ARMVFP__
64 #define ENABLE_FPU
65 #endif
66 
67 #elif defined (__ghs__) || defined (__DCC__)
68 #if defined (__VFP__)
69 #define ENABLE_FPU
70 #endif
71 
72 #elif defined (__CSMC__)
73 #if (__CSMC__ & 0x400U) /* bit 10: set if hardware FPU selected (+fpu) */
74 #define ENABLE_FPU
75 #endif
76 #endif /* if defined (__GNUC__) */
77 
78 
81 #if defined (__GNUC__)
82 #define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory");
83 #else
84 #define ENABLE_INTERRUPTS() __asm("cpsie i")
85 #endif
86 
87 
90 #if defined (__GNUC__)
91 #define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory");
92 #else
93 #define DISABLE_INTERRUPTS() __asm("cpsid i")
94 #endif
95 
96 
100 #if defined (__GNUC__)
101 #define STANDBY() __asm volatile ("wfi")
102 #else
103 #define STANDBY() __asm("wfi")
104 #endif
105 
106 
109 #if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__)
110 #define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a))
111 #else
112 #define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \
113  | ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U))
114 #endif
115 
118 #if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__)
119 #define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a))
120 #else
121 #define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \
122  | ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U))
123 #endif
124 
127 #if defined ( __GNUC__ )
128  #define START_FUNCTION_DECLARATION_RAMSECTION
129  #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));
130 #elif defined ( __ghs__ )
131  #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far")
132  #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\
133  _Pragma("ghs callmode=default")
134 #elif defined ( __ICCARM__ )
135  #define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc
136  #define END_FUNCTION_DECLARATION_RAMSECTION ;
137 #elif defined ( __DCC__ )
138  #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\"") \
139  _Pragma("use_section CODE")
140  #define END_FUNCTION_DECLARATION_RAMSECTION ;
141 #elif defined ( __CSMC__ )
142  #define START_FUNCTION_DECLARATION_RAMSECTION @ext
143  #define END_FUNCTION_DECLARATION_RAMSECTION ;
144 #else
145  /* Keep compatibility with software analysis tools */
146  #define START_FUNCTION_DECLARATION_RAMSECTION
147  #define END_FUNCTION_DECLARATION_RAMSECTION ;
148 #endif
149 
150 #if defined ( __CSMC__ )
151  #define START_FUNCTION_DEFINITION_RAMSECTION _Pragma("section (code_ram)")
152  #define END_FUNCTION_DEFINITION_RAMSECTION _Pragma("section ()")
153 #else
154  /* For GCC, IAR, GHS and Diab there is no need to specify the section when
155  defining a function, it is enough to specify it at the declaration. This
156  also enables compatibility with software analysis tools. */
157  #define START_FUNCTION_DEFINITION_RAMSECTION
158  #define END_FUNCTION_DEFINITION_RAMSECTION
159 #endif
160 
161 #if defined (__ICCARM__)
162  #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022")
163  #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022")
164 #else
165  #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL
166  #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL
167 #endif
168 
169 
170 #ifdef __cplusplus
171 }
172 #endif
173 
174 #endif /* CORE_CM4_H */
175 
176 /*******************************************************************************
177  * EOF
178  ******************************************************************************/