assembly _SFR_IO8(0x04)正在做什么?AVR

lmyy7pcs  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(142)

我试图编写一个程序在汇编切换板载LED的Arduino MEGA2560在汇编。
为此,我只需要指示引脚(本例中为PB7的13)作为输出的方向,然后将该引脚设置为高电平或低电平。
我知道有两个寄存器与此问题有关。一个是端口方向寄存器(DDRB)和引脚状态寄存器(PORTB)
所以我试着理解这些寄存器的编号或地址,这样我就可以在汇编中给它们赋值。我进入了定义这些常量的C++库(iomxx0.h),例如DDRB是这样定义的:

#define DDRB    _SFR_IO8(0x04)
#define DDB7    7
#define DDB6    6
#define DDB5    5
#define DDB4    4
#define DDB3    3
#define DDB2    2
#define DDB1    1
#define DDB0    0

我很想知道寄存器的地址是否为0x04?,如果是,_SFR_IO8()在做什么?

quhf5bfb

quhf5bfb1#

这是一个宏,如果你感兴趣,可以在标题中找到它的定义:

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

以及

#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

此外,

#define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET)
#define _SFR_MEM_ADDR(sfr) (sfr)

在AVR上,您可以使用通常的存储器读/写或输入/输出指令访问SFR。然而,地址取决于访问方法。这些宏可以帮助您实现这一点。在您的情况下,0x 04是IO地址,0x 24是存储器Map地址。

woobm2wo

woobm2wo2#

但如果是这样的话就能成功* (uin8_t*)(地址|偏移量);为什么不是+?

相关问题