C 阿提尼261元';将初始化移到函数中时,将无法工作

C 阿提尼261元';将初始化移到函数中时,将无法工作,c,avr,C,Avr,编辑:我忘记在链接器步骤中添加-mmcu标志,这意味着我的程序没有为avr微控制器编译。代码本身是正确的 我使用这段代码驱动七段式显示器: #include <avr/io.h> int main(void) { DDRA = 0xff; DDRB = 0xff; for (;;) { PORTA = _BV(7); PORTB = ~0x07; } return 0; } #包括 内部主(空) { DDRA=0xff; DDRB=0xff

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

我使用这段代码驱动七段式显示器:

#include <avr/io.h>

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

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

  return 0;
}
#包括
内部主(空)
{
DDRA=0xff;
DDRB=0xff;
对于(;;){
门户=_BV(7);
端口B=~0x07;
}
返回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;
}
#包括
无效初始(无效)
{
DDRA=0xff;
DDRB=0xff;
}
内部主(空)
{
initIO();
对于(;;){
门户=_BV(7);
端口B=~0x07;
}
返回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>
节的反汇编。文本:
00000000 :
0:8f ef ldi r24,0xFF;255
2:8a bb输出0x1a,r24;26
4:87 bb输出0x17,r24;23
6:08 95 ret
00000008 :
8:fb df rcall.-10;0x0
a:90E8LDIR25,0x80;128
c:88 ef ldi r24,0xF8;248
e:9b bb输出0x1b,r25;27
10:88 bb输出0x18,r24;24
12:fd cf rjmp-6;0xe

如果在最终链接步骤中未指定设备型号,则avr gcc将不会生成初始化变量和调用
main()
函数所需的正确前导码。确保在每次调用听起来不正确的
avr gcc
avr ld

时指定正确的模型;在对
initIO()
main()
进行反汇编之后。再加上这个问题,在过去的几个小时里,这让我抓狂。这是对目标文件的反汇编还是最终二进制文件的反汇编?然后是非常错误的事情;它不应该从0开始。您使用什么命令行构建?
avr gcc-Wall-Os-I/usr/avr/include-mmcu=attiny261-o main.o-c main。
avr gcc-o voltager.elf main.o