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.

[参考译文] TMS320F28388S:如何在 c28内核上对结构进行16位对齐

Guru**** 2534260 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1032973/tms320f28388s-how-to-do-16bit-align-for-struct-at-c28-core

器件型号:TMS320F28388S
主题中讨论的其他器件:C2000WARE

(笑声)

您好、专家、

我的客户希望对 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