]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_M0_LPC1114_LPCXpresso/CMSISv2p00_LPC11xx/src/core_cm0.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_M0_LPC1114_LPCXpresso / CMSISv2p00_LPC11xx / src / core_cm0.c
1 /**************************************************************************//**\r
2  * @file     core_cm0.c\r
3  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Source File\r
4  * @version  V2.00\r
5  * @date     10. September 2010\r
6  *\r
7  * @note\r
8  * Copyright (C) 2009-2010 ARM Limited. All rights reserved.\r
9  *\r
10  * @par\r
11  * ARM Limited (ARM) is supplying this software for use with Cortex-M \r
12  * processor based microcontrollers.  This file can be freely distributed \r
13  * within development tools that are supporting such ARM based processors. \r
14  *\r
15  * @par\r
16  * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
17  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
19  * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
20  * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
21  *\r
22  ******************************************************************************/\r
23 \r
24 #include <stdint.h>\r
25 \r
26 /* define compiler specific symbols */\r
27 #if defined ( __CC_ARM   )\r
28   #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */\r
29   #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */\r
30 \r
31 #elif defined ( __ICCARM__ )\r
32   #define __ASM           __asm                                       /*!< asm keyword for IAR Compiler          */\r
33   #define __INLINE        inline                                      /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */\r
34 \r
35 #elif defined   (  __GNUC__  )\r
36   #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */\r
37   #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */\r
38 \r
39 #elif defined   (  __TASKING__  )\r
40   #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */\r
41   #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */\r
42 \r
43 #endif\r
44 \r
45 \r
46 /* ##########################  Core Instruction Access  ######################### */\r
47 \r
48 #if defined ( __CC_ARM   ) /*------------------ RealView Compiler ----------------*/\r
49 \r
50 /** \brief  Reverse byte order (16 bit)\r
51 \r
52     This function reverses the byte order in two unsigned short values.\r
53 \r
54     \param [in]    value  Value to reverse\r
55     \return               Reversed value\r
56  */\r
57 #if (__ARMCC_VERSION < 400677)\r
58 __ASM uint32_t __REV16(uint32_t value)\r
59 {\r
60   rev16 r0, r0\r
61   bx lr\r
62 }\r
63 #endif /* __ARMCC_VERSION  */ \r
64 \r
65 \r
66 /** \brief  Reverse byte order in signed short value\r
67 \r
68     This function reverses the byte order in a signed short value with sign extension to integer.\r
69 \r
70     \param [in]    value  Value to reverse\r
71     \return               Reversed value\r
72  */\r
73 #if (__ARMCC_VERSION < 400677)\r
74 __ASM int32_t __REVSH(int32_t value)\r
75 {\r
76   revsh r0, r0\r
77   bx lr\r
78 }\r
79 #endif /* __ARMCC_VERSION  */ \r
80 \r
81 \r
82 /** \brief  Remove the exclusive lock\r
83 \r
84     This function removes the exclusive lock which is created by LDREX.\r
85 \r
86  */\r
87 #if (__ARMCC_VERSION < 400000)\r
88 __ASM void __CLREX(void)\r
89 {\r
90   clrex\r
91 }\r
92 #endif /* __ARMCC_VERSION  */ \r
93 \r
94 \r
95 #elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/\r
96 /* obsolete */\r
97 #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/\r
98 /* obsolete */\r
99 #elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/\r
100 /* obsolete */\r
101 #endif\r
102 \r
103 \r
104 /* ###########################  Core Function Access  ########################### */\r
105 \r
106 #if defined ( __CC_ARM   ) /*------------------ RealView Compiler ----------------*/\r
107 \r
108 /** \brief  Get Control Register\r
109 \r
110     This function returns the content of the Control Register.\r
111 \r
112     \return               Control Register value\r
113  */\r
114 #if       (__ARMCC_VERSION <  400000)\r
115 __ASM uint32_t __get_CONTROL(void)\r
116 {\r
117   mrs r0, control\r
118   bx lr\r
119 }\r
120 #endif /*  __ARMCC_VERSION  */ \r
121 \r
122 \r
123 /** \brief  Set Control Register\r
124 \r
125     This function writes the given value to the Control Register.\r
126 \r
127     \param [in]    control  Control Register value to set\r
128  */\r
129 #if       (__ARMCC_VERSION <  400000)\r
130 __ASM void __set_CONTROL(uint32_t control)\r
131 {\r
132   msr control, r0\r
133   bx lr\r
134 }\r
135 #endif /*  __ARMCC_VERSION  */ \r
136 \r
137 \r
138 /** \brief  Get ISPR Register\r
139 \r
140     This function returns the content of the ISPR Register.\r
141 \r
142     \return               ISPR Register value\r
143  */\r
144 #if       (__ARMCC_VERSION <  400000)\r
145 __ASM uint32_t __get_IPSR(void)\r
146 {\r
147   mrs r0, ipsr\r
148   bx lr\r
149 }\r
150 #endif /*  __ARMCC_VERSION  */ \r
151 \r
152 \r
153 /** \brief  Get APSR Register\r
154 \r
155     This function returns the content of the APSR Register.\r
156 \r
157     \return               APSR Register value\r
158  */\r
159 #if       (__ARMCC_VERSION <  400000)\r
160 __ASM uint32_t __get_APSR(void)\r
161 {\r
162   mrs r0, apsr\r
163   bx lr\r
164 }\r
165 #endif /*  __ARMCC_VERSION  */ \r
166 \r
167 \r
168 /** \brief  Get xPSR Register\r
169 \r
170     This function returns the content of the xPSR Register.\r
171 \r
172     \return               xPSR Register value\r
173  */\r
174 #if       (__ARMCC_VERSION <  400000)\r
175 __ASM uint32_t __get_xPSR(void)\r
176 {\r
177   mrs r0, xpsr\r
178   bx lr\r
179 }\r
180 #endif /*  __ARMCC_VERSION  */ \r
181 \r
182 \r
183 /** \brief  Get Process Stack Pointer\r
184 \r
185     This function returns the current value of the Process Stack Pointer (PSP).\r
186 \r
187     \return               PSP Register value\r
188  */\r
189 #if       (__ARMCC_VERSION <  400000)\r
190 __ASM uint32_t __get_PSP(void)\r
191 {\r
192   mrs r0, psp\r
193   bx lr\r
194 }\r
195 #endif /*  __ARMCC_VERSION  */ \r
196 \r
197 \r
198 /** \brief  Set Process Stack Pointer\r
199 \r
200     This function assigns the given value to the Process Stack Pointer (PSP).\r
201 \r
202     \param [in]    topOfProcStack  Process Stack Pointer value to set\r
203  */\r
204 #if       (__ARMCC_VERSION <  400000)\r
205 __ASM void __set_PSP(uint32_t topOfProcStack)\r
206 {\r
207   msr psp, r0\r
208   bx lr\r
209 }\r
210 #endif /*  __ARMCC_VERSION  */ \r
211 \r
212 \r
213 /** \brief  Get Main Stack Pointer\r
214 \r
215     This function returns the current value of the Main Stack Pointer (MSP).\r
216 \r
217     \return               MSP Register value\r
218  */\r
219 #if       (__ARMCC_VERSION <  400000)\r
220 __ASM uint32_t __get_MSP(void)\r
221 {\r
222   mrs r0, msp\r
223   bx lr\r
224 }\r
225 #endif /*  __ARMCC_VERSION  */ \r
226 \r
227 \r
228 /** \brief  Set Main Stack Pointer\r
229 \r
230     This function assigns the given value to the Main Stack Pointer (MSP).\r
231 \r
232     \param [in]    topOfMainStack  Main Stack Pointer value to set\r
233  */\r
234 #if       (__ARMCC_VERSION <  400000)\r
235 __ASM void __set_MSP(uint32_t mainStackPointer)\r
236 {\r
237   msr msp, r0\r
238   bx lr\r
239 }\r
240 #endif /*  __ARMCC_VERSION  */ \r
241 \r
242 \r
243 /** \brief  Get Priority Mask\r
244 \r
245     This function returns the current state of the priority mask bit from the Priority Mask Register.\r
246 \r
247     \return               Priority Mask value\r
248  */\r
249 #if       (__ARMCC_VERSION <  400000)\r
250 __ASM uint32_t __get_PRIMASK(void)\r
251 {\r
252   mrs r0, primask\r
253   bx lr\r
254 }\r
255 #endif /*  __ARMCC_VERSION  */ \r
256 \r
257 \r
258 /** \brief  Set Priority Mask\r
259 \r
260     This function assigns the given value to the Priority Mask Register.\r
261 \r
262     \param [in]    priMask  Priority Mask\r
263  */\r
264 #if       (__ARMCC_VERSION <  400000)\r
265 __ASM void __set_PRIMASK(uint32_t priMask)\r
266 {\r
267   msr primask, r0\r
268   bx lr\r
269 }\r
270 #endif /*  __ARMCC_VERSION  */ \r
271  \r
272 \r
273 #elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/\r
274 /* obsolete */\r
275 #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/\r
276 /* obsolete */\r
277 #elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/\r
278 /* obsolete */\r
279 #endif\r