【发布时间】:2019-03-09 20:13:45
【问题描述】:
我指的是编写可重用固件的文档,本书附带的代码使用指针数组来映射内存。
我对内存映射有点困惑
从这个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时出现编译错误,我给作者发了一封邮件,在他的回复邮件中,他提到了
然后看起来您的指针数组实际上可能不是指针。 例如:
(uint32_t*)&IOPIN0, (uint32_t*)&IOPIN1,
实际上可能是
(uint32_t*)IOPIN0, (uint32_t*)IOPIN1,
取决于如何为您定义 IOPIN0 和 IOPIN1
lpc2148 的 IOPIN0 宏是
#define IOPIN0 (*((volatile unsigned long *) 0xE0028000))
我在 C 方面没有太多经验。 我知道如果宏指的是内存,那么在定义指针数组时我不必使用 & 。 如何知道宏(eg: PORTB, IOPIN0) 是指地址还是值??
【问题讨论】:
-
这在很大程度上取决于
SFR_IO8是什么以及它对0x05值的影响。
标签: c pointers memory-mapping