在玩stm32中,使用如下经典延时函数报错。
/* 64Mhz时钟时,当ulCount为1,函数耗时3个时钟,延时=3*1/64us */
__asm void SysCtlDelay(unsigned long ulCount)
{
SUBS r0,#1;
BNE SysCtlDelay;
BX lr;
}
错因是没有按照编译器支持的格式来写汇编语句。
更改为(注意是"__asm"不是“_asm”,有两个下划线):
void SysCtlDelay(unsigned long ulCount)
{
__asm("SUBS r0,#1");
__asm("BNE SysCtlDelay");
__asm("BX lr");
}
也可以放在一句话中(注意"\n"必须要):
void SysCtlDelay2(unsigned long ulCount)
{
__asm("SUBS r0,#1\n"
"BNE SysCtlDelay2\n"
"BX lr");
}
最后附上官方的链接(arm compiler中内敛汇编语言的示例)
developer.arm.com/.../Inline-assembly-with-Arm-Compiler-for-Embedded-6