Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C AVR I/O宏定义如何允许访问寄存器?_C_Cpu Registers_Atmega_Atmel_Avr Gcc - Fatal编程技术网

C AVR I/O宏定义如何允许访问寄存器?

C AVR I/O宏定义如何允许访问寄存器?,c,cpu-registers,atmega,atmel,avr-gcc,C,Cpu Registers,Atmega,Atmel,Avr Gcc,我正在查看ATmega2560寄存器映射(iom2560.h)的标题,其中有所有寄存器的定义。例如: #define PINA _SFR_IO8(0X00) //Macro definition: #define _SFR_IO8(io_addr) ((io_addr) + 0X20) 所以PINA是一个十六进制值,8位对应于8位微控制器寄存器的地址。在编写代码时,只需键入以下代码即可更改寄存器内的值: PINA |= (1 << 3); // Setting the thi

我正在查看ATmega2560寄存器映射(
iom2560.h
)的标题,其中有所有寄存器的定义。例如:

#define PINA    _SFR_IO8(0X00)
//Macro definition:
#define _SFR_IO8(io_addr) ((io_addr) + 0X20)
所以PINA是一个十六进制值,8位对应于8位微控制器寄存器的地址。在编写代码时,只需键入以下代码即可更改寄存器内的值:

PINA |= (1 << 3); // Setting the third bit.

PINA |=(1简短回答-隐藏在Atmel包含的标题中的是一组宏,这些宏创建指向寄存器位置的指针。以下是该过程的简要概述:

生成文件定义要使用的设备,然后将定义传递给编译器

DEVICE = atmega2560
...
-D__$(DEVICE)__
然后包括io.h,它会根据您的设备自动包括必要的头文件:

// In main source file
#include <io.h>    

// In io.h
#include <avr/sfr_defs.h>
// ...
#elif defined (__AVR_ATmega2560__)
    #  include <avr/iom2560.h>

// In sfr_defs.h
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
#define __SFR_OFFSET 0x20
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

// In iom2560.h
#include <avr/iomxx0_1.h>
// Other device specific definitions

// Om iomxx0_1.h
#define PINA    _SFR_IO8(0X00)
// Other device family shared definitions

它指定PINA是指向易失性8位内存地址0x20的指针。然后,每当访问该地址时,内部芯片体系结构将该地址映射到相应的外围寄存器。

简短回答-隐藏在Atmel包含的标题中的是一组宏,这些宏创建指向寄存器位置的指针。他下面是流程的简要概述:

生成文件定义要使用的设备,然后将定义传递给编译器

DEVICE = atmega2560
...
-D__$(DEVICE)__
然后包括io.h,它会根据您的设备自动包括必要的头文件:

// In main source file
#include <io.h>    

// In io.h
#include <avr/sfr_defs.h>
// ...
#elif defined (__AVR_ATmega2560__)
    #  include <avr/iom2560.h>

// In sfr_defs.h
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
#define __SFR_OFFSET 0x20
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

// In iom2560.h
#include <avr/iomxx0_1.h>
// Other device specific definitions

// Om iomxx0_1.h
#define PINA    _SFR_IO8(0X00)
// Other device family shared definitions

它指定PINA是指向易失性8位内存地址0x20的指针。然后,每当访问该地址时,内部芯片体系结构就会将该地址映射到相应的外围寄存器。

问题就在这里:
\define\u SFR\u IO8(io\u addr)((io\u addr)+0x20) HM,但是那个定义看起来不正确,它应该是一个内存访问(包括另一个宏代码< > MmioOxByth,中间包含一个<代码> */COD>,因为它评估为<代码> *(易失性UTI8*T*)(ADDR)< /代码>:-我想你忽略了
\u SFR\u IO8
定义中的
\u MMIO\u BYTE
部分!谢谢CherryDT!-事实上我两者都忽略了-这些定义都与标志“ASM\u COMPAT.是否定义了ASM\u COMPAT?”有关?因为这个定义在
中,如果“ASM\u COMPAT”
“编译器是如何工作的?[sic]如果你真的想知道的话,这是一个你可以自己回答的问题。gcc是开源的。它就在问题中:
\define\u SFR\u IO8(io\u addr)((io\u addr)+0X20)
Hm但是这个定义看起来不对,应该是一个内存访问(包含另一个宏<代码>μMioOxByth,中间包含一个<代码> */COD>,因为它评估为<代码> *(易失性UTI8*T*)(ADDR)< /代码>:-我想你忽略了
\u SFR\u IO8
定义中的
\u MMIO\u BYTE
部分!谢谢CherryDT!-事实上我两者都忽略了-这些定义都与标志“ASM\u COMPAT.是否定义了ASM\u COMPAT?”有关?因为这个定义在
中,如果“ASM\u COMPAT”
“编译器是如何工作的?[sic]这是一个你可以自己回答的问题,如果你真的想知道的话。gcc是开源的。通过
-save temps
参数到
avr gcc
,你可以看到预处理后的C源代码(称为
*.i
)和编译后的汇编代码(称为
*.s
)验证实际案例中实际发生的情况。使用
-save temps
参数到
avr gcc
,您可以在预处理后看到C源代码(称为
*.i
)和编译后的汇编代码(称为
*.s
),以验证实际案例中实际发生的情况。