我们的项目应用场景是硬件需要写入一段配置数据。于是,我们计划在M4中开辟了一块内存,作为配置数据的映射。简单示例一下硬件的配置数据。

uint8_t buf[11]
typedef struct
{
uint8_t type;
uint8_t length;
uint8_t cksum;
uint8_t data[8];
} hw_type_a;知识点:结构体中的变量要遵循着取值规则:每个成员变量的起始地址必须是其自身大小的整数倍。
在前述结构体中,虽然有data[8]的空间申请,但其为uint8_t类型,单字节,故其起始地址紧邻着成员cksum。我们通过在Keil中编译并读取内存地址来查看

typedef struct
{
uint8_t type;
uint8_t length;
uint8_t cksum;
uint32_t data[2];
} hw_type_b;这时,成员变量uint32_t data[2]的起始地址就需要进行4字节对齐,带成员cksum后面必须填充一个padding来让对齐,从而满足uint32_t类型的4字节对齐要求。


附上我的测试源代码:
#include <stdint.h>
typedef struct
{
uint8_t type;
uint8_t length;
uint8_t cksum;
uint8_t data[8];
} hw_type_a;
typedef struct
{
uint8_t type;
uint8_t length;
uint8_t cksum;
uint32_t data[2];
} hw_type_b;
uint32_t debug_reg_list[8] = {0};
hw_type_a hw_a;
hw_type_b hw_b;
int main(void)
{
hw_a.type = 0x01;
hw_a.length = 0x04;
hw_a.cksum = 0x3E;
hw_a.data[0] = 0x55;
hw_b.type = 0x02;
hw_b.length = 0x02;
hw_b.cksum = 0x42;
hw_b.data[0] = 0xAA;
debug_reg_list[0] = sizeof(hw_type_a);
debug_reg_list[1] = sizeof(hw_type_b);
while (1)
{
;
}
}最后,个人建议不要使用来强制对齐
我要赚赏金
