目录
前言
笔者在第一次阅读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代码还是真的难读啊。。。好好看一看,还是能找到记住的方法的,各位加油。