AutoSAR(Davinci) --- 如何阅读AutoSAR中的代码

目录

前言

一、通用定义

1.1 AUTOMATIC

1.2 TYPEDEF

1.3 NULL_PTR

1.4 INLINE

1.5 LOCAL_INLINE

二、函数定义

2.1 FUNC

2.2 FUNC_P2CONST

2.3 FUNC_P2VAR

三、指针定义

3.1 P2VAR

3.2 P2CONST

3.3 CONSTP2VAR

3.4 CONSTP2CONST

3.5 P2FUNC

3.6 CONSTP2FUNC

四、常量变量定义

4.1 CONST

4.2 VAR

五、结尾


前言

        笔者在第一次阅读AutoSAR代码的时候也是一头雾水,一脸懵逼,这都什么玩意啊,完全看不懂啊,经过一点点深入挖掘,终于了解到了一点皮毛,这边就分享给大家。

        下面的宏定义在 “Compiler.h”中可以找到

一、通用定义

# define AUTOMATIC

# define TYPEDEF

#  define NULL_PTR  ((void *)0)

#  define INLINE       inline

#  define LOCAL_INLINE    static inline

1.1 AUTOMATIC

        # define AUTOMATIC

        这表明这个指针只会在当前文件中使用,是一个局部的。

1.2 TYPEDEF

        # define TYPEDEF

        在类型定义中使用。

        比如:

typedef P2VAR(uint8, TYPEDEF, DEM_VAR_NOINIT)    Dem_DataPtrType;

Dem_DataPtrType lReturnValue;

        表明这是一个类型定义。

1.3 NULL_PTR

        #  define NULL_PTR  ((void *)0)

        定义一个指向0地址的一个空指针

1.4 INLINE

        #  define INLINE       inline

        定义关键字inline的抽象

1.5 LOCAL_INLINE

        #  define LOCAL_INLINE    static inline

        定义这个关键字inline的抽象,包含了一个static

二、函数定义

# define FUNC(rettype, memclass) rettype

# define FUNC_P2CONST(rettype, ptrclass, memclass) const rettype*

# define FUNC_P2VAR(rettype, ptrclass, memclass) rettype*

2.1 FUNC

        # define FUNC(rettype, memclass) rettype

        用于申明一个函数,函数的返回值类型为:rettype

        memclass:代码的分类,属于BSW,OS,还是APP等等,无实际意义

        比如:

BSWM_LOCAL FUNC(Std_ReturnType, BSWM_CODE) BswM_ActionList_ESH_AL_ExitRun(void)
{
    /* delete    */
}

返回值:Std_ReturnType

代码归属:BSWM_CODE

typedef uint8 Std_ReturnType;

# define BSWM_LOCAL static

那么上面那个函数展开就是:static uint8 BswM_ActionList_ESH_AL_ExitRun(void)

2.2 FUNC_P2CONST

        # define FUNC_P2CONST(rettype, ptrclass, memclass) const rettype*

        用于申明一个函数,这个函数的返回值类型为const 指针,

        ptrclass:指针的归属

        memclass:代码的分类

        比如:

FUNC_P2CONST(Os_TaskConfigType, OS_CONST, OS_CODE) Os_SchedulerRemoveCurrentTask
(
  P2CONST(Os_SchedulerConfigType, AUTOMATIC, OS_CONST) Scheduler
)
{
    /* delete */

  /* #50 Return next task. */
  return Scheduler->Dyn->NextTask;
}

        返回值:Os_TaskConfigType*

        指针的分类:OS_CONST

        代码的分类:OS_CODE

        那么这个函数展开就是:

                        Os_TaskConfigType* Os_SchedulerRemoveCurrentTask(。。。)

        PS:P2CONST下面讲解

2.3 FUNC_P2VAR

        # define FUNC_P2VAR(rettype, ptrclass, memclass) rettype*

        用于申明一个函数,这个函数的返回值类型为变量指针。

        返回值:rettype*

        ptrclass:指针的归属

        memclass:代码的分类

        这个函数跟上面的FUNC_P2CONST类似,一个返回值是常量类型的指针,一个返回值是变量类型的指针

三、指针定义

# define P2VAR(ptrtype, memclass, ptrclass) ptrtype*

# define P2CONST(ptrtype, memclass, ptrclass) const ptrtype*

# define CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype* const

# define CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype* const

# define P2FUNC(rettype, ptrclass, fctname) rettype (* fctname)

# define CONSTP2FUNC(rettype, ptrclass, fctname) rettype (* const fctname)

3.1 P2VAR

        # define P2VAR(ptrtype, memclass, ptrclass) ptrtype*

        用于申明和定义一个指针变量。

        ptrtype:指针的类型

        memclass:指针变量本身的分类

        ptrclass:指针的分类,归属

        比如:

P2VAR(uint8, AUTOMATIC, COM_APPL_VAR) SignalApplDestPtr;

        展开即为:uint8* SignalApplDestPtr;

3.2 P2CONST

        # define P2CONST(ptrtype, memclass, ptrclass) const ptrtype*

        用于申明和定义RAM中一个指向常量的指针,指针的内容可以改变,但是该内容指向的内容不可改变。即:该指针可以指向任何常量,但不能修改这些常量的值。

        比如:

P2CONST(uint8, AUTOMATIC, COM_APPL_DATA) SignalApplSourcePtrInternal = SignalApplSourcePtr;

        SignalApplSourcePtr:就是一个素组名(首地址)

        展开即为:const uint8 *SignalApplSourcePtrInternal = SignalApplSourcePtr;

3.3 CONSTP2VAR

        # define CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype* const

        申明和定义一个指针,该指针的内容不可改变,但是该内容指向的内容可以修改;即:该指针只能指向固定的一个地址,但是该地址上的内容可以修改。

        比如:

        CONSTP2VAR(Nm_StateType, AUTOMATIC, NMOSEK_APPL_VAR) nmStatePtr

typedef uint8 Nm_ModeType;
typedef uint8 NetworkHandleType;
typedef uint8 Nm_StateType;
typedef uint8 Nm_ModeType;


FUNC(Std_ReturnType, NMOSEK_CODE) NmOsek_GetState(
    CONST(NetworkHandleType, AUTOMATIC) nmChannelHandle,
    CONSTP2VAR(Nm_StateType, AUTOMATIC, NMOSEK_APPL_VAR) nmStatePtr,
    CONSTP2VAR( Nm_ModeType, AUTOMATIC, NMOSEK_APPL_VAR) nmModePtr)
{
    /* delete */

    /* #40 Copy state to provided state pointer */
    *nmStatePtr = NmOsek_GetNmState(NMOSEK_CHANNEL_IDX); /* SBSW_NMOSEK_GETSTATE */
}

       上面整个函数展开即为:

uint8 NmOsek_GetState(
    const uint8 nmChannelHandle,
    uint8* const nmStatePtr,
    unit8* const nmModePtr)
{
    /* delete */

    /* #40 Copy state to provided state pointer */
    *nmStatePtr = NmOsek_GetNmState(NMOSEK_CHANNEL_IDX); /* SBSW_NMOSEK_GETSTATE */
}

        举例:

char *const p = "Hello world!";
p[3] = '3';  
//p = "Hi!";  error C3892: “p”: 不能给常量赋值

3.4 CONSTP2CONST

        # define CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype* const

        申明和定义一个指针,该指针的内容不可改变,且该指针内容指向的内容也不可改变。

        比如:

FUNC(void, CANSM_CODE) CanSM_PreInit( 
        CONSTP2CONST( CanSM_ConfigType, AUTOMATIC, CANSM_CONST ) ConfigPtr )

        展开即为:voud CanSM_PreInit(const CanSM_ConfigType* const ConfigPtr)

        举例:

const char *const p = "Hello world!";
//p[3] = '3';  //error C3892: “p”: 不能给常量赋值
//p = "Hi!";   //error C3892: “p”: 不能给常量赋值

3.5 P2FUNC

        # define P2FUNC(rettype, ptrclass, fctname) rettype (* fctname)

        定义一个函数指针

        比如:

struct Rte_PDS_CtSaDoor_PiDoorState_P
{
  P2FUNC(Std_ReturnType, RTE_CODE, Write_DeDoorState) (IdtDoorState);
};

展开为: uint8 (*Write_DeDoorState)(IdtDoorState)

struct Rte_CDS_CtSaDoor
{
  /* Port API section */
  struct Rte_PDS_CtSaDoor_PiDoorState_P PpDoorState;
  uint8 Instance_Id;
};

CONST(struct Rte_CDS_CtSaDoor, RTE_CONST) Rte_Instance_CpSaDoorFrontLeft =
{
  /* Port API section */
  {
    Rte_WriteInst1_CtSaDoor_PpDoorState_DeDoorState,
  },
  /* Instance Id section */
  0,
};

FUNC(Std_ReturnType, RTE_CODE) Rte_WriteInst1_CtSaDoor_PpDoorState_DeDoorState(IdtDoorState data)
{
    /* delete */
}

        上图代码可以理解为:uint8 (*Write_DeDoorState)(IdtDoorState)指针,指向函数Rte_WriteInst1_CtSaDoor_PpDoorState_DeDoorState

3.6 CONSTP2FUNC

        # define CONSTP2FUNC(rettype, ptrclass, fctname) rettype (* const fctname)

        定义一个函数指针,该指针指向一个固定地址,但是地址上的内容可以改变。

        这个应该不常用

四、常量变量定义

# define CONST(type, memclass) const type

# define VAR(vartype, memclass) vartype

4.1 CONST

        # define CONST(type, memclass) const type

        用于申明和定义一个常量

        type:常量的类型(uint8,int16,float等等)

        memclass:常亮的分类

        比如:

CONST(uint8, CANIF_CONST) CanIf_SubVersion          = (uint8)CANIF_SW_MINOR_VERSION;

        上面的申明拆接下来就是: 

                                uint8 CanIf_SubVersion  = (uint8)CANIF_SW_MINOR_VERSION;

4.2 VAR

        # define VAR(vartype, memclass) vartype

        用于申明和定义一个变量

        vartype:变量的类型(uint8,int16,float等等)

        memclass:常亮的分类

        比如:

# define CANIF_LOCAL static

CANIF_LOCAL VAR(boolean, CANIF_VAR_INIT) CanIf_SystemInit = FALSE;

上面的申明拆解下来就是: 

                        static boolean CanIf_SystemInit = FALSE;

五、结尾

        AutoSAR代码还是真的难读啊。。。好好看一看,还是能找到记住的方法的,各位加油。

AutoSAR DaVinci是一种用于生成汽车嵌入式软件的开发工具。它可以根据Autosar标准和指南生成C代码,以用于各种汽车电子控制单元(ECU)的应用软件开发。 AutoSAR DaVinci可以将基于模型的设计转换为可执行的代码。它支持不同层次的软件架构和模型,包括应用软件、基本软件和硬件相关的软件。使用DaVinci工具,开发人员可以使用图形化界面来定义和组织软件的架构,并使用AutoSAR规范定义的标准模板和构件来设计软件部件。 在生成代码的过程AutoSAR DaVinci会根据规定的规则和配置参数对模型进行转换,并生成与目标ECU硬件和软件平台兼容的C代码。它还可以根据ECU的特定需求生成代码,并为诸如通信协议、网络管理和诊断功能等添加必要的功能代码。生成的代码可以通过诸如编译器、链路器和调试器之类的工具进行编译、构建和调试。 利用AutoSAR DaVinci生成的代码具有高质量和可靠性。它遵循AutoSAR标准,确保生成的代码与其他AutoSAR兼容的软件组件无缝集成。此外,它还提供了丰富的检查和验证功能,以确保生成的代码的正确性和一致性。 总之,AutoSAR DaVinci是一种强大的工具,可以帮助汽车软件开发人员根据AutoSAR标准生成高质量的嵌入式软件代码。它简化了软件开发流程,提高了开发效率和代码可靠性,同时也提供了丰富的功能和自定义选项,以满足不同ECU的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常学常思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值