在我的Atmel ASF项目中,我正尝试构建以下内联asm代码。然而,我在编译时遇到了不可能的约束。编译时在asm中的不可约束
编译指向这一行__asm__ __volatile__
, 我错过了什么?
#define OUTPORT PORTD
#define OUTBIT 3 // PD.3
uint8_t rport ,rbits;
uint8_t *buf = message;
asm volatile( "in __tmp_reg__, __SREG__ \n\t" // 1 Save SREG for later
"cli \n\t" // 1 Clear interrupts
"in %[rport], %[port] \n\t" // 1 Move PORTB adress to rport
: //Outputs
[rport] "=&r" (rport)
: //Inputs
[port] "I" (_SFR_IO_ADDR(OUTPORT)) // Adress to port register, 6-bit positive constant
: //Clobber list (compiler must restore)
"r0" // This is __tmp_reg__
);
- 是什么摧毁了这个版本?
- 我不知道asm语法是不正确的吗?我一直在关注this manual
这是非常高效的内联汇编。确保你需要asm,如果你确实考虑把它放在一个单独的asm文件中而不是内联。会节省很多头痛。 – Jester
这是一个可笑的漫长的宏。为什么不把它作为一个函数,并把它放在一个汇编文件中?那么它甚至不需要变化。鉴于所有的呼吁和故意拖延,它怎么可能受伤?然后你会得到合理的诊断。如果这被称为不止一次,你的代码会变得更小。 – DigitalRoss
_SFR_IO_ADDR(OUTPORT)实际上是介于0和63之间的值吗? –