文章目录
- 三、不同编译器特定的内部函数
-
- 3.1 RealView/ARM Compiler
- 3.2 ICC/IAR Compiler
- 3.3 GNU/gcc Compiler
-
- 3.3.1 获取进程栈指针
- 3.3.2 设置进程栈指针
- 3.3.3 获取主栈指针
- 3.3.4 设置主栈指针
- 3.3.5 获取BASEPRI
- 3.3.6 设置BASEPRI
- 3.3.7 获取PRIMASK
- 3.3.8 设置PRIMASK
- 3.3.9 获取FAULTMASK
- 3.3.10 设置FAULTMASK
- 3.3.11 获取CONTROL
- 3.3.12 设置CONTROL
- 3.3.13 反转整数值的字节顺序
- 3.3.14 反转无符号短值的字节顺序
- 3.3.15 反转有符号短值中的字节顺序,并将符号扩展为整数
- 3.3.16 反转值的位顺序
- 3.3.17 8位独占的LDR指令
- 3.3.18 16位独占的LDR指令
- 3.3.19 32位独占的LDR指令
- 3.3.20 8位独占的STR指令
- 3.3.21 16位独占的STR指令
- 3.3.22 32位独占的STR指令
- 3.4 TASKING Compiler
三、不同编译器特定的内部函数
3.1 RealView/ARM Compiler
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
/* ARM armcc specific functions */
#define __enable_fault_irq __enable_fiq
#define __disable_fault_irq __disable_fiq
#define __NOP __nop
#define __WFI __wfi
#define __WFE __wfe
#define __SEV __sev
#define __ISB() __isb(0)
#define __DSB() __dsb(0)
#define __DMB() __dmb(0)
#define __REV __rev
#define __RBIT __rbit
#define __LDREXB(ptr) ((unsigned char ) __ldrex(ptr))
#define __LDREXH(ptr) ((unsigned short) __ldrex(ptr))
#define __LDREXW(ptr) ((unsigned int ) __ldrex(ptr))
#define __STREXB(value, ptr) __strex(value, ptr)
#define __STREXH(value, ptr) __strex(value, ptr)
#define __STREXW(value, ptr) __strex(value, ptr)
3.1.1 获取进程栈指针
/**
* @brief Return the Process Stack Pointer
*
* @return ProcessStackPointer
*
* Return the actual process stack pointer
*/
__ASM uint32_t __get_PSP(void)
{
mrs r0, psp
bx lr
}
3.1.2 设置进程栈指针
/**
* @brief Set the Process Stack Pointer
*
* @param topOfProcStack Process Stack Pointer
*
* Assign the value ProcessStackPointer to the MSP
* (process stack pointer) Cortex processor register
*/
__ASM void __set_PSP(uint32_t topOfProcStack)
{
msr psp, r0
bx lr
}
3.1.3 获取主栈指针
/**
* @brief Return the Main Stack Pointer
*
* @return Main Stack Pointer
*
* Return the current value of the MSP (main stack pointer)
* Cortex processor register
*/
__ASM uint32_t __get_MSP(void)
{
mrs r0, msp
bx lr
}
3.1.4 设置主栈指针
/**
* @brief Set the Main Stack Pointer
*
* @param topOfMainStack Main Stack Pointer
*
* Assign the value mainStackPointer to the MSP
* (main stack pointer) Cortex processor register
*/
__ASM void __set_MSP(uint32_t mainStackPointer)
{
msr msp, r0
bx lr
}
3.1.5 反转无符号短值中的字节顺序
/**
* @brief Reverse byte order in unsigned short value
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in unsigned short value
*/
__ASM uint32_t __REV16(uint16_t value)
{
rev16 r0, r0
bx lr
}
3.1.6 反转有符号短值中的字节顺序,并将符号扩展为整数
/**
* @brief Reverse byte order in signed short value with sign extension to integer
*
* @param value value to reverse
* @return reversed value
*
* Reverse byte order in signed short value with sign extension to integer
*/
__ASM int32_t __REVSH(int16_t value)
{
revsh r0, r0
bx lr
}
3.1.7 删除ldrex创建的排它锁
/**
* @brief Remove the exclusive lock created by ldrex
*
* Removes the exclusive lock which is created by ldrex.
*/
__ASM void __CLREX(void)
{
clrex
}
3.1.8 获取BASEPRI
/**
* @brief Return the Base Priority value
*
* @return BasePriority
*
* Return the content of the base priority register
*/
__ASM uint32_t __get_BASEPRI(void)
{
mrs r0, basepri
bx lr
}
3.1.9 设置BASEPRI
/**
* @brief Set the Base Priority value
*
* @param basePri BasePriority
*
* Set the base priority register
*/
__ASM void __set_BASEPRI(uint32_t basePri)
{
msr basepri, r0
bx lr
}
3.1.10 获取PRIMASK
/**
* @brief Return the Priority Mask value
*
* @return PriMask
*
* Return state of the priority mask bit from the priority mask register
*/
__ASM uint32_t __get_PRIMASK(void)
{
mrs r0, primask
bx lr
}
3.1.11 设置PRIMASK
/**
* @brief Set the Priority Mask value
*
* @param priMask PriMask
*
* Set the priority mask bit in the priority mask register
*/
__ASM void __set_PRIMASK(uint32_t priMask)
{
msr primask, r0
bx lr
}
3.1.12 获取FAULTMASK
/**
* @brief Return the Fault Mask value
*
* @return FaultMask
*
* Return the content of the fault mask register
*/
__ASM uint32_t __get_FAULTMASK(void)
{
mrs r0, faultmask
bx lr
}
3.1.13 设置FAULTMASK
/**
* @brief Set the Fault Mask value
*
* @param faultMask faultMask value
*
* Set the fault mask register
*/
__ASM