uc-sdk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
core_cm3.c
Go to the documentation of this file.
1 /**************************************************************************/
24 #include <stdint.h>
25 
26 
31 /* define compiler specific symbols */
32 #if defined ( __CC_ARM )
33  #define __ASM __asm
34  #define __INLINE __inline
36 #elif defined ( __ICCARM__ )
37  #define __ASM __asm
38  #define __INLINE inline
40 #elif defined ( __GNUC__ )
41  #define __ASM __asm
42  #define __INLINE inline
44 #elif defined ( __TASKING__ )
45  #define __ASM __asm
46  #define __INLINE inline
48 #endif
49 
50 
51 /* ################### Compiler specific Intrinsics ########################### */
52 
53 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
54 /* ARM armcc specific functions */
55 
63 __ASM uint32_t __get_PSP(void)
64 {
65  mrs r0, psp
66  bx lr
67 }
68 
77 __ASM void __set_PSP(uint32_t topOfProcStack)
78 {
79  msr psp, r0
80  bx lr
81 }
82 
91 __ASM uint32_t __get_MSP(void)
92 {
93  mrs r0, msp
94  bx lr
95 }
96 
105 __ASM void __set_MSP(uint32_t mainStackPointer)
106 {
107  msr msp, r0
108  bx lr
109 }
110 
119 __ASM uint32_t __REV16(uint16_t value)
120 {
121  rev16 r0, r0
122  bx lr
123 }
124 
133 __ASM int32_t __REVSH(int16_t value)
134 {
135  revsh r0, r0
136  bx lr
137 }
138 
139 
140 #if (__ARMCC_VERSION < 400000)
141 
147 __ASM void __CLREX(void)
148 {
149  clrex
150 }
151 
159 __ASM uint32_t __get_BASEPRI(void)
160 {
161  mrs r0, basepri
162  bx lr
163 }
164 
172 __ASM void __set_BASEPRI(uint32_t basePri)
173 {
174  msr basepri, r0
175  bx lr
176 }
177 
185 __ASM uint32_t __get_PRIMASK(void)
186 {
187  mrs r0, primask
188  bx lr
189 }
190 
198 __ASM void __set_PRIMASK(uint32_t priMask)
199 {
200  msr primask, r0
201  bx lr
202 }
203 
211 __ASM uint32_t __get_FAULTMASK(void)
212 {
213  mrs r0, faultmask
214  bx lr
215 }
216 
224 __ASM void __set_FAULTMASK(uint32_t faultMask)
225 {
226  msr faultmask, r0
227  bx lr
228 }
229 
237 __ASM uint32_t __get_CONTROL(void)
238 {
239  mrs r0, control
240  bx lr
241 }
242 
250 __ASM void __set_CONTROL(uint32_t control)
251 {
252  msr control, r0
253  bx lr
254 }
255 
256 #endif /* __ARMCC_VERSION */
257 
258 
259 
260 #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/
261 /* IAR iccarm specific functions */
262 #pragma diag_suppress=Pe940
263 
271 uint32_t __get_PSP(void)
272 {
273  __ASM("mrs r0, psp");
274  __ASM("bx lr");
275 }
276 
285 void __set_PSP(uint32_t topOfProcStack)
286 {
287  __ASM("msr psp, r0");
288  __ASM("bx lr");
289 }
290 
299 uint32_t __get_MSP(void)
300 {
301  __ASM("mrs r0, msp");
302  __ASM("bx lr");
303 }
304 
313 void __set_MSP(uint32_t topOfMainStack)
314 {
315  __ASM("msr msp, r0");
316  __ASM("bx lr");
317 }
318 
327 uint32_t __REV16(uint16_t value)
328 {
329  __ASM("rev16 r0, r0");
330  __ASM("bx lr");
331 }
332 
341 uint32_t __RBIT(uint32_t value)
342 {
343  __ASM("rbit r0, r0");
344  __ASM("bx lr");
345 }
346 
355 uint8_t __LDREXB(uint8_t *addr)
356 {
357  __ASM("ldrexb r0, [r0]");
358  __ASM("bx lr");
359 }
360 
369 uint16_t __LDREXH(uint16_t *addr)
370 {
371  __ASM("ldrexh r0, [r0]");
372  __ASM("bx lr");
373 }
374 
383 uint32_t __LDREXW(uint32_t *addr)
384 {
385  __ASM("ldrex r0, [r0]");
386  __ASM("bx lr");
387 }
388 
389 #pragma diag_default=Pe940
390 
391 
392 #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
393 /* GNU gcc specific functions */
394 
402 uint32_t __get_PSP(void) __attribute__( ( naked ) );
403 uint32_t __get_PSP(void)
404 {
405  uint32_t result=0;
406 
407  __ASM volatile ("MRS %0, psp\n\t"
408  "MOV r0, %0 \n\t"
409  "BX lr \n\t" : "=r" (result) );
410  return(result);
411 }
412 
421 void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );
422 void __set_PSP(uint32_t topOfProcStack)
423 {
424  __ASM volatile ("MSR psp, %0\n\t"
425  "BX lr \n\t" : : "r" (topOfProcStack) );
426 }
427 
436 uint32_t __get_MSP(void) __attribute__( ( naked ) );
437 uint32_t __get_MSP(void)
438 {
439  uint32_t result=0;
440 
441  __ASM volatile ("MRS %0, msp\n\t"
442  "MOV r0, %0 \n\t"
443  "BX lr \n\t" : "=r" (result) );
444  return(result);
445 }
446 
455 void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );
456 void __set_MSP(uint32_t topOfMainStack)
457 {
458  __ASM volatile ("MSR msp, %0\n\t"
459  "BX lr \n\t" : : "r" (topOfMainStack) );
460 }
461 
469 uint32_t __get_BASEPRI(void)
470 {
471  uint32_t result=0;
472 
473  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
474  return(result);
475 }
476 
484 void __set_BASEPRI(uint32_t value)
485 {
486  __ASM volatile ("MSR basepri, %0" : : "r" (value) );
487 }
488 
496 uint32_t __get_PRIMASK(void)
497 {
498  uint32_t result=0;
499 
500  __ASM volatile ("MRS %0, primask" : "=r" (result) );
501  return(result);
502 }
503 
511 void __set_PRIMASK(uint32_t priMask)
512 {
513  __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
514 }
515 
523 uint32_t __get_FAULTMASK(void)
524 {
525  uint32_t result=0;
526 
527  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
528  return(result);
529 }
530 
538 void __set_FAULTMASK(uint32_t faultMask)
539 {
540  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
541 }
542 
550 uint32_t __get_CONTROL(void)
551 {
552  uint32_t result=0;
553 
554  __ASM volatile ("MRS %0, control" : "=r" (result) );
555  return(result);
556 }
557 
565 void __set_CONTROL(uint32_t control)
566 {
567  __ASM volatile ("MSR control, %0" : : "r" (control) );
568 }
569 
570 
579 uint32_t __REV(uint32_t value)
580 {
581  uint32_t result=0;
582 
583  __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
584  return(result);
585 }
586 
595 uint32_t __REV16(uint16_t value)
596 {
597  uint32_t result=0;
598 
599  __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
600  return(result);
601 }
602 
611 int32_t __REVSH(int16_t value)
612 {
613  uint32_t result=0;
614 
615  __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
616  return(result);
617 }
618 
627 uint32_t __RBIT(uint32_t value)
628 {
629  uint32_t result=0;
630 
631  __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
632  return(result);
633 }
634 
643 uint8_t __LDREXB(uint8_t *addr)
644 {
645  uint8_t result=0;
646 
647  __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
648  return(result);
649 }
650 
659 uint16_t __LDREXH(uint16_t *addr)
660 {
661  uint16_t result=0;
662 
663  __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
664  return(result);
665 }
666 
675 uint32_t __LDREXW(uint32_t *addr)
676 {
677  uint32_t result=0;
678 
679  __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
680  return(result);
681 }
682 
683 #elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/
684 /* TASKING carm specific functions */
685 
686 /*
687  * The CMSIS functions have been implemented as intrinsics in the compiler.
688  * Please use "carm -?i" to get an up to date list of all instrinsics,
689  * Including the CMSIS ones.
690  */
691 
692 #endif
693