сохранение 16-битной переменной в разыменованную переменную записывает 32 бита - PullRequest
0 голосов
/ 28 марта 2019

Рассмотрим следующее:

// main.h
struct
{
    uint16_t aChargeOption0;
    uint16_t aChargeOption1;
} oBattChargerInfo;

typedef struct CHGRRM
{
    uint16_t nRegIndex;
    uint8_t  nDataType;
    uint32_t nDataWidth;
    uint32_t nRegAddress;
    bool     IsWritable;
    bool     HasBits;
    uint32_t nBitStoreStart;
        uint32_t nBitStoreEnd;
    int  *ptrToData;
} chargerRegMap_t;

extern chargerRegMap_t charger_reg_map[];



// main.c

chargerRegMap_t charger_reg_map[] =
{
  { &oBattChargerInfo.aChargeOption0 },
  { &oBattChargerInfo.aChargeOption1 },
};




// code to store a variable to the de-referenced variable
uint16_t aFinalBuff=0x00;
aFinalBuff=buff[1]<<8;     // buff[0] and buff[1] is uint8 
aFinalBuff=aFinalBuff+buff[0];
*charger_reg_map[nRegIndex].ptrToData=aFinalBuff;

Когда я сохраняю первую переменную (charger_reg_map[0].ptrToData, которая в первом случае oBattChargerInfo.aChargeOption0), 16-битная переменная перезаписывает смежную переменную oBattChargerInfo.aChargeOption1. Помимо установки каждой переменной в моей структуре oBattChargerInfo на 32 бита, есть ли другое решение? Кажется странным, что разыменованная переменная будет работать таким образом.

Я пытался * charger_reg_map [nRegIndex] .ptrToData = (uint16_t) aFinalBuff; прояснить свое намерение. Не имеет значения.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 29 марта 2019

Если вам нужны переменные разных размеров, вы не можете использовать тип указателя для записи во все из них.

Дизайн немного хрупкий, так как вам нужно знать, на какой элемент указывает указатель или, по крайней мере, его тип.

Я думаю, что лучшим вариантом было бы выполнить работу с memcpy через функцию и добавить элемент 'size' в chargerRegMap_t для проверки работоспособности.

Что-то вроде

void write_data(chargerRegMap_t* map, void* data, size_t size)
{
    assert(size == map->data_size);
    memcpy(map->ptrToData, data, size);
}

/* ... */
uint16_t aFinalBuff = 0x00;
aFinalBuff = buff[1] << 8; 
aFinalBuff = aFinalBuff + buff[0];
write_data(charger_reg_map + nRegIndex, &aFinalBuff, sizeof(aFinalBuff));  

Я бы, вероятно, добавил к этому макрос, чтобы устранить sizeof опечатки и сделать его менее утомительным:

#define WRITE_DATA(map, data) write_data(map, &data, sizeof(data))
/* ... */
WRITE_DATA(charger_reg_map + nRegIndex, aFinalBuff);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...