当初始化移入函数时,attiny261无法工作

时间:2014-11-05 06:50:10

标签: c avr

编辑:我忘了在链接器步骤中添加-mmcu标志,这意味着我的程序没有为avr微控制器编译。代码本身是正确的。

我正在使用这段代码来驱动七段显示:

#include <avr/io.h>

int main(void)
{
  DDRA = 0xff;
  DDRB = 0xff;

  for (;;) {
    PORTA = _BV(7);
    PORTB = ~0x07;
  }

  return 0;
}

这很好用,但是当我尝试在这样的辅助函数中设置DDR时,它不再有效:

#include <avr/io.h>

void initIO(void)
{
  DDRA = 0xff;
  DDRB = 0xff;
}

int main(void)
{
  initIO();

  for (;;) {
    PORTA = _BV(7);
    PORTB = ~0x07;
  }

  return 0;
}

为什么这不正确?

这是反汇编的代码:

Disassembly of section .text:

00000000 <initIO>:
   0:   8f ef           ldi r24, 0xFF   ; 255
   2:   8a bb           out 0x1a, r24   ; 26
   4:   87 bb           out 0x17, r24   ; 23
   6:   08 95           ret

00000008 <main>:
   8:   fb df           rcall   .-10        ; 0x0 <initIO>
   a:   90 e8           ldi r25, 0x80   ; 128
   c:   88 ef           ldi r24, 0xF8   ; 248
   e:   9b bb           out 0x1b, r25   ; 27
  10:   88 bb           out 0x18, r24   ; 24
  12:   fd cf           rjmp    .-6         ; 0xe <main+0x6>

1 个答案:

答案 0 :(得分:2)

如果在最后的链接步骤中未指定设备模型,则avr-gcc不会生成初始化变量和调用main()函数所需的正确前导码。请务必在每次调用avr-gccavr-ld时指定正确的模型。