gpt4 book ai didi

c - 使用指针数组的内存映射外围寄存器

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:58 26 4
gpt4 key购买 nike

我指的是编写可重用固件的文档,本书附带的代码使用指针数组映射内存。

我对内存映射有点困惑

从这里post , 如果 8 位内存映射到 0X123,那么我可以使用下面的

uint8_t volatile * p_reg = (uint8_t volatile *) 0x1234;

#define PORT 0X1234
uint8_t volatile * p_reg = (uint8_t volatile *) PORT;

或者在指针数组的情况下

#define PORT 0X1234
uint8_t volatile * const portsout[NUM_PORTS] =
{
(uint8_t*)PORTB, ....,
};

我试过书里的代码和 atmega168,这就是我必须做的来映射内存

uint8_t volatile * const portsout[NUM_PORTS] =
{
(uint8_t*)&PORTB, (uint8_t*)&PORTC, (uint8_t*)&PORTD,
};

PORTB 在头文件“avr/io.h”中这样定义

#define PORTB   _SFR_IO8 (0x05)

我不明白的是指针数组中需要&??

当我在使用lpc2148时出现编译错误,我给作者发了一封邮件,在他的回复邮件中,他提到了

Then it looks like your pointer arrays may not actually be pointers. For example:

(uint32_t*)&IOPIN0, (uint32_t*)&IOPIN1,

might actually be

(uint32_t*)IOPIN0, (uint32_t*)IOPIN1,

depending on how IOPIN0 and IOPIN1 are defined for your part

lpc2148 的 IOPIN0 宏是

#define IOPIN0          (*((volatile unsigned long *) 0xE0028000))

我在 C 方面没有太多经验。我知道如果宏引用内存,那么在定义指针数组时就不必使用 & 了。我如何知道宏(例如:PORTB、IOPIN0)是指地址还是值??

最佳答案

在编写寄存器映射时,通常使用将寄存器保留为变量的方法:

#define REGISTER (*(volatile uint8_t*)0x1234)

左边的 * 取消引用指向的地址,这意味着您现在可以像使用任何普通变量一样使用 REGISTER。这就是您必须编写 &PORTB 的原因,它在宏展开后最终成为 &*pointer。 C (c17 6.5.3.2) 保证这等同于 pointer:

The unary & operator yields the address of its operand. /--/
If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted

至于是否需要&,确实取决于register map中registers是如何定义的。无论系统如何,它都应该作为您可以检查的头文件提供。

作为旁注,您的 Actor 阵容很可疑。不需要 (uint8_t*)&PORTB。这表明某些限定符与 volatileconst 不匹配。一般来说,从指针到限定指针总是可以的,但反之则不行。

根据您使用 IOPIN0 的示例,代码应如下所示:

volatile uint32_t*const portsout [NUM_PORTS] =
{
&IOPIN0, ...
};

关于c - 使用指针数组的内存映射外围寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52646670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com