C AVR I/O宏定义如何允许访问寄存器?
我正在查看ATmega2560寄存器映射(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
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
),以验证实际案例中实际发生的情况。