Я имею в виду документ для написания многоразовой прошивки, и код, поставляемый с книгой, использует массивы указателей для отображения памяти.
Я немного запутался в отображении памяти
Из этого 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 определены для вашей части
Макрос IOPIN0 для lpc2148 равен
#define IOPIN0 (*((volatile unsigned long *) 0xE0028000))
У меня нет большого опыта в C. Я знаюесли макрос ссылается на память, мне не нужно использовать & при определении массивов указателей.Как я могу знать, если макрос (например: PORTB, IOPIN0) ссылается на адрес или значение ??