我正在尝试将BeRTOS用于Texas Instruments Stellaris Cortex-M3。我的工作环境是IAR。为了适应IAR和我正在使用的特定uC,有很多小的改动,但我有一个我似乎无法解决的问题......坦率地说,这有点超出我的想法。
这段代码:
1 void NAKED lm3s_busyWait(unsigned long iterations)
2 {
3 register uint32_t __n __asm("r0") = iterations;
4
5 __asm volatile (
6 "1: subs r0, #1\n\t"
7 "bne 1b\n\t"
8 "bx lr\n\t"
9 : : "r"(__n) : "memory", "cc");
10
11 }
...正在产生一些错误和警告。
错误:预期“;” ----->第3行
错误:预期为“(”----->第5行
错误:预期“)”----->第9行
警告:声明变量“__n”但从未引用过----->第3行
有什么建议吗?
答案 0 :(得分:1)
我很确定IAR的编译器不支持内联汇编;至少我总是使用一个实际的单独的汇编语言源文件,每当我需要在使用IAR工具时在那个级别做事情。 击>
您发布的代码看起来或多或少等同于以下C代码:
void lm3s_busyWait( unsigned long iterations)
{
register volatile unsigned long n = iterations;
while (--n) {
/* do nothing */
}
}
您可能可以使用它代替您的版本,但速度会慢一些。这是否重要取决于你使用它的目的。编译器通常不会在寄存器中放置volatile
,因此在递减寄存器时,该函数可能会触及存储器位置。
以下是一个小型ARM程序集函数,您可以将其放入名为lm3s_busyWait.s
的文件中,并将其添加到IAR项目中。它应该与使用GCC内联汇编的版本完全相同:
/* C prototype:
*
* void lm3s_busyWait( unsigned long iterations);
*
*/
PUBLIC lm3s_busyWait
SECTION .text:CODE:NOROOT(4)
THUMB
lm3s_busyWait:
subs r0, #1
bne lm3s_busyWait
bx lr
end