SOMEIP_集成手册
文档控制
日期 |
作者 |
版本 |
状态 |
说明 |
---|---|---|---|---|
20 22/10/26 |
吴挺伟 |
V0.1 |
【 初稿】 |
初版 |
2 023/2/15 |
吴挺伟 |
V0.2 |
【 修改】 |
修改Sd、 SomeIpTp、SomeIpXf参考文件名 |
2 024/7/16 |
陈伯奇 |
V1.0 |
【 发布】 |
1.更新4.2.1参考手册名称名称修 改2.修改4.3.1参考章节引用错误 3.4.1章节第7步增加截图 4.删除5.3章节第3步 “添加调度文件,点击应用保存。 5.5.4章 节main函数中代码修改为ComM_C hComAllow(ComMUser_ETH,TRUE); 6.修改截图 |
目的
本文档旨在通过一个SOMEIP示例工程的配置,向用户展示SOMEIP的集成过程。
通过阅读本文档,用户可以了解ORIENTAIS配置工具的配置过程,以及如何应用配置工具生成的配置文件。
为了让用户更清晰的了解工具的使用,所用的配置均逐一手动完成。用户在了解了配置的基本过程后,可以快速完成配置。
缩写词和术语
缩写 词/术语 |
描述 |
SoAd |
Socket Adapter 将socket的数据和PDU进行转换 |
Sd |
Service Discovery 服务发现模块 |
SOMEIP |
Scalable service-Oriented MiddlewarE over IP 可扩展的面向服务的IP中间件 |
RTE |
Runtime Enviroment 虚拟运行唤醒 |
SWC |
Software Component 软件组件 |
参考文档
[1] 参考手册_Sd.pdf
[2] 参考手册_SomeIpTp.pdf
[3] 参考手册_SomeIpXf.pdf
协议栈集成
新建ORIENTAIS工程
①安装软件后,双击软件图标打开软件
②菜单栏File🡪New🡪Project,新建工程
③在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next
④在弹出的窗口中输入工程名,选择Finish
⑤在弹出的窗口中选择Yes。
⑥在工程的[Bsw_Builder]项目上右键,选择New ECU Configuration
⑦在弹出的窗口中输入一个ECU名,然后选择Next
⑧在弹出的窗口中勾选需要添加的模块,点击Finish。
⑨新建完成的工程如下所示,步骤7中添加的模块已经被加入到工程中。
配置文件生成
模块配置
模块的具体配置,取决于具体的项目需求。SOMEIP各模块配置项的详细介绍,参见《参考手册_Sd.pdf》、《参考手册_SomeIpTp.pdf》、《参考手册_SomeIpXf.pdf》。
配置代码生成
①在工程上右键会弹出校验整个工程和生成整个工程所有模块配置文件的菜单。
②首先选择Validate All,没有错误提示信息即校验通过。
③然后选择Generate All,生成配置文件。右下角的输出框中会输出生成的配置文件信息。
④在工程Config文件夹下即可查看生成的配置文件。
功能集成
代码集成
协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Configurator配置生成代码。SOMEIP集成包括SOMEIP源码(SD、SomeipXf)。
用户须将协议栈源码和章节4.2.2生成的配置源代码添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节5.3。
注意:协议栈集成之前,用户须确保已经有基础工程,以及以太网通信协议栈已集成,且本协议栈相关的其他协议栈能正常工作。
集成注意事项
对于集成过程中,协议栈特殊要求和用户经常出现的问题,归类总结形成下表4-1。用户需逐一排查表中的约束项,以避免集成问题出现。
表4-1 SOMEIP集成约束清单
编 号 * |
类别* |
约束限制 |
** 1** |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
** 2** |
头文件 |
栈代码之后,用户需更新集成开发工具中的头文件路径。
|
** 3** |
初始化 |
SOMEIP协议栈的初始化顺序为:EthIf_Init, TcpIp_Init, SoAd_Init,SomeIpXf_Init,Sd_Init。 |
** 4** |
周 期函数 |
EthSM_Ma inFunction,EthIf_MainFunctionState,Sd_MainFunction, ComM_MainFu nction_<ComMChannel_ETH>需要被周期性任务函数调用。 |
配置过程
集成目标
本手册会以以下参数作为示例,进行集成演示。
参数 |
值 |
SdServerSe rvice实例参数 |
SdServerServiceId:0x1 SdServerServiceInstanceId:0x1 SdServerServiceMajorVersion:1 SdServerServiceMinorVersion:1 |
SdServer Timer时间参数 |
SdServerTimerInitialOfferDelayMax:0.1 SdServerTimerInitialOfferDelayMin:0.0 SdServerTimerInitialOfferRepetitionBaseDelay:0.03 SdServerTimerInitialOfferRepetitionsMax:3 SdServerTimerOfferCyclicDelay:1.0 SdServerTimerRequestResponseMaxDelay:0.5 SdServerTimerRequestResponseMinDelay:0.0 SdServerTimerTTL:300 |
Socket信息 |
Sd单播本地:172.31.30.78/ UDP/30490 Sd多播本地:239.192.255.250/ UDP/30490 AddMethod本地:172.31.30.78/ TCP/12310 AddMethod远端:172.31.30.80/ TCP/0(端口号为通配符) |
序列化参数 |
加法运算请求参数: typedef struct { uint16 number_a; uint16 number_b; } AddMethodReq; 加法运算结果参数: typedef uint32 AddMethodResp; |
模块配置
EcuC模块配置
①双击EcuC模块,打开EcuC模块配置界面。
②在EcucConfigSets栏目上右键新建 EcucConfigSet。
③再在EcucPduCollections上右键新建EcucPduCollection。配置PduIdTypeEnum为UINT16,PduLengthTypeEnum为UINT32。
④在EcucPduCollection上右键,选择Pdu,生成一个Pdu的配置界面。
⑤配置4个PDU用于加法运算服务的收发,pdu长度为500, SoAd_SdInstance0_AddMethodReq、LdCom_SdInstance0_AddMethodReq、SoAd_SdInstance0_AddMethodResp、LdCom_SdInstance0_AddMethodResp;
配置3个PDU用于用于SD模块的单/多播收发,pdu长度1400, SdInstance0_Unicast_Rx、SdInstance0_Multicast_Rx、SdInstance0_Tx。
⑥ECUC模块配置完成,在模块上右键,选择校验。
⑦查看校验窗口,校验提示窗口没有错误信息,即校验通过。
Tcpip模块配置
①在TcpIp模块添加Sd模块使用的多播地址239.192.255.250。
②按照步骤1配置SD模块单播地址172.31.30.78.
③校验后提示窗口没有错误信息,即校验通过。
SoAd模块配置
①配置SoAdGeneral,配置调度周期0.005S,Socket最大个数4和SocketGroup的最大个数10。
②配置SoAdBswModules,本例中需关联SD和PDUR,所以新建两个模块并配置SoAdBswModuleRef关联对应模块。
③配置SoAdSocketGroup,Sd和AddMethod Server各配置一个
④配置SoAdSocketConnectionGroup;Sd采用多播/单播收发,需要配置2个Socket,分别用于单播发送/多播发送/单播接收和多播接收;AddMethod Server是TCP Server,需要配置一个Socket。
其中单播收发的Socket配置如下:
多播的Socket配置如下:
AddMethod Server的配置如下:
①配置SoAdPduRoute,即报文发送。
②配置SoAdSocketRoute,即报文接收。
③校验后提示窗口没有错误信息,即校验通过。
Sd模块配置
①SdGeneral页面配置
②配置SdConfig。
③新建一个SdInstance, SdAddrFamily选择TCPIP_AF_INET。
④配置Sd的Pdu,一个多播接收Pdu,一个发送Pdu,一个单播接收Pdu。
⑤右键新建一个SdServerTimer,并配置。
⑥右键新建一个SdSeverService,并配置。
⑦新建一个SdProvidedMethod,并配置。
⑧校验后提示窗口没有错误信息,即校验通过。
Ldcom模块配置
①打开LdcomGeneral,配置Ldcom使用的回调函数声明头文件。
②打开LdcomConfig,配置AddMethod Server报文的收发。
③校验后提示窗口没有错误信息,即校验通过。
PduR模块配置
①PduRGemeral页面保持默认配置,不用修改。
②打开PduRBswModeles,新建并配置PduRBswModules_LdCom、PduRBswModules_SoAd。
③打开PduRRoutingTables,并新建PduRRoutingTable,配置AddrMethod Server报文的收发路由。
④校验后提示窗口没有错误信息,即校验通过。
Xfrm模块配置
①新建DataTypeDescription,并配置序列化使用的参数类型和结构体。
②打开TransformationSet页面,新建并配置一个SOMEIP序列化使用的TransformationTechnology。
配置序列化的HeaderLenght长度,这里配置16Byte。
③新建一个SOMEIPTransformationDescription,配置序列化的字节对齐方式以及数据大小端类型。
④打开BufferProperty,配置序列化报文HeaderLenght长度为16bits。
⑤打开SomeIpXfPublic,新建并配置两个SOMEIPTransformationlSignaProp。
⑥新建并配置两个ClientServerInterface。
⑦新建并配置两个SomeIpXfConfig。
⑧在TransformationSet页面,新建并配置两个Transformations,以生成对应的序列化/反序列化函数。
⑨校验后提示窗口没有错误信息,即校验通过。
源码集成
项目交付给用户的工程结构如下:
①Config目录,这个目录用来存放基础软件配置工具生成的配置文件,SOMEIP有关的配置文件放在该文件夹中。
②模块相关的静态源代码,存放在各个模块的文件夹下。
调度集成
①将4.2章节生成的配置文件复制到Config文件夹中。
②添加初始化函数和周期调用函数。
注意 : 本示例中,SOMEIP初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。
#include “Timer.h”
#include “Led.h”
#include “Mcal_User.h”
#include “UserTimer.h”
#include “Dio.h”
#include “ComM.h”
#include “ComM_Internal.h”
#include “Can.h”
#include “E2EXf.h”
#include “CanNm.h”
#include “ComM.h”
#include “ComM_Internal.h”
#include “EthIf.h”
#include “EthSM.h”
#include “TcpIp.h”
#include “SoAd.h”
#include “LdCom.h”
#include “TestCase.h”
#include “Wdg.h”
#include “WdgM.h”
#include “Mcu.h”
#include “ringbuf.h”
#include “Sd.h”
#include “SomeIpXf.h”
int main(void)
{
eth_ringbuf_init(&g_EthRingBufManager, &g_EthRxPduBuf, ARRAR_SIZE(g_EthRxPduBuf));
McalUser_Init();
PduR_Init(&PduR_PBConfigData);
ComM_Init(&ComM_Config);
EthIf_Init(&EthIf_ConfigData);
EthSM_Init();
TcpIp_Init(&TcpIp_Config);
SoAd_Init(&SoAd_Config);
LdCom_Init(&LdCom_InitCfgSet);
SomeIpXf_Init(&SomeIpXf_Config);
Sd_Init(&Sd_Config);
ComM_ChComAllow(ComMUser_ETH,TRUE);
ComM_RequestComMode(ComMUser_Eth, COMM_FULL_COMMUNICATION);
while (1)
{
if (UserTimer_GetFlag1ms())
{
EthSM_MainFunction();
UserTimer_ClrFlag1ms();
}
if (UserTimer_GetFlag2ms())
{
EthIf_MainFunctionState();
UserTimer_ClrFlag2ms();
}
if (UserTimer_GetFlag5ms())
{
ethif_read_buf();
TcpIp_MainFunction();
SoAd_MainFunction();
ComM_MainFunction(ComMUser_Eth);
UserTimer_ClrFlag5ms();
}
if (UserTimer_GetFlag10ms())
{
TestCase_Send_EthPdu();
Sd_MainFunction();
UserTimer_ClrFlag10ms();
}
}
}
SomeIpXf相关的代码示例需要在LdCom添加函数实现:
#include “SomeIpXf.h”
/*实现一个加法运算服务*/
void LdComRxInd_SdInstance0_AddMethodReq(const PduInfoType* PduInfoPtr)
{
if ((NULL_PTR != PduInfoPtr) && (NULL_PTR != PduInfoPtr->SduDataPtr))
{
AddMethodReq request;
Rte_Cs_TransactionHandleType TransactionHandle;
if (E_OK == SomeIpXf_Inv_AddMethodReq(&TransactionHandle, PduInfoPtr->SduDataPtr, PduInfoPtr->SduLength, &request))
{
uint8 data[128];
uint32 sum = request.number_a + request.number_b;
uint16 length = 0;
** ** if (E_OK == SomeIpXf_AddMethodResp(&TransactionHandle, data, &length, &sum))
{
PduInfoType pdu;
pdu.SduLength = length;
pdu.SduDataPtr = data;
pdu.MetaDataPtr = NULL_PTR;
LdCom_Transmit(SdInstance0_AddMethodResp, &pdu);
}
}
}
}
void LdComTxConf_SdInstance0_AddMethodResp(void)
{
}
验证结果
①使用wireshark监控Offer Service正常多播发送,符合集成目标。
②使用调试助手,发送多播/单播 Find Service报文,都可以接收到单播的Offer Service报文,控制器返回正确,符合预期目标。
③使用调试助手,连接AddMthod TCPserver,发送加法运算请求报文,控制器返回正确运算结果,符合预期目标。