C 阿提尼261元';将初始化移到函数中时,将无法工作
编辑:我忘记在链接器步骤中添加-mmcu标志,这意味着我的程序没有为avr微控制器编译。代码本身是正确的 我使用这段代码驱动七段式显示器: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
#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