主题中讨论的其他器件:C2000WARE
(笑声)
您好、专家、
我的客户希望对 C28内核上的结构执行字对齐、这可以由 ARM 内核上的#pragma Pack 轻松使用。
例如:
typedef 结构
{
int test1;
长 test2;
int test3;
int test4;
}测试;
test1将占用32位、如下所示、是否有与16位大小对齐的方法? 它似乎#pragma Pack 不适用于 C28。 还有其他方法吗?

This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
(笑声)
您好、专家、
我的客户希望对 C28内核上的结构执行字对齐、这可以由 ARM 内核上的#pragma Pack 轻松使用。
例如:
typedef 结构
{
int test1;
长 test2;
int test3;
int test4;
}测试;
test1将占用32位、如下所示、是否有与16位大小对齐的方法? 它似乎#pragma Pack 不适用于 C28。 还有其他方法吗?

强、
C28x 无法在奇数基址上对齐 long (32位)、因此这里的操作是正确的、强制将 test2强制为0xAA92。
如果强制 test2的地址为0xAA91、它会将32位写入0xAA90和0xAA91、从而破坏 test1。
底线是 C28x 的架构强制32位数据对齐。
我知道使该尺寸更有效的唯一方法是将所有 INT 组合在一起、然后将 longs 组合在一起。 但是、如果存在奇数如果 INT、则始终会有16位的空空间变为长整型。
最棒的
Matthew
强、
根据 Matthew 的建议对变量进行分组后、可以使用位打包(如头文件中使用的位打包)来更轻松地对较小的数据变量进行逻辑访问。 例如、在~\C2000Ware_XXXX\device_support\f2838x\headers\include\f2838x_cputimer.h 中
struct TIM_bits{ // bits description
UINT16 lsw:16; // 15:0 CPU 定时器计数器寄存器
UINT16 MSW:16; // 31:16 CPU 定时器计数器寄存器高
};
UNION TIM_REG{
uint32 all;
STRUCT_TIM_BITS 位;
};
struct TPR_bits{ // bits description
UINT16 TDDR:8; // 7:0 CPU 定时器分频。
uint16 PSC:8; // 15:8 CPU 定时器预分频计数器。
};
UNION TPR_REG{
uint16 全部;
结构 TPR_Bits 位;
};
struct CPUTIME_regs{
UNION TIM_REG TIM; // CPU 计时器、计数器寄存器
UNION PRD_REG PRD; // CPU 计时器、周期寄存器
UNION TCR_REG TCR; // CPU 定时器、控制寄存器
uint16 rsvd1; //保留
UNION TPR_REG TPR; // CPU 定时器、预分频寄存器
UNION TPRH_REG TPRH; // CPU 定时器、预分频寄存器高电平
};
Tommy