2 \defgroup intrinsic_CPU_gr Intrinsic Functions for CPU Instructions
4 \brief Functions that generate specific Cortex-M CPU Instructions.
6 The following functions generate specific Cortex-M instructions that cannot be directly accessed by the C/C++ Compiler.
7 Refer to the \ref ref_man_sec for detailed information about these Cortex-M instructions.
10 When using the ARM Compiler Toolchain the following \ref intrinsic_CPU_gr are implemented using the Embedded Assembler: \ref __RRX, <Bruno: add more...>.
11 The usage of the Embedded Assembler can be disabled by with <b><i>define __NO_EMBEDDED_ASM</i></b>. This avoids potential side effects of the Embedded Assembler.
12 Refer to <b>Compiler User Guide - Using the Inline and Embedded Assemblers of the ARM Compiler</b> for more information.
15 /**************************************************************************************************/
16 /** \brief No Operation
18 This function does nothing. This instruction can be used for code alignment purposes.
23 /**************************************************************************************************/
24 /** \brief Wait For Interrupt
26 WFI is a hint instruction that suspends execution until one of the following events occurs:
27 - A non-masked interrupt occurs and is taken.
28 - An interrupt masked by PRIMASK becomes pending.
29 - A Debug Entry request.
34 /**************************************************************************************************/
35 /** \brief Wait For Event
37 Wait For Event is a hint instruction that permits the processor to enter
38 a low-power state until an events occurs:
39 \li If the <b>event register is 0</b>, then WFE suspends execution until one of the following events occurs:
40 - An exception, unless masked by the exception mask registers or the current priority level.
41 - An exception enters the Pending state, if SEVONPEND in the System Control Register is set.
42 - A Debug Entry request, if Debug is enabled.
43 - An event signaled by a peripheral or another processor in a multiprocessor system using
46 \li If the <b>event register is 1</b>, then WFE clears it to 0 and returns immediately.
52 /**************************************************************************************************/
55 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
60 /**************************************************************************************************/
61 /** \brief Set Breakpoint
63 This function causes the processor to enter Debug state.
64 Debug tools can use this to investigate system state when the instruction at a particular address is reached.
66 \param [in] value is ignored by the processor. If required, a debugger can use it to obtain additional information about the breakpoint.
68 void __BKPT(uint8_t value);
71 /**************************************************************************************************/
72 /** \brief Instruction Synchronization Barrier
74 Instruction Synchronization Barrier flushes the pipeline in the processor,
75 so that all instructions following the ISB are fetched from cache or
76 memory, after the instruction has been completed.
81 /**************************************************************************************************/
82 /** \brief Data Synchronization Barrier
85 This function acts as a special kind of Data Memory Barrier.
86 It completes when all explicit memory accesses before this instruction complete.
91 /**************************************************************************************************/
92 /** \brief Data Memory Barrier
95 This function ensures the apparent order of the explicit memory operations before
96 and after the instruction, without ensuring their completion.
101 /**************************************************************************************************/
102 /** \brief Reverse byte order (32 bit)
104 This function reverses the byte order in integer value.
106 \param [in] value Value to reverse
107 \return Reversed value
109 uint32_t __REV(uint32_t value);
112 /**************************************************************************************************/
113 /** \brief Reverse byte order (16 bit)
116 This function reverses the byte order in two unsigned short values.
118 \param [in] value Value to reverse
119 \return Reversed value
121 uint32_t __REV16(uint32_t value);
124 /**************************************************************************************************/
125 /** \brief Reverse byte order in signed short value
128 This function reverses the byte order in a signed short value with sign extension to integer.
130 \param [in] value Value to reverse
131 \return Reversed value
133 int32_t __REVSH(int32_t value);
136 /**************************************************************************************************/
137 /** \brief Reverse bit order of value [not for Cortex-M0, Cortex-M0+, or SC000]
139 This function reverses the bit order of the given value [not for Cortex-M0, Cortex-M0+, or SC000].
141 \param [in] value Value to reverse
142 \return Reversed value
144 uint32_t __RBIT(uint32_t value);
147 /**************************************************************************************************/
148 /** \brief Rotate a value right by a number of bits
150 This function rotates a value right by a specified number of bits.
152 \param [in] value Value to be shifted right
153 \param [in] shift Number of bits in the range [1..31]
154 \return Rotated value
157 uint32_t __ROR(uint32_t value, uint32_t shift);
160 /**************************************************************************************************/
161 /** \brief LDR Exclusive (8 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
163 This function executed an exclusive LDR command for 8 bit value [not for Cortex-M0, Cortex-M0+, or SC000].
165 \param [in] *addr Pointer to data
166 \return value of type uint8_t at (*addr)
168 uint8_t __LDREXB(volatile uint8_t *addr);
171 /**************************************************************************************************/
172 /** \brief LDR Exclusive (16 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
174 This function executed an exclusive LDR command for 16 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
176 \param [in] *addr Pointer to data
177 \return value of type uint16_t at (*addr)
179 uint16_t __LDREXH(volatile uint16_t *addr);
182 /**************************************************************************************************/
183 /** \brief LDR Exclusive (32 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
185 This function executed an exclusive LDR command for 32 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
187 \param [in] *addr Pointer to data
188 \return value of type uint32_t at (*addr)
190 uint32_t __LDREXW(volatile uint32_t *addr);
193 /**************************************************************************************************/
194 /** \brief STR Exclusive (8 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
196 This function executed an exclusive STR command for 8 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
198 \param [in] value Value to store
199 \param [in] *addr Pointer to location
200 \return 0 Function succeeded
201 \return 1 Function failed
203 uint32_t __STREXB(uint8_t value, volatile uint8_t *addr);
206 /**************************************************************************************************/
207 /** \brief STR Exclusive (16 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
209 This function executed an exclusive STR command for 16 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
211 \param [in] value Value to store
212 \param [in] *addr Pointer to location
213 \return 0 Function succeeded
214 \return 1 Function failed
216 uint32_t __STREXH(uint16_t value, volatile uint16_t *addr);
219 /**************************************************************************************************/
220 /** \brief STR Exclusive (32 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
222 This function executed an exclusive STR command for 32 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
224 \param [in] value Value to store
225 \param [in] *addr Pointer to location
226 \return 0 Function succeeded
227 \return 1 Function failed
229 uint32_t __STREXW(uint32_t value, volatile uint32_t *addr);
232 /**************************************************************************************************/
233 /** \brief Remove the exclusive lock [not for Cortex-M0, Cortex-M0+, or SC000]
235 This function removes the exclusive lock which is created by LDREX [not for Cortex-M0, Cortex-M0+, or SC000].
241 /**************************************************************************************************/
242 /** \brief Signed Saturate [not for Cortex-M0, Cortex-M0+, or SC000]
244 This function saturates a signed value [not for Cortex-M0, Cortex-M0+, or SC000].
246 \param [in] value Value to be saturated
247 \param [in] sat Bit position to saturate to [1..32]
248 \return Saturated value
250 uint32_t __SSAT(unint32_t value, uint32_t sat);
253 /**************************************************************************************************/
254 /** \brief Unsigned Saturate [not for Cortex-M0, Cortex-M0+, or SC000]
256 This function saturates an unsigned value [not for Cortex-M0, Cortex-M0+, or SC000].
258 \param [in] value Value to be saturated
259 \param [in] sat Bit position to saturate to [0..31]
260 \return Saturated value
262 uint32_t __USAT(uint32_t value, uint32_t sat);
265 /**************************************************************************************************/
266 /** \brief Count leading zeros [not for Cortex-M0, Cortex-M0+, or SC000]
268 This function counts the number of leading zeros of a data value [not for Cortex-M0, Cortex-M0+, or SC000].
270 \param [in] value Value to count the leading zeros
271 \return number of leading zeros in value
273 uint8_t __CLZ(uint32_t value);
276 /**************************************************************************************************/
277 /** \brief Rotate Right with Extend (32 bit)
279 This function moves each bit of a bitstring right by one bit. The carry input is shifted in at the left end of the bitstring.
281 \param [in] value Value to rotate
282 \return Rotated value
284 uint32_t __RRX(uint32_t value);
287 /**************************************************************************************************/
288 /** \brief LDRT Unprivileged (8 bit)
290 This function executed an Unprivileged LDRT command for 8 bit value.
292 \param [in] ptr Pointer to data
293 \return value of type uint8_t at (*ptr)
295 uint8_t __LDRBT(uint8_t ptr);
298 /**************************************************************************************************/
299 /** \brief LDRT Unprivileged (16 bit)
301 This function executed an Unprivileged LDRT command for 16 bit values.
303 \param [in] ptr Pointer to data
304 \return value of type uint16_t at (*ptr)
306 uint16_t __LDRHT(uint16_t ptr);
309 /**************************************************************************************************/
310 /** \brief LDRT Unprivileged (32 bit)
312 This function executed an Unprivileged LDRT command for 32 bit values.
314 \param [in] ptr Pointer to data
315 \return value of type uint32_t at (*ptr)
317 uint32_t __LDRT(uint32_t ptr);
320 /**************************************************************************************************/
321 /** \brief STRT Unprivileged (8 bit)
323 This function executed an Unprivileged STRT command for 8 bit values.
325 \param [in] value Value to store
326 \param [in] ptr Pointer to location
328 void __STRBT(uint8_t value, uint8_t ptr);
331 /**************************************************************************************************/
332 /** \brief STRT Unprivileged (16 bit)
334 This function executed an Unprivileged STRT command for 16 bit values.
336 \param [in] value Value to store
337 \param [in] ptr Pointer to location
339 void __STRHT(uint16_t value, uint16_t ptr);
342 /**************************************************************************************************/
343 /** \brief STRT Unprivileged (32 bit)
345 This function executed an Unprivileged STRT command for 32 bit values.
347 \param [in] value Value to store
348 \param [in] ptr Pointer to location
350 void __STRT(uint32_t value, uint32_t ptr);
355 \brief Load-Acquire (8 bit)
356 \details Executes a LDAB instruction for 8 bit value.
357 \param [in] ptr Pointer to data
358 \return value of type uint8_t at (*ptr)
359 \note Only availabe for ARMv8-M Architecture.
361 uint8_t __LDAB(volatile uint8_t *ptr);
364 \brief Load-Acquire (16 bit)
365 \details Executes a LDAH instruction for 16 bit values.
366 \param [in] ptr Pointer to data
367 \return value of type uint16_t at (*ptr)
368 \note Only availabe for ARMv8-M Architecture.
370 uint16_t __LDAH(volatile uint16_t *ptr);
373 \brief Load-Acquire (32 bit)
374 \details Executes a LDA instruction for 32 bit values.
375 \param [in] ptr Pointer to data
376 \return value of type uint32_t at (*ptr)
377 \note Only availabe for ARMv8-M Architecture.
379 uint32_t __LDA(volatile uint32_t *ptr);
382 \brief Store-Release (8 bit)
383 \details Executes a STLB instruction for 8 bit values.
384 \param [in] value Value to store
385 \param [in] ptr Pointer to location
386 \note Only availabe for ARMv8-M Architecture.
388 void __STLB(uint8_t value, volatile uint8_t *ptr);
391 \brief Store-Release (16 bit)
392 \details Executes a STLH instruction for 16 bit values.
393 \param [in] value Value to store
394 \param [in] ptr Pointer to location
395 \note Only availabe for ARMv8-M Architecture.
397 void __STLH(uint16_t value, volatile uint16_t *ptr);
400 \brief Store-Release (32 bit)
401 \details Executes a STL instruction for 32 bit values.
402 \param [in] value Value to store
403 \param [in] ptr Pointer to location
404 \note Only availabe for ARMv8-M Architecture.
406 void __STL(uint32_t value, volatile uint32_t *ptr);
409 \brief Load-Acquire Exclusive (8 bit)
410 \details Executes a LDAB exclusive instruction for 8 bit value.
411 \param [in] ptr Pointer to data
412 \return value of type uint8_t at (*ptr)
413 \note Only availabe for ARMv8-M Architecture.
415 uint8_t __LDAEXB(volatile uint32_t *ptr);
418 \brief Load-Acquire Exclusive (16 bit)
419 \details Executes a LDAH exclusive instruction for 16 bit values.
420 \param [in] ptr Pointer to data
421 \return value of type uint16_t at (*ptr)
422 \note Only availabe for ARMv8-M Architecture.
424 uint16_t __LDAEXH(volatile uint32_t *ptr);
427 \brief Load-Acquire Exclusive (32 bit)
428 \details Executes a LDA exclusive instruction for 32 bit values.
429 \param [in] ptr Pointer to data
430 \return value of type uint32_t at (*ptr)
431 \note Only availabe for ARMv8-M Architecture.
433 uint32_t __LDAEX(volatile uint32_t *ptr);
436 \brief Store-Release Exclusive (8 bit)
437 \details Executes a STLB exclusive instruction for 8 bit values.
438 \param [in] value Value to store
439 \param [in] ptr Pointer to location
440 \return 0 Function succeeded
441 \return 1 Function failed
442 \note Only availabe for ARMv8-M Architecture.
444 uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr);
447 \brief Store-Release Exclusive (16 bit)
448 \details Executes a STLH exclusive instruction for 16 bit values.
449 \param [in] value Value to store
450 \param [in] ptr Pointer to location
451 \return 0 Function succeeded
452 \return 1 Function failed
453 \note Only availabe for ARMv8-M Architecture.
455 uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr);
458 \brief Store-Release Exclusive (32 bit)
459 \details Executes a STL exclusive instruction for 32 bit values.
460 \param [in] value Value to store
461 \param [in] ptr Pointer to location
462 \return 0 Function succeeded
463 \return 1 Function failed
464 \note Only availabe for ARMv8-M Architecture.
466 uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr);
469 /*@}*/ /* end of group Intrisic_CPU */