【无标题】

目录

前言

一、通用定义

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”中可以找到

一、通用定义


  
  
  1. # define AUTOMATIC
  2. # define TYPEDEF
  3. # define NULL_PTR ((void *)0)
  4. # define INLINE inline
  5. # define LOCAL_INLINE static inline
1.1 AUTOMATIC

        # define AUTOMATIC

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

1.2 TYPEDEF

        # define TYPEDEF

        在类型定义中使用。

        比如:


  
  
  1. typedef P 2VAR(uint 8, TYPEDEF, DEM_VAR_NOINIT) Dem_DataPtrType;
  2. 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

二、函数定义


  
  
  1. # define FUNC(rettype, memclass) rettype
  2. # define FUNC_P2CONST(rettype, ptrclass, memclass) const rettype*
  3. # define FUNC_P2VAR(rettype, ptrclass, memclass) rettype*
2.1 FUNC

        # define FUNC(rettype, memclass) rettype

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

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

        比如:


  
  
  1. BSWM_LOCAL FUNC(Std_ReturnType, BSWM_ CODE) BswM_ActionList_ESH_AL_ExitRun(void)
  2. {
  3. / * delete * /
  4. }

返回值:Std_ReturnType

代码归属:BSWM_CODE


  
  
  1. typedef uint8 Std_ReturnType;
  2. # 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:代码的分类

        比如:


  
  
  1. FUNC_P 2CONST(Os_TaskConfigType, OS_CONST, OS_ CODE) Os_SchedulerRemoveCurrentTask
  2. (
  3. P 2CONST(Os_SchedulerConfigType, AUTOMATIC, OS_CONST) Scheduler
  4. )
  5. {
  6. / * delete * /
  7. / * # 50 Return next task. * /
  8. return Scheduler- >Dyn- >NextTask;
  9. }

        返回值: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类似,一个返回值是常量类型的指针,一个返回值是变量类型的指针

三、指针定义


  
  
  1. # define P2VAR(ptrtype, memclass, ptrclass) ptrtype*
  2. # define P2CONST(ptrtype, memclass, ptrclass) const ptrtype*
  3. # define CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype* const
  4. # define CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype* const
  5. # define P2FUNC(rettype, ptrclass, fctname) rettype (* fctname)
  6. # 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


  
  
  1. typedef uint 8 Nm_ModeType;
  2. typedef uint 8 NetworkHandleType;
  3. typedef uint 8 Nm_StateType;
  4. typedef uint 8 Nm_ModeType;
  5. FUNC(Std_ReturnType, NMOSEK_ CODE) NmOsek_GetState(
  6. CONST(NetworkHandleType, AUTOMATIC) nmChannelHandle,
  7. CONSTP 2VAR(Nm_StateType, AUTOMATIC, NMOSEK_APPL_VAR) nmStatePtr,
  8. CONSTP 2VAR( Nm_ModeType, AUTOMATIC, NMOSEK_APPL_VAR) nmModePtr)
  9. {
  10. / * delete * /
  11. / * # 40 Copy state to provided state pointer * /
  12. *nmStatePtr = NmOsek_GetNmState(NMOSEK_CHANNEL_IDX); /* SBSW_NMOSEK_GETSTATE */
  13. }

       上面整个函数展开即为:


  
  
  1. uint 8 NmOsek_GetState(
  2. const uint 8 nmChannelHandle,
  3. uint 8 * const nmStatePtr,
  4. unit 8 * const nmModePtr)
  5. {
  6. / * delete * /
  7. / * # 40 Copy state to provided state pointer * /
  8. *nmStatePtr = NmOsek_GetNmState(NMOSEK_CHANNEL_IDX); /* SBSW_NMOSEK_GETSTATE */
  9. }

        举例:


  
  
  1. char *const p = "Hello world!";
  2. p[ 3] = '3';
  3. / /p = "Hi!"; error C 3892: “p”: 不能给常量赋值
3.4 CONSTP2CONST

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

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

        比如:


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

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

        举例:


  
  
  1. const char *const p = "Hello world!";
  2. / /p[ 3] = '3'; / / error C 3892: “p”: 不能给常量赋值
  3. / /p = "Hi!"; / / error C 3892: “p”: 不能给常量赋值
3.5 P2FUNC

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

        定义一个函数指针

        比如:


  
  
  1. struct Rte_PDS_CtSaDoor_PiDoorState_P
  2. {
  3. P 2FUNC(Std_ReturnType, RTE_ CODE, Write_DeDoorState) (IdtDoorState);
  4. };
  5. 展开为: uint 8 ( * Write_DeDoorState)(IdtDoorState)
  6. struct Rte_CDS_CtSaDoor
  7. {
  8. / * Port API section * /
  9. struct Rte_PDS_CtSaDoor_PiDoorState_P PpDoorState;
  10. uint 8 Instance_Id;
  11. };
  12. CONST(struct Rte_CDS_CtSaDoor, RTE_CONST) Rte_Instance_CpSaDoorFrontLeft =
  13. {
  14. / * Port API section * /
  15. {
  16. Rte_WriteInst 1_CtSaDoor_PpDoorState_DeDoorState,
  17. },
  18. / * Instance Id section * /
  19. 0,
  20. };
  21. FUNC(Std_ReturnType, RTE_ CODE) Rte_WriteInst 1_CtSaDoor_PpDoorState_DeDoorState(IdtDoorState data)
  22. {
  23. / * delete * /
  24. }

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

3.6 CONSTP2FUNC

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

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

        这个应该不常用

四、常量变量定义


  
  
  1. # define CONST( type, memclass) const type
  2. # 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:常亮的分类

        比如:


  
  
  1. # define CANIF_LOCAL static
  2. CANIF_LOCAL VAR(boolean, CANIF_VAR_INIT) CanIf_SystemInit = FALSE;

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

                        static boolean CanIf_SystemInit = FALSE;

五、结尾

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值