В настоящее время я кодирую на C и использую микроконтроллер nRF51 от NORDIC (32-разрядный ARM Cortex M0).
Я хотел бы отправить буфер союза по радио. Для этого я должен указать адрес буфера объединения в PACKETPTR. В противном случае адрес, указанный в "PACKETPTR", должен быть, согласно ссылке на руководство: адрес ОЗУ с выравниванием по байтам. Если он не выровнен, ему удается взять следующий ближайший, но таким образом получатель получит неполный буфер и «фиктивные» данные...
Как вы можете догадаться, мой буфер не выровнен по байтам. Вот соответствующий союз и глобальная переменная.
Элементы моего объединения должны быть упакованы так, чтобы они могли поместиться в 7 байтов;
typedef union
{
uint8_t buf[7]; //The buffer I give to PACKETPTR
__packed struct
{
uint8_t a[2];
uint8_t b;
uint16_t c : 10;
uint16_t d : 6;
uint16_t e : 14;
uint16_t f : 2;
}parts;
}adv_t;
adv_t m_adv; //The global variable
...
//Later in the code to set PACKETPTR
config_tx(ADV_PIPE, m_adv.buf);
...
void __INLINE config_tx(uint8_t tx_pipe, uint8_t* payload)
{
NRF_RADIO->TXADDRESS = tx_pipe;
NRF_RADIO->PACKETPTR = (uint32_t)payload;
}
В начале я добавил квалификатор __packed
перед typedef union
. Но это было так, как если бы m_adv
был «упакован» некоторыми предыдущими данными, поэтому адрес buf
не был выровнен по байтам с адресом оперативной памяти.
__packed typedef union /* Previous definition */
{
uint8_t buf[7];
__packed struct
{
...
}parts;
}adv_t;
Поэтому я удалил его, и тогда адрес buf был правильным (т.е. байт выровнен с адресом RAM). Я думал, что это было решением, но через несколько минут он снова стал смещенным... Мои вопросы: влияет ли квалификатор __packed
также на buf из-за объединения? есть ли способ выровнять адрес buf
из моей глобальной переменной? Или любое предложение?
Спасибо
long unused
члена? - person 2501   schedule 20.01.2016struct { char a:2; char b; };
b тоже не выровнено по байтам, потому что a:2 не заканчивается на границе байта. Но это не так, здесь b тоже будет выровнено по байтам. - person Ctx   schedule 20.01.2016_Static_assert(sizeof(m_adv.buf) == sizeof(m_adv.parts); "Error: padding detected");
- person Lundin   schedule 20.01.2016buf
. Это чрезвычайно зависит от реализации. - person Andrew Henle   schedule 20.01.2016