【发布时间】:2015-07-13 10:32:16
【问题描述】:
我正在尝试使用 avr-gcc 编译一个简单的汇编程序以在 Attiny85 上运行。不幸的是,该程序根本不起作用。上传和编译时我没有收到任何错误。我知道程序本身应该可以工作,因为它使用 C 工作。那么我错过了什么?
编译和上传:
avr-gcc blinky.S -mmcu=attiny85 -Os -g -o blinky.out
avr-objcopy -O ihex blinky.out blinky.hex
sudo avrdude -p attiny85 -c usbasp -P usb -e -U flash:w:blinky.hex
blinky.S
#define F_CPU 1000000L
#include <avr/io.h>
.section text
.org 0
.global init
rjmp init
init:
ldi r23,0x00
ldi r24,0xFF
out _SFR_IO_ADDR(DDRB), r24
out _SFR_IO_ADDR(PORTB), r23
rjmp main
.org 0x020
.global main
main:
out _SFR_IO_ADDR(PORTB), r24
rjmp main
输出:
Philipps-MacBook-Pro:Desktop philippbraun$ sh script.sh attiny85 blinky.S
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e930b
avrdude: erasing chip
avrdude: safemode: Fuses OK
avrdude done. Thank you.
COMPILING AS ASSEMBLY FILE
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e930b
avrdude: erasing chip
avrdude: reading input file "blinky.hex"
avrdude: input file blinky.hex auto detected as Intel Hex
avrdude: writing flash (46 bytes):
Writing | ################################################## | 100% 0.03s
avrdude: 46 bytes of flash written
avrdude: verifying flash memory against blinky.hex:
avrdude: load data flash data from input file blinky.hex:
avrdude: input file blinky.hex auto detected as Intel Hex
avrdude: input file blinky.hex contains 46 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.03s
avrdude: verifying ...
avrdude: 46 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.
以下C程序编译成功!
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF; // PORTB is output, all pins
PORTB = 0x00; // Make pins low to start
for (;;) {
PORTB = 0xFF; // invert all the pins
//_delay_ms(5000); // wait some time
}
return 0;
}
【问题讨论】:
-
您是否将其与 C 程序生成的程序集进行了比较?例如
DDRB = 0xff;,while (1) PORTB = 0xff; -
@BrettHale 是的,我现在也包含了成功编译的 C 程序。
-
这两个程序是不等价的。 C 版本将
PORTB初始化为零,而汇编版本则不会。 -
链接器是否了解全局
init符号?你不应该让main成为全球性的吗? -
好评@BrettHale 在重写程序几次后,我完全忘记了它。不幸的是,它没有解决我的问题。
标签: c assembly microcontroller avr avr-gcc