Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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理解结构指针_C_Pointers_Struct_Embedded - Fatal编程技术网

c理解结构指针

c理解结构指针,c,pointers,struct,embedded,C,Pointers,Struct,Embedded,有人能解释一下下面代码中的行静态易失性GPIO\U寄存器*const GPIO[]是什么吗 这个块中的语法(volatile GPIO_Registers*)做什么 // GPIO hardware registers // typedef struct { uint32_t MODE; uint32_t TYPE; uint32_t SPEED; uint32_t PUSH_PULL; uint32_t IDR; uint32_t ODR; uint32_t BSR

有人能解释一下下面代码中的行
静态易失性GPIO\U寄存器*const GPIO[]
是什么吗

这个块中的语法
(volatile GPIO_Registers*)
做什么

// GPIO hardware registers
//
typedef struct
{
  uint32_t MODE;
  uint32_t TYPE;
  uint32_t SPEED;
  uint32_t PUSH_PULL;
  uint32_t IDR;
  uint32_t ODR;
  uint32_t BSRR;
  uint32_t LOCK;
  uint32_t ALT_FN1;
  uint32_t ALT_FN2;
} GPIO_Registers;


// Ports can be selected using an enumeration
// (Port) to index into this array.
// Port addresses can be calculated using the enum since
// all ports are at the same offset from each other.
//
static volatile GPIO_Registers* const gpio[] =
{
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_B << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_C << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_D << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_E << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_F << 10))
};
//GPIO硬件寄存器
//
类型定义结构
{
uint32_t模式;
uint32_t型;
uint32_t速度;
uint32不推拉;
uint32印尼盾;
uint32_t ODR;
uint32_t BSRR;
uint32_t锁;
uint32备选方案FN1;
uint32替代方案FN2;
}GPIO_寄存器;
//可以使用枚举选择端口
//(端口)以索引到此数组中。
//端口地址可以使用枚举计算,因为
//所有端口彼此的偏移量相同。
//
静态易失性GPIO_寄存器*常量GPIO[]=
{

(易失性GPIO\U寄存器*)(GPIO\U基本地址+(端口A
(易失性GPIO\U寄存器*)(GPIO\U基本地址+(端口A
静态易失性GPIO\U寄存器*常量GPIO[]
是指向
GPIO\U寄存器
变量的指针的静态数组

数组的每个元素都指向
SoC
/
mcu
的物理地址。因此,每个元素都指向一个物理
GPIO端口
。有关详细信息,请查看
SoC
/
mcu
数据表。您会发现SoC的每个GPIO端口都有
GPIO\U寄存器指定的所有32位寄存器e> 结构


(volatile GPIO_寄存器*)
是一种简单类型转换,这是必需的,因为
GPIO_BASE_ADDR
和其他定义都是简单的“数字”,您必须指定这些“数字”的类型。

(volatile GPIO_寄存器*)(GPIO_BASE_ADDR+(PORT_a)“该值可能会随时更改,因此它是常量,[…]”??@KarolyHorvath-指针的值,即GPIO寄存器的地址,不会改变。指针的目标,即该寄存器中的位可能会改变。但volatile并不意味着程序可以改变某些东西,它意味着编译器必须实际执行访问,因为可能有其他东西,或者访问的行为可能会改变有副作用-虽然这里不是这样,但你可以同时声明const和volatile。@ChrisStratton:我知道。我只是指出这个句子没有意义。“这个指针上的值是常量volatile”这确实是一个错误陈述。@Karoly Horvoth你能提出一个有意义的陈述吗?你自己发现了什么?在你的C语言书中你具体不明白什么?
(volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10))