主题中讨论的其他器件:CC2674R10、CC1354P10、
工具与软件:
大家好!
我使用的是 TI Arm Clang 编译器 v3.2.LTS、 CCS v12.4、 CC2674R10 (Cortex M33、Armv8-M)
基于 project_zero 示例构建一个项目
尝试使用最初为 armcl 编写的代码
此代码使用 _disable_interrupts()和 _restore_interrupts()内在函数来保护关键段:
uint32_t savevar;
savevar = _disable_interrupts(); // get current interrupt state and disable interrupts (TI ARM Compiler intrinsic)
// critical code...
_restore_interrupts(savevar); // restore interrupt state (TI ARM Compiler intrinsic)
tiarmclang 不支持这些内在函数、但提供了 ti_compatibility.h 头文件、该文件应将它们转换为与 tiarmclang 兼容的形式:
/******************************************************************************/
/* Disable interrupts */
/******************************************************************************/
static __inline__ uint32_t __attribute__((always_inline))
_disable_interrupts(void)
{
#if __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH == 6
return _disable_IRQ();
#elif __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH == 7
uint32_t res = 0;
__asm volatile ("MRS %0, FAULTMASK" : "=r" (res) : : );
__asm volatile ("CPSID F" : : : );
return res;
#elif __ARM_ARCH >= 7
uint32_t res = _get_CPSR();
__asm volatile ("CPSID IF" : : : );
return res;
#else
return 0
#endif
}
/******************************************************************************/
/* Restore interrupts */
/******************************************************************************/
static __inline__ void __attribute__((always_inline))
_restore_interrupts(uint32_t x)
{
#if __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH == 6
__asm volatile ("MSR PRIMASK, %0" : : "r" (x) : );
#elif __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH == 7
__asm volatile ("MSR FAULTMASK, %0" : : "r" (x) : );
#elif __ARM_ARCH >= 7
__asm volatile ("MSR CPSR_fc, %0" : : "r" (x) : );
#endif
}
编译器采用路径"#elif _arm_arch >= 7"、并在 _restore_interrupts ()上以"指令的无效操作数"失败:
C:\ti\ccs1240\ccs\tools\compiler\ti-cgt-armllvm_3.2.2.LTS\include\c\ti_compatibility.h:1529:21: error: invalid operand for instruction
__asm volatile ("MSR CPSR_fc, %0" : : "r" (x) : );
^
<inline asm>:1:5: note: instantiated into assembly here
MSR CPSR_fc, r0
^
《Armv8-M 架构参考手册》甚至没有提及 CPSR 寄存器、更不用说 CPSR_fc。
这个代码(及其整个头文件)适用于 Arm v8- M 到底?
是否已有解决此问题的方法?
或者是否有具有相同功能的替代方案?
我在 driverlib 的 cpu.h 中找到 CPUcpsid():它也 返回原始中断启用状态、但没有函数可将其恢复到该状态。
此致、
沃尔夫冈