首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino汇编程序设计:什么都没发生

Arduino汇编程序设计:什么都没发生
EN

Stack Overflow用户
提问于 2013-01-23 01:39:27
回答 1查看 3K关注 0票数 3

在StackOverflow社区,

我正在尝试在汇编程序中编程我的旧Arduino Duemilanove板(Atmega 168V-10PU)。我以前试过几次,但每次代码都没有执行。所以我试着用C语言编写了一个等效的测试程序,它起作用了。这就是它:

代码语言:javascript
复制
// file led.c
#include <avr/io.h>

int main(void)
{

    DDRB = 0xFF;
    PORTB = 0xFF;

    while (1) {
        asm("nop\n");
    }

    return 0;
}

编译器的asm转储导致(缩短),

代码语言:javascript
复制
ldi r24,lo8(-1)  ;  tmp44,
out 0x4,r24  ;  MEM[(volatile uint8_t *)36B], tmp44
out 0x5,r24  ;  MEM[(volatile uint8_t *)37B], tmp44

其工作并激活Arduino引脚13 (AVR引脚PB5)上的发光二极管。

但是当我使用这个asm文件时,

代码语言:javascript
复制
// file led.S
#include "avr/io.h"

.global main

main:
    ldi r24, 0xFF
    out DDRB, r24
    out PORTB, r24

 end:
    jmp end

编译器转储导致(缩短),

代码语言:javascript
复制
ldi r24, 0xFF
out ((0x04) + 0x20), r24
out ((0x05) + 0x20), r24

或许可以解释为什么什么都没发生。

此外,下面是C versionAssembler version的makefile

感谢您的帮助!

编辑:这里还有C versionAssembler version的完整汇编转储文件

编辑2:我在包含文件iom168.h中查找了寄存器地址,其中引用了iomx8.h,其中显示为#define PORTB _SFR_IO8 (0x05)。编译器遵循include链

代码语言:javascript
复制
io.h -> iom168.h -> iomx8.h
io.h -> common.h -> sfr_defs.h

在sfr_defs.h中是这样写的:

代码语言:javascript
复制
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

在偏移量上再定义几行:

代码语言:javascript
复制
#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
#  if __AVR_ARCH__ >= 100
#    define __SFR_OFFSET 0x00
#  else
#    define __SFR_OFFSET 0x20
#  endif
#endif

(很抱歉格式错误)你知道这个错误是从哪里来的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-23 02:15:51

您应该分别使用i/o和内存指令使用帮助器宏_SFR_IO_ADDR()_SFR_MEM_ADDR()来访问SFR,因为它们在两个名称空间中具有不同的地址。默认值显然是内存映射的,但不要指望它。

因此,您的代码可能如下所示:

代码语言:javascript
复制
#include "avr/io.h"

.global main

main:
    ldi r24, 0xFF
    out _SFR_IO_ADDR(DDRB), r24
    out _SFR_IO_ADDR(PORTB), r24

 end:
    jmp end

或者,您可以切换到内存映射访问:

代码语言:javascript
复制
#include "avr/io.h"

.global main

main:
    ldi r24, 0xFF
    sts _SFR_MEM_ADDR(DDRB), r24
    sts _SFR_MEM_ADDR(PORTB), r24

 end:
    jmp end
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14464713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档