0

するCコードを書く必要があります

DDRB &= ~pins;

インライン アセンブリ (AVR) を使用します。以前は使用したことがありません。私の試み:

register uint8_t t1, t2; // temporary registers
__asm__ volatile (
    "in %[t1], %[w1_ddr]"   "\n\t"
    "mov %[t2], %[pins]"    "\n\t"
    "com %[t2]"             "\n\t"
    "and %[t1], %[t2]"      "\n\t"
    "out %[w1_ddr], %[t1]"  "\n\t"
    : [t1] "+r" (t1),
      [t2] "+r" (t2),
      [w1_ddr] "+I" (_SFR_IO_ADDR(DDRB))
    : [pins] "r" (pins)
);  

gcc次のエラーが発生しますlvalue required in asm statement。私は何を間違っていますか?

4

1 に答える 1

1

AVR の「I」制約は、オペランドが定数であることを示します。したがって、「+」、つまり入出力にはなりません。次のように、単純な入力にします。

register uint8_t t1, t2; // temporary registers
__asm__ volatile (
    "in %[t1], %[w1_ddr]"   "\n\t"
    "mov %[t2], %[pins]"    "\n\t"
    "com %[t2]"             "\n\t"
    "and %[t1], %[t2]"      "\n\t"
    "out %[w1_ddr], %[t1]"  "\n\t"
    : [t1] "+r" (t1),
      [t2] "+r" (t2)
    : [w1_ddr] "I" (_SFR_IO_ADDR(DDRB)),
      [pins] "r" (pins)
); 
于 2012-11-21T21:17:12.933 に答える