编辑:我忘了在链接器步骤中添加-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>
答案 0 :(得分:2)
如果在最后的链接步骤中未指定设备模型,则avr-gcc不会生成初始化变量和调用main()
函数所需的正确前导码。请务必在每次调用avr-gcc
或avr-ld
时指定正确的模型。