如何解决AVR GCCATTiny1614上的内联装配优化问题
我正在尝试为ATtiny1614开发延迟功能(使用AtmelStudio 7) 现有的平台_delay_us()可以执行类似的操作,但这既是一种学习体验,又可以调整您自己的代码。
出于延迟解决方案以及最小且一致的延迟时间的考虑,我决定进行内联汇编。
我做了以下内容:(摘要)
__attribute__((__always_inline__)) static inline void delay_loops(volatile uint32_t numLoops) {
asm volatile(
"loop_1%=: \n\t"
" subi %A[numLoops],1 \n\t"
" sbci %B[numLoops],0 \n\t"
" sbci %C[numLoops],0 \n\t"
" sbci %D[numLoops],0 \n\t"
" brcc loop_1%= \n\t"
:
:[numLoops] "d" (numLoops)
// d=select upper register (r16-31) only
);
}
int main(void)
{
...
delay_loops(10);
delay_loops(12);
...
}
到目前为止,太好了。一切正常,并生成以下代码:
3ec: 8a e0 ldi r24,0x0A ; 10
3ee: 90 e0 ldi r25,0x00 ; 0
3f0: a0 e0 ldi r26,0x00 ; 0
3f2: b0 e0 ldi r27,0x00 ; 0
000003f4 <loop_1333>:
3f4: 81 50 subi r24,0x01 ; 1
3f6: 90 40 sbci r25,0x00 ; 0
3f8: a0 40 sbci r26,0x00 ; 0
3fa: b0 40 sbci r27,0x00 ; 0
3fc: d8 f7 brcc .-10 ; 0x3f4 <loop_1333>
3fe: 8c e0 ldi r24,0x0C ; 12
400: 90 e0 ldi r25,0x00 ; 0
402: a0 e0 ldi r26,0x00 ; 0
404: b0 e0 ldi r27,0x00 ; 0
00000406 <loop_1341>:
406: 81 50 subi r24,0x01 ; 1
408: 90 40 sbci r25,0x00 ; 0
40a: a0 40 sbci r26,0x00 ; 0
40c: b0 40 sbci r27,0x00 ; 0
40e: d8 f7 brcc .-10 ; 0x406 <loop_1341>
将给定的循环值预加载到寄存器中,然后迭代该循环数。
但是,如果我将主代码更改为
int main(void)
{
...
delay_loops(12); // changed 10->12
delay_loops(12);
...
}
然后第二个延迟似乎无限长(或至少在我的逻辑分析仪的范围之外)。
编译后的程序集显示以下内容:
3ec: 8c e0 ldi r24,0x0C ; 12
3ee: 90 e0 ldi r25,0x00 ; 0
000003f4 <loop_1332>:
3f4: 81 50 subi r24,0x00 ; 0
3fc: d8 f7 brcc .-10 ; 0x3f4 <loop_1332>
000003fe <loop_1339>:
3fe: 81 50 subi r24,0x01 ; 1
400: 90 40 sbci r25,0x00 ; 0
402: a0 40 sbci r26,0x00 ; 0
404: b0 40 sbci r27,0x00 ; 0
406: d8 f7 brcc .-10 ; 0x3fe <loop_1339>
在delay_loops()的第二个“调用”中未完成输入值(12)的初始化。程序集仅使用其仍然具有的(更改的)寄存器值继续第二个循环。 我只能假设编译器不知道我更改了r24..27并假定它们仍正确初始化为12,从而优化了适当的初始化。
如何强制进行适当的初始化?
谢谢
解决方法
inline assembler cookbook解释了将一个操作数用于输入和输出时的操作。
按照他们的示例,我认为您应该尝试将冒号开头的两行替换为以下内容:
:[numLoops] "=d" (numLoops)
:"0" (numLoops)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。