2014-11-05 36 views
1

编辑:我忘记在连接器步骤中添加-mmcu标志,这意味着我的程序没有为avr微控制器编译。代码本身是正确的。当初始化移入函数时,attiny261将不起作用

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

#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> 
+0

这听起来不对;发布'initIO()'和'main()'的反汇编。 – 2014-11-05 06:54:59

+0

除了这个问题,在过去的几个小时里,这让我疯狂。 – 2014-11-05 07:00:30

+0

这是反汇编对象文件还是最终的二进制文件? – 2014-11-05 07:04:03

回答

2

如果在最后的链接步骤中没有指定所述设备模型然后AVR-GCC不会产生初始化变量和调用main()功能所需的适当的前同步码。请务必在每次调用avr-gccavr-ld时指定适当的型号。

相关问题