core_cm3.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. /**************************************************************************//**
  2. * @file core_cm3.c
  3. * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File
  4. * @version V1.30
  5. * @date 30. October 2009
  6. *
  7. * @note
  8. * Copyright (C) 2009 ARM Limited. All rights reserved.
  9. *
  10. * @par
  11. * ARM Limited (ARM) is supplying this software for use with Cortex-M
  12. * processor based microcontrollers. This file can be freely distributed
  13. * within development tools that are supporting such ARM based processors.
  14. *
  15. * @par
  16. * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
  17. * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
  19. * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
  20. * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
  21. *
  22. ******************************************************************************/
  23. /*******************************************************************************
  24. * Microsemi SoC Products Group SVN revision number for the purpose of tracking
  25. * changes done to original file supplied by ARM:
  26. * SVN $Revision: 6671 $
  27. * SVN $Date: 2014-07-04 12:15:22 +0100 (Fri, 04 Jul 2014) $
  28. ******************************************************************************/
  29. #include <stdint.h>
  30. /* define compiler specific symbols */
  31. #if defined ( __CC_ARM )
  32. #define __ASM __asm /*!< asm keyword for ARM Compiler */
  33. #define __INLINE __inline /*!< inline keyword for ARM Compiler */
  34. #elif defined ( __ICCARM__ )
  35. #define __ASM __asm /*!< asm keyword for IAR Compiler */
  36. #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */
  37. #elif defined ( __GNUC__ )
  38. #define __ASM __asm /*!< asm keyword for GNU Compiler */
  39. #define __INLINE inline /*!< inline keyword for GNU Compiler */
  40. #elif defined ( __TASKING__ )
  41. #define __ASM __asm /*!< asm keyword for TASKING Compiler */
  42. #define __INLINE inline /*!< inline keyword for TASKING Compiler */
  43. #endif
  44. /* ################### Compiler specific Intrinsics ########################### */
  45. #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
  46. /* ARM armcc specific functions */
  47. /**
  48. * @brief Return the Process Stack Pointer
  49. *
  50. * @return ProcessStackPointer
  51. *
  52. * Return the actual process stack pointer
  53. */
  54. __ASM uint32_t __get_PSP(void)
  55. {
  56. mrs r0, psp
  57. bx lr
  58. }
  59. /**
  60. * @brief Set the Process Stack Pointer
  61. *
  62. * @param topOfProcStack Process Stack Pointer
  63. *
  64. * Assign the value ProcessStackPointer to the MSP
  65. * (process stack pointer) Cortex processor register
  66. */
  67. __ASM void __set_PSP(uint32_t topOfProcStack)
  68. {
  69. msr psp, r0
  70. bx lr
  71. }
  72. /**
  73. * @brief Return the Main Stack Pointer
  74. *
  75. * @return Main Stack Pointer
  76. *
  77. * Return the current value of the MSP (main stack pointer)
  78. * Cortex processor register
  79. */
  80. __ASM uint32_t __get_MSP(void)
  81. {
  82. mrs r0, msp
  83. bx lr
  84. }
  85. /**
  86. * @brief Set the Main Stack Pointer
  87. *
  88. * @param topOfMainStack Main Stack Pointer
  89. *
  90. * Assign the value mainStackPointer to the MSP
  91. * (main stack pointer) Cortex processor register
  92. */
  93. __ASM void __set_MSP(uint32_t mainStackPointer)
  94. {
  95. msr msp, r0
  96. bx lr
  97. }
  98. /**
  99. * @brief Reverse byte order in unsigned short value
  100. *
  101. * @param value value to reverse
  102. * @return reversed value
  103. *
  104. * Reverse byte order in unsigned short value
  105. */
  106. __ASM uint32_t __REV16(uint16_t value)
  107. {
  108. rev16 r0, r0
  109. bx lr
  110. }
  111. /**
  112. * @brief Reverse byte order in signed short value with sign extension to integer
  113. *
  114. * @param value value to reverse
  115. * @return reversed value
  116. *
  117. * Reverse byte order in signed short value with sign extension to integer
  118. */
  119. __ASM int32_t __REVSH(int16_t value)
  120. {
  121. revsh r0, r0
  122. bx lr
  123. }
  124. #if (__ARMCC_VERSION < 400000)
  125. /**
  126. * @brief Remove the exclusive lock created by ldrex
  127. *
  128. * Removes the exclusive lock which is created by ldrex.
  129. */
  130. __ASM void __CLREX(void)
  131. {
  132. clrex
  133. }
  134. /**
  135. * @brief Return the Base Priority value
  136. *
  137. * @return BasePriority
  138. *
  139. * Return the content of the base priority register
  140. */
  141. __ASM uint32_t __get_BASEPRI(void)
  142. {
  143. mrs r0, basepri
  144. bx lr
  145. }
  146. /**
  147. * @brief Set the Base Priority value
  148. *
  149. * @param basePri BasePriority
  150. *
  151. * Set the base priority register
  152. */
  153. __ASM void __set_BASEPRI(uint32_t basePri)
  154. {
  155. msr basepri, r0
  156. bx lr
  157. }
  158. /**
  159. * @brief Return the Priority Mask value
  160. *
  161. * @return PriMask
  162. *
  163. * Return state of the priority mask bit from the priority mask register
  164. */
  165. __ASM uint32_t __get_PRIMASK(void)
  166. {
  167. mrs r0, primask
  168. bx lr
  169. }
  170. /**
  171. * @brief Set the Priority Mask value
  172. *
  173. * @param priMask PriMask
  174. *
  175. * Set the priority mask bit in the priority mask register
  176. */
  177. __ASM void __set_PRIMASK(uint32_t priMask)
  178. {
  179. msr primask, r0
  180. bx lr
  181. }
  182. /**
  183. * @brief Return the Fault Mask value
  184. *
  185. * @return FaultMask
  186. *
  187. * Return the content of the fault mask register
  188. */
  189. __ASM uint32_t __get_FAULTMASK(void)
  190. {
  191. mrs r0, faultmask
  192. bx lr
  193. }
  194. /**
  195. * @brief Set the Fault Mask value
  196. *
  197. * @param faultMask faultMask value
  198. *
  199. * Set the fault mask register
  200. */
  201. __ASM void __set_FAULTMASK(uint32_t faultMask)
  202. {
  203. msr faultmask, r0
  204. bx lr
  205. }
  206. /**
  207. * @brief Return the Control Register value
  208. *
  209. * @return Control value
  210. *
  211. * Return the content of the control register
  212. */
  213. __ASM uint32_t __get_CONTROL(void)
  214. {
  215. mrs r0, control
  216. bx lr
  217. }
  218. /**
  219. * @brief Set the Control Register value
  220. *
  221. * @param control Control value
  222. *
  223. * Set the control register
  224. */
  225. __ASM void __set_CONTROL(uint32_t control)
  226. {
  227. msr control, r0
  228. bx lr
  229. }
  230. #endif /* __ARMCC_VERSION */
  231. #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/
  232. /* IAR iccarm specific functions */
  233. #pragma diag_suppress=Pe940
  234. /**
  235. * @brief Return the Process Stack Pointer
  236. *
  237. * @return ProcessStackPointer
  238. *
  239. * Return the actual process stack pointer
  240. */
  241. #if (__VER__ < 6020000)
  242. uint32_t __get_PSP(void)
  243. {
  244. __ASM("mrs r0, psp");
  245. __ASM("bx lr");
  246. }
  247. #endif
  248. /**
  249. * @brief Set the Process Stack Pointer
  250. *
  251. * @param topOfProcStack Process Stack Pointer
  252. *
  253. * Assign the value ProcessStackPointer to the MSP
  254. * (process stack pointer) Cortex processor register
  255. */
  256. #if (__VER__ < 6020000)
  257. void __set_PSP(uint32_t topOfProcStack)
  258. {
  259. __ASM("msr psp, r0");
  260. __ASM("bx lr");
  261. }
  262. #endif
  263. /**
  264. * @brief Return the Main Stack Pointer
  265. *
  266. * @return Main Stack Pointer
  267. *
  268. * Return the current value of the MSP (main stack pointer)
  269. * Cortex processor register
  270. */
  271. #if (__VER__ < 6020000)
  272. uint32_t __get_MSP(void)
  273. {
  274. __ASM("mrs r0, msp");
  275. __ASM("bx lr");
  276. }
  277. #endif
  278. /**
  279. * @brief Set the Main Stack Pointer
  280. *
  281. * @param topOfMainStack Main Stack Pointer
  282. *
  283. * Assign the value mainStackPointer to the MSP
  284. * (main stack pointer) Cortex processor register
  285. */
  286. #if (__VER__ < 6020000)
  287. void __set_MSP(uint32_t topOfMainStack)
  288. {
  289. __ASM("msr msp, r0");
  290. __ASM("bx lr");
  291. }
  292. #endif
  293. /**
  294. * @brief Reverse byte order in unsigned short value
  295. *
  296. * @param value value to reverse
  297. * @return reversed value
  298. *
  299. * Reverse byte order in unsigned short value
  300. */
  301. #if (__VER__ < 6020000)
  302. uint32_t __REV16(uint16_t value)
  303. {
  304. __ASM("rev16 r0, r0");
  305. __ASM("bx lr");
  306. }
  307. #endif
  308. /**
  309. * @brief Reverse bit order of value
  310. *
  311. * @param value value to reverse
  312. * @return reversed value
  313. *
  314. * Reverse bit order of value
  315. */
  316. #if (__VER__ < 6020000)
  317. uint32_t __RBIT(uint32_t value)
  318. {
  319. __ASM("rbit r0, r0");
  320. __ASM("bx lr");
  321. }
  322. #endif
  323. /**
  324. * @brief LDR Exclusive (8 bit)
  325. *
  326. * @param *addr address pointer
  327. * @return value of (*address)
  328. *
  329. * Exclusive LDR command for 8 bit values)
  330. */
  331. #if (__VER__ < 6020000)
  332. uint8_t __LDREXB(uint8_t *addr)
  333. {
  334. __ASM("ldrexb r0, [r0]");
  335. __ASM("bx lr");
  336. }
  337. #endif
  338. /**
  339. * @brief LDR Exclusive (16 bit)
  340. *
  341. * @param *addr address pointer
  342. * @return value of (*address)
  343. *
  344. * Exclusive LDR command for 16 bit values
  345. */
  346. #if (__VER__ < 6020000)
  347. uint16_t __LDREXH(uint16_t *addr)
  348. {
  349. __ASM("ldrexh r0, [r0]");
  350. __ASM("bx lr");
  351. }
  352. #endif
  353. /**
  354. * @brief LDR Exclusive (32 bit)
  355. *
  356. * @param *addr address pointer
  357. * @return value of (*address)
  358. *
  359. * Exclusive LDR command for 32 bit values
  360. */
  361. uint32_t __LDREXW(uint32_t *addr)
  362. {
  363. __ASM("ldrex r0, [r0]");
  364. __ASM("bx lr");
  365. }
  366. /**
  367. * @brief STR Exclusive (8 bit)
  368. *
  369. * @param value value to store
  370. * @param *addr address pointer
  371. * @return successful / failed
  372. *
  373. * Exclusive STR command for 8 bit values
  374. */
  375. #if (__VER__ < 6020000)
  376. uint32_t __STREXB(uint8_t value, uint8_t *addr)
  377. {
  378. __ASM("strexb r0, r0, [r1]");
  379. __ASM("bx lr");
  380. }
  381. #endif
  382. /**
  383. * @brief STR Exclusive (16 bit)
  384. *
  385. * @param value value to store
  386. * @param *addr address pointer
  387. * @return successful / failed
  388. *
  389. * Exclusive STR command for 16 bit values
  390. */
  391. #if (__VER__ < 6020000)
  392. uint32_t __STREXH(uint16_t value, uint16_t *addr)
  393. {
  394. __ASM("strexh r0, r0, [r1]");
  395. __ASM("bx lr");
  396. }
  397. #endif
  398. /**
  399. * @brief STR Exclusive (32 bit)
  400. *
  401. * @param value value to store
  402. * @param *addr address pointer
  403. * @return successful / failed
  404. *
  405. * Exclusive STR command for 32 bit values
  406. */
  407. uint32_t __STREXW(uint32_t value, uint32_t *addr)
  408. {
  409. __ASM("strex r0, r0, [r1]");
  410. __ASM("bx lr");
  411. }
  412. #pragma diag_default=Pe940
  413. #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
  414. /* GNU gcc specific functions */
  415. /**
  416. * @brief Return the Process Stack Pointer
  417. *
  418. * @return ProcessStackPointer
  419. *
  420. * Return the actual process stack pointer
  421. */
  422. uint32_t __get_PSP(void) __attribute__( ( naked ) );
  423. uint32_t __get_PSP(void)
  424. {
  425. uint32_t result=0;
  426. __ASM volatile ("MRS %0, psp\n\t"
  427. "MOV r0, %0 \n\t"
  428. "BX lr \n\t" : "=r" (result) );
  429. return(result);
  430. }
  431. /**
  432. * @brief Set the Process Stack Pointer
  433. *
  434. * @param topOfProcStack Process Stack Pointer
  435. *
  436. * Assign the value ProcessStackPointer to the MSP
  437. * (process stack pointer) Cortex processor register
  438. */
  439. void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );
  440. void __set_PSP(uint32_t topOfProcStack)
  441. {
  442. __ASM volatile ("MSR psp, %0\n\t"
  443. "BX lr \n\t" : : "r" (topOfProcStack) );
  444. }
  445. /**
  446. * @brief Return the Main Stack Pointer
  447. *
  448. * @return Main Stack Pointer
  449. *
  450. * Return the current value of the MSP (main stack pointer)
  451. * Cortex processor register
  452. */
  453. uint32_t __get_MSP(void) __attribute__( ( naked ) );
  454. uint32_t __get_MSP(void)
  455. {
  456. uint32_t result=0;
  457. __ASM volatile ("MRS %0, msp\n\t"
  458. "MOV r0, %0 \n\t"
  459. "BX lr \n\t" : "=r" (result) );
  460. return(result);
  461. }
  462. /**
  463. * @brief Set the Main Stack Pointer
  464. *
  465. * @param topOfMainStack Main Stack Pointer
  466. *
  467. * Assign the value mainStackPointer to the MSP
  468. * (main stack pointer) Cortex processor register
  469. */
  470. void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );
  471. void __set_MSP(uint32_t topOfMainStack)
  472. {
  473. __ASM volatile ("MSR msp, %0\n\t"
  474. "BX lr \n\t" : : "r" (topOfMainStack) );
  475. }
  476. /**
  477. * @brief Return the Base Priority value
  478. *
  479. * @return BasePriority
  480. *
  481. * Return the content of the base priority register
  482. */
  483. uint32_t __get_BASEPRI(void)
  484. {
  485. uint32_t result=0;
  486. __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
  487. return(result);
  488. }
  489. /**
  490. * @brief Set the Base Priority value
  491. *
  492. * @param basePri BasePriority
  493. *
  494. * Set the base priority register
  495. */
  496. void __set_BASEPRI(uint32_t value)
  497. {
  498. __ASM volatile ("MSR basepri, %0" : : "r" (value) );
  499. }
  500. /**
  501. * @brief Return the Priority Mask value
  502. *
  503. * @return PriMask
  504. *
  505. * Return state of the priority mask bit from the priority mask register
  506. */
  507. uint32_t __get_PRIMASK(void)
  508. {
  509. uint32_t result=0;
  510. __ASM volatile ("MRS %0, primask" : "=r" (result) );
  511. return(result);
  512. }
  513. /**
  514. * @brief Set the Priority Mask value
  515. *
  516. * @param priMask PriMask
  517. *
  518. * Set the priority mask bit in the priority mask register
  519. */
  520. void __set_PRIMASK(uint32_t priMask)
  521. {
  522. __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
  523. }
  524. /**
  525. * @brief Return the Fault Mask value
  526. *
  527. * @return FaultMask
  528. *
  529. * Return the content of the fault mask register
  530. */
  531. uint32_t __get_FAULTMASK(void)
  532. {
  533. uint32_t result=0;
  534. __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
  535. return(result);
  536. }
  537. /**
  538. * @brief Set the Fault Mask value
  539. *
  540. * @param faultMask faultMask value
  541. *
  542. * Set the fault mask register
  543. */
  544. void __set_FAULTMASK(uint32_t faultMask)
  545. {
  546. __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
  547. }
  548. /**
  549. * @brief Return the Control Register value
  550. *
  551. * @return Control value
  552. *
  553. * Return the content of the control register
  554. */
  555. uint32_t __get_CONTROL(void)
  556. {
  557. uint32_t result=0;
  558. __ASM volatile ("MRS %0, control" : "=r" (result) );
  559. return(result);
  560. }
  561. /**
  562. * @brief Set the Control Register value
  563. *
  564. * @param control Control value
  565. *
  566. * Set the control register
  567. */
  568. void __set_CONTROL(uint32_t control)
  569. {
  570. __ASM volatile ("MSR control, %0" : : "r" (control) );
  571. }
  572. /**
  573. * @brief Reverse byte order in integer value
  574. *
  575. * @param value value to reverse
  576. * @return reversed value
  577. *
  578. * Reverse byte order in integer value
  579. */
  580. uint32_t __REV(uint32_t value)
  581. {
  582. uint32_t result=0;
  583. __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
  584. return(result);
  585. }
  586. /**
  587. * @brief Reverse byte order in unsigned short value
  588. *
  589. * @param value value to reverse
  590. * @return reversed value
  591. *
  592. * Reverse byte order in unsigned short value
  593. */
  594. uint32_t __REV16(uint16_t value)
  595. {
  596. uint32_t result=0;
  597. __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
  598. return(result);
  599. }
  600. /**
  601. * @brief Reverse byte order in signed short value with sign extension to integer
  602. *
  603. * @param value value to reverse
  604. * @return reversed value
  605. *
  606. * Reverse byte order in signed short value with sign extension to integer
  607. */
  608. int32_t __REVSH(int16_t value)
  609. {
  610. uint32_t result=0;
  611. __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
  612. return(result);
  613. }
  614. /**
  615. * @brief Reverse bit order of value
  616. *
  617. * @param value value to reverse
  618. * @return reversed value
  619. *
  620. * Reverse bit order of value
  621. */
  622. uint32_t __RBIT(uint32_t value)
  623. {
  624. uint32_t result=0;
  625. __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
  626. return(result);
  627. }
  628. /**
  629. * @brief LDR Exclusive (8 bit)
  630. *
  631. * @param *addr address pointer
  632. * @return value of (*address)
  633. *
  634. * Exclusive LDR command for 8 bit value
  635. */
  636. uint8_t __LDREXB(uint8_t *addr)
  637. {
  638. uint8_t result=0;
  639. __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
  640. return(result);
  641. }
  642. /**
  643. * @brief LDR Exclusive (16 bit)
  644. *
  645. * @param *addr address pointer
  646. * @return value of (*address)
  647. *
  648. * Exclusive LDR command for 16 bit values
  649. */
  650. uint16_t __LDREXH(uint16_t *addr)
  651. {
  652. uint16_t result=0;
  653. __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
  654. return(result);
  655. }
  656. /**
  657. * @brief LDR Exclusive (32 bit)
  658. *
  659. * @param *addr address pointer
  660. * @return value of (*address)
  661. *
  662. * Exclusive LDR command for 32 bit values
  663. */
  664. uint32_t __LDREXW(uint32_t *addr)
  665. {
  666. uint32_t result=0;
  667. __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
  668. return(result);
  669. }
  670. /**
  671. * @brief STR Exclusive (8 bit)
  672. *
  673. * @param value value to store
  674. * @param *addr address pointer
  675. * @return successful / failed
  676. *
  677. * Exclusive STR command for 8 bit values
  678. */
  679. uint32_t __STREXB(uint8_t value, uint8_t *addr)
  680. {
  681. uint32_t result=0;
  682. __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
  683. return(result);
  684. }
  685. /**
  686. * @brief STR Exclusive (16 bit)
  687. *
  688. * @param value value to store
  689. * @param *addr address pointer
  690. * @return successful / failed
  691. *
  692. * Exclusive STR command for 16 bit values
  693. */
  694. uint32_t __STREXH(uint16_t value, uint16_t *addr)
  695. {
  696. uint32_t result=0;
  697. __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
  698. return(result);
  699. }
  700. /**
  701. * @brief STR Exclusive (32 bit)
  702. *
  703. * @param value value to store
  704. * @param *addr address pointer
  705. * @return successful / failed
  706. *
  707. * Exclusive STR command for 32 bit values
  708. */
  709. uint32_t __STREXW(uint32_t value, uint32_t *addr)
  710. {
  711. uint32_t result=0;
  712. __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
  713. return(result);
  714. }
  715. #elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/
  716. /* TASKING carm specific functions */
  717. /*
  718. * The CMSIS functions have been implemented as intrinsics in the compiler.
  719. * Please use "carm -?i" to get an up to date list of all instrinsics,
  720. * Including the CMSIS ones.
  721. */
  722. #endif