在我的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之間的值嗎? –