Пересчет адреса переменной в виде целого числа - PullRequest
0 голосов
/ 27 мая 2019

В соответствии с таблицей микроконтроллеров NRF52840 указатель пакета - это «адрес пакета, который будет использоваться для следующей передачи или приема. При передаче пакет, указанный по этому адресу, будет передан, а при приеме принятый пакет будетнаписано по этому адресу.Используя прямую адресацию регистра, я пытаюсь присвоить адрес переменной указателю с отсутствующими ссылками, который указывает на адрес регистра указателя пакета NRF52.Код компилируется без ошибок, и сообщение отправляется, но полученные данные - не то, что я намеревался отправить.Так как это первый раз, когда мне нужно было изменить указатель на int, я предполагаю, что я делаю это неправильно.

Cplusplus.com сообщает reinterpret_cast "... также может приводить указатели к целочисленным типам или из них".Я также нашел здесь , что следует соблюдать правильный тип.Может кто-нибудь взглянуть на мою функцию Radio :: read и проверить правильность использования reinterpret_cast?

#include <cstdint>

#define BASE_ADDRESS_RADIO              0x40001000
#define OFFSET_REGISTER_PACKETPTR       0x504 // Packet pointer
#define OFFSET_REGISTER_STATE           0x550 // Current radio state

unsigned int Radio::read (void){
    unsigned int rx_buff;
    static std::uintptr_t * packet_pointer = (unsigned int *) 
(BASE_ADDRESS_RADIO + OFFSET_REGISTER_PACKETPTR);
    static unsigned int * radioState_reg = (unsigned int *) 
(BASE_ADDRESS_RADIO + OFFSET_REGISTER_STATE);

    while((*radioState_reg != RXIDLE)&&(*radioState_reg != TXIDLE)&& 
(*radioState_reg != DISABLED)){}
    if (*radioState_reg == TXIDLE){
        radio_disable();
    }
    if(*radioState_reg == DISABLED){
        rx_en();
    }
    *packet_pointer = reinterpret_cast<std::uintptr_t>(&rx_buff);
    start_job();
    return rx_buff;
}

Прием принимаемых радиосигналов почти мгновенно после начала передачи на другое радио;однако отправка одного байта данных приводит к полному чтению 4 байтов на другом конце.

...