Я имею в виду документ для написания многократно используемой прошивки, и код, поставляемый с книгой, использует массивы указателей для отображения памяти.
Я немного запутался в отображении памяти
Из этого сообщения, если 8-битная память отображается на 0X123, тогда я могу использовать следующее
uint8_t volatile * p_reg = (uint8_t volatile *) 0x1234;
or
#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) на адрес или значение??
SFR_IO8
и что он делает со значением0x05
. - person Some programmer dude   schedule 04.10.2018