如何在 Autosar 中使用位域创建联合实现数据类型?

Posted

技术标签:

【中文标题】如何在 Autosar 中使用位域创建联合实现数据类型?【英文标题】:How to create Union Implementation data type with bitfields in Autosar? 【发布时间】:2019-11-16 02:38:04 【问题描述】:

我正在探索如何在 AUTOSAR 中创建复杂的数据类型。一直在寻找以下问题,但我还没有找到一个可以清楚地告诉我方法的问题。

我想以这种形式创建一个 IRV:

union 
    uint8 u8Value;
    struct 
        uint8 bit0 : 1;
        uint8 bit1 : 1;
        ...
    stMyBits;
unMyUnion;

根据我自己的调查,我在 SW Data Prop Ref 中发现了所谓的 SwBitsRepresentation,您可以从中指定起始位置和位数。但是,它不起作用,因为 RTE 生成的代码如下所示:

union 
    uint8 u8Value;
    struct 
        uint8 bit0;
        uint8 bit1;
        ...
    stMyBits;
unMyUnion;

编译它肯定不会应用所需的位域。

【问题讨论】:

【参考方案1】:

由于缺乏可移植性,AUTOSAR 不支持 C 位字段。如果你想实现一个位域语义,你需要定义一个ImplementationDataType,它聚合了一个SwDataDefProps,它又引用了BITFIELD_TEXTTABLE类别的CompuMethod

CompuMethod 的定义中,您可以指定位域及其语义。

RTE 生成器将通过生成访问宏来支持此配置,这些宏提供了或多或少方便的方式来访问主机变量中的位。

您可以在 AUTOSAR 文档“TPS 软件组件模板”中找到有关 CompuMethod 类别 BITFIELD_TEXTTABLE 的定义的更多信息。

【讨论】:

感谢您的指点!我会尽快深入研究并回到这里! 非常感谢@Uwe!这正是我所需要的。 ImplementationDataType 位于 C 代码级别。从那里,我们可以为VALUE 类别的AutosarDataType 定义几个CompuMethod,在我的例子中是BITFIELD_TEXTTABLEBITFIELD_TEXTTABLE 包含所有必要的属性,例如掩码、上限/下限,当然还有您希望使用COMPU-CONST 属性为每个位指示的含义。

以上是关于如何在 Autosar 中使用位域创建联合实现数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

联合体结合位域使用技巧

014 枚举 位段/位域 联合体

澄清 C 中的位域排序语义

如何将结构从 C++ 迁移到 C#

AUTOSAR CAN 堆栈实现提示

C语言自定义类型一网打尽(结构体位段/位域枚举联合体)