UdpNm_集成手册
目的
本集成手册用于指导客户进行UdpNm集成,文档主要包括的内容为:协议栈集成指导、基于普通应用的集成示例讲解、项目集成特殊说明。
由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。
缩写词和术语
缩写 词/术语 |
描述 |
SoAd |
Socket Adapter 套接字适配模块 |
UdpNm |
UDP Network Management 以太网网络管理模块 |
EthSM |
Ethernet State Manager 以太网状态控制模块 |
Nm |
Generic Network Management Interface 通用网络管理接口模块 |
ComM |
Communication Manager 通信管理模块 |
RTE |
Runtime Enviroment 虚拟运行环境 |
SWC |
Software Component 软件组件 |
参考文档
[1] 参考手册_EthIf.pdf
[2] 参考手册_EthSM.pdf
[3] 参考手册_TcpIp.pdf
[4] 参考手册_SoAd.pdf
[5] 参考手册_NmIf.pdf
[6] 参考手册_UdpNm.pdf
[7] 参考手册_ComM.pdf
协议栈集成
新建ORIENTAIS工程
安装ORIENTAIS Configurator软件后,双击软件图标打开软件。
菜单栏File🡪New🡪Project,新建工程。
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。
图 4‑3 新建工程-3
在弹出的窗口中输入工程名,选择Finish。
图 4‑4 新建工程-4
在弹出的窗口中选择Yes。
选择[Bsw_Builder],右键单击,选择New ECU Configuration。
在弹出的窗口中输入ECU名,然后选择Next。
图 4‑7 新建工程-7
在弹出的窗口中勾选需添加的模块,点击Finish。
配置文件生成
模块配置
模块的具体配置,取决于具体的项目需求。UdpNm各模块配置项的详细介绍,参见《参考手册_UdpNm.pdf》。
配置代码生成
在ORIENTAIS Configurator主界面左方,选择对应的协议栈,或者选择整个ECU,单击右键弹出Validate All和Generate All菜单。
选择Validate All对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。
选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。
将ORIENTAIS Configurator切换到Resource模式,即可查看生成的配置文件。
功能集成
代码集成
协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Configurator配置生成代码。
用户须将协议栈源码和章节4.2.2生成的源代码添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节5.3。
注意:协议栈集成之前,用户须确保已经有基础工程,且本协议栈相关的其他协议栈能正常工作。
集成注意事项
对于集成过程中,协议栈特殊要求和用户经常出现的问题,归类总结形成下表4-1。用户需逐一排查表中的约束项,以避免集成问题出现。
表4-1 UDPNM集成约束清单
编 号 * |
类别* |
约束限制 |
** 1** |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
** 2** |
头文件 |
栈代码之后,用户需更新集成开发工具中的头文件路径。
|
** 3** |
初始化 |
UdpNm诊断栈 的初始化顺序为:EthIf_Init、TcpIp_Init、SoAd_Init、 EthSM_Init、UdpNm_Init、 Nm_Init和ComM_Init。 |
** 4** |
周 期函数 |
UdpNm_MainFunction,EthSM_MainFu nction和ComM_MainFunction需要被周期性任务函数调用。 EthSM的调度周期必须大于ComM的调度周期 |
集成示例
集成目标
本手册会以以下参数作为示例,进行集成演示。
表5-1 UDPNM集成参数表
参数 |
值 |
快发周期 |
50ms |
快发次数 |
10 |
正常发送周期 |
500ms |
节点Id |
50 |
RepeatState时间 |
2s |
Nm-Timeout时间 |
5s |
WaitBusSleep时间 |
1.5s |
Socket信息 |
本地:172.31.30.78/ UDP/30500 远端:239.192.255.250/UDP/30500 |
模块配置
EcuC模块配置
双击EcuC模块,打开EcuC模块配置界面。
在EcucConfigSets栏目上右键,选择EcucConfigSet。再在EcucConfigSet上右键,选择New🡪 EcucConfigSet。再在EcucPduCollections上右键,选择New EcucPduCollection。
PduIdTypeEnum 选择UINT8(该参数表示PDU的格式。因为示例只有一对收发报文,PDU数不会超过255,UINT8类型的长度就够存储了)。
PduLengthTypeEnum 选择UINT8(该参数表示数据长度,示例需要配置的报文长度都是8,不会超过255,所以选择UINT8即可)。
在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。
建议不要使用默认生成的Pdu名字(如:Pdu_0),将Pdu名字改成有意义的名字对后续的配置过程将会有很大帮助。
这里按照发送和接收,可以将Pdu名字改为报文的名字。PduLength:Pdu长度,根据实际使用帧的长度设置。
由于UdpNm的收发报文不需要PduR来路由,因此每个方向(发送/接收)只需要配置一个Pdu。对于需要PduR路由的报文,每个方向需要创建2个Pdu。
ECUC模块到此配置结束。可以在模块上右键,然后选择校验,查看是否配置有错误。
校验后提示窗口没有错误信息,即校验通过。
SoAd模块配置
配置SoAdGeneral,一般配置调度周期,Socket个数和SocketGroup的个数。
配置SoAdBswModules,若数据流需要通过SoAd模块,则需要配置。本例中只有UdpNm。所以只需要配置UdpNm。
配置SoAdConfig。
配置SoAdSocketGroup。
配置SoAdSocketConnectionGroup。UdpNm采用多播收发,需要配置2个Socket。分别用于发送和接收。
配置SoAdRoute,即报文发送。
配置SoAdSocketRoute,即报文接收。
校验后提示窗口没有错误信息,即校验通过。
ComM模块配置
ComMGeneral页面一般不需要配置,保持默认即可。
配置ComMConfigSet页面。
首先配置一个ComMUser,默认就创建了一个。
配置ComMChannel,默认就创建了一个。
配置ComMBusType,选择本通道的总线类型。还需要配置ComMMainFunctionPeriod,表示本通道的调度周期。
配置ComMNmVariant,表示本通道的类型。FULL表示通道由网络管理来管理。LIGHT表示本通道没有网络管理。
每个Channel需要关联一个User,对于大多数常见,一个User就等于一个Channel。
ComM配置完成,校验。
EthSM模块配置
配置EthSMGeneral。这里只需要配置一个调度周期,尽可能快。
配置EthSMNetwork。
校验后提示窗口没有错误信息,即校验通过。
Nm模块配置
配置NmChannelConfig,需要配置2个地方。第一个是NmChannelConfig,关联到ComM的channel,第二个需要创建NmStandardBusNmConfig,选择网络管理类型。
配置NmGlobalConfig,需要配置NmGlobalConstants和NmGlobalFeatures。配置的重点在NmGlobalFeatures。这里主要是全局选择网络管理的功能。部分功能还需要在OsekNm中配置。
Nm配置完成,校验。
UdpNm模块配置
配置UdpNmGlobalConfig。
配置UdpNmChannelConfig,这里主要配置时间参数。
配置报文的收发。
校验后提示窗口没有错误信息,即校验通过。
源码集成
项目交付给用户的工程结构如下:
BSW_Cfg目录,这个目录用来存放配置工具生成的配置文件,网络管理有关的配置文件放在NM和UdpNm文件夹中。
src目录,存放模块相关的源代码。可以看到Source目录下各个文件夹下是各个模块的源代码。
网络管理源代码集成步骤如下:
将5.2章节中ORIENTAIS Configurator生成的配置文件复制到Config文件夹下的各个模块的对应文件夹中【例如:Config\inc\NM】。
将项目提供的协议栈源代码文件复制到Source文件夹下的对应模块的文件夹中【例如:SourceS\NM】。
将所需的头文件包含进工程设置中,如下步骤:
添加头文件路径。
添加所需的头文件。
添加调度文件,点击应用保存。
编译工程。
调度集成
调度集成步骤如下:
协议栈调度集成。
编译链接代码,将生成的elf文件烧写进芯片。
UdpNm有关的代码,在下方的main.c文件中给出重点标注。
注意 : 本示例中,UdpNm网络管理初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。
#include “Timer.h”
#include “Led.h”
#include “Mcal.h”
#include “UserTimer.h”
#include “EthIf.h”
#include “TcpIp.h”
#include “SoAd.h”
#include “EthSM.h”
UdpNm协议栈相关模块头文件
#include “Nm.h”
#include “UdpNm.h”
#include “ComM.h”
#include “ComM_Internal.h”
Com_IpduGroupVector g_ComIpduGroupVector;
int main(void)
{
McalUser_Init();
初始化EthIf、EthSM、TcpIp、SoAd、Nm、UdpNm、ComM模块
Led_Init();
EthIf_Init(&EthIf_ConfigData);
EthSM_Init();
TcpIp_Init(&TcpIp_Config);
SoAd_Init(&SoAd_Config);
Nm_Init(&Nm_Config);
打开通信
UdpNm_Init(&UdpNm_Config);
ComM_Init(&ComM_Config);
ComM_Channel[ComMChannel_Eth].CommunicationAllowed = TRUE;
ComM_RequestComMode(ComMUser_Eth, COMM_FULL_COMMUNICATION);
StartOS(OSDEFAULTAPPMODE);
while (1);
}
/* OsTask_c0_1ms: Core0(CPU0), Type = BASIC, Priority = 8*/
TASK(OsTask_c0_1ms)
{
EthSM模块周期处理函数
/* please insert your code here … */
EthSM_MainFunction();
if (E_OK != TerminateTask())
{
while (1)
{
/* dead loop */
}
}
}
/* OsTask_c0_5ms: Core0(CPU0), Type = BASIC, Priority = 6*/
TASK(OsTask_c0_5ms)
{
/* please insert your code here … */
ComM、EthIf、UdpNm模块周期处理函数
ComM_MainFunction(ComMUser_Eth);
EthIf_MainFunctionState();
UdpNm_MainFunction(0);
if (E_OK != TerminateTask())
{
while (1)
{
/* dead loop */
}
}
}
/* OsTask_c0_5ms: Core0(CPU0), Type = BASIC, Priority = 6*/
TASK(OsTask_c0_20ms)
SoAd、TcpIp模块周期处理函数
{
/* please insert your code here … */
SoAd_MainFunction();
TcpIp_MainFunction();
if (E_OK != TerminateTask())
{
while (1)
{
/* dead loop */
}
}
}
验证结果
根据集成目标,使用Wireshark工具查看报文发送方式是否正确。前10个报文发送间隔50ms,后面报文的间隔是500ms,符合集成目标。