我目前正在用 C 编写代码并使用 NORDIC(32 位 ARM Cortex M0)的 nRF51 MCU。
我想通过无线电发送工会的缓冲区。为此,我必须将联合缓冲区的地址提供给 PACKETPTR。否则,根据手册参考,给予“PACKETPTR”的地址必须是:字节对齐的 RAM 地址。如果它没有对齐,它会设法获取下一个最接近的,但这样接收器将接收到不完整的缓冲区和“虚拟”数据......
你可以猜到,我的缓冲区不是字节对齐的。这是相关的联合和全局变量。
我的 union 元素必须被打包,以便它们可以容纳 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
地址不是与 ram 地址字节对齐的。
__packed typedef union /* Previous definition */
{
uint8_t buf[7];
__packed struct
{
...
}parts;
}adv_t;
所以我删除了它,然后 buf 地址是正确的(即字节与 RAM 地址对齐)。我认为这是解决方案,但几分钟后它再次错位......我的问题是:__packed
限定符是否也会因为联合而影响 buf?有没有办法强制buf
我的全局变量中的地址对齐?或者有什么建议?
谢谢