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 Studio软件后,双击软件图标打开软件。
图 新建工程-1
菜单栏File🡪New🡪Project,新建工程。
图 新建工程-2
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。
图 新建工程-3
在弹出的窗口中输入工程名,选择Finish。
图 新建工程-4
在弹出的窗口中选择Yes。
图 新建工程-5
选择[Bsw_Builder],右键单击,选择New ECU Configuration。
图 新建工程-6
在弹出的窗口中输入ECU名,然后选择Next。
图 新建工程-7
在弹出的窗口中勾选需添加的模块,点击Finish。
图 新建工程-8
配置文件生成¶
模块配置¶
模块的具体配置,取决于具体的项目需求。UdpNm各模块配置项的详细介绍,参见《参考手册_UdpNm.pdf》。
配置代码生成¶
功能集成¶
代码集成¶
协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Studio配置生成代码。
用户须将协议栈源码和章节(配置代码生成)生成的源代码添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节(源代码集成)。
Note
协议栈集成之前,用户须确保已经有基础工程,且本协议栈相关的其他协议栈能正常工作。
集成注意事项¶
对于集成过程中,协议栈特殊要求和用户经常出现的问题,归类总结形成下表。用户需逐一排查表中的约束项,以避免集成问题出现。
表 UDPNM集成约束清单
编号 |
类别 |
约束限制 |
---|---|---|
1 |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
2 |
头文件 |
|
3 |
初始化 |
UdpNm诊断栈的初始化顺序为:EthIf_Init、TcpIp_Init、SoAd_Init、 EthSM_Init、UdpNm_Init、 Nm_Init和ComM_Init。 |
4 |
周期函数 |
UdpNm_MainFunction,EthSM_MainFunction和ComM_MainFunction需要被周期性任务函数调用。 EthSM的调度周期必须大于ComM的调度周期 |
集成示例¶
集成目标¶
本手册会以以下参数作为示例,进行集成演示。
表 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 选择UINT16。
PduLengthTypeEnum 选择UINT16。
图 配置EcucPduCollection
在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。
建议不要使用默认生成的Pdu名字(如:Pdu_0),将Pdu名字改成有意义的名字对后续的配置过程将会有很大帮助。
这里按照发送和接收,可以将Pdu名字改为报文的名字。PduLength:Pdu长度,根据实际使用帧的长度设置。
由于UdpNm的收发报文不需要PduR来路由,因此每个方向(发送/接收)只需要配置一个Pdu。对于需要PduR路由的报文,每个方向需要创建2个Pdu。
图 配置Pdu-1
图 配置Pdu-2
ECUC模块到此配置结束。可以在模块上右键,然后选择校验,查看是否配置有错误。
校验后提示窗口没有错误信息,即校验通过。
SoAd模块配置¶
配置SoAdGeneral,一般配置调度周期,Socket个数和SocketGroup的个数。
图配置SoAdGeneral
配置SoAdBswModules,若数据流需要通过SoAd模块,则需要配置。本例中只有UdpNm。所以只需要配置UdpNm。
图 配置SoAdBswModules
配置SoAdConfig。
配置SoAdSocketGroup。
图 配置SoAdSocketGroup
配置SoAdSocketConnectionGroup。UdpNm采用多播收发,需要配置2个Socket。分别用于发送和接收。
图 配置SoAdSocketConnectionGroup-1
图 配置SoAdSocketConnectionGroup-2
图 配置SoAdSocketConnectionGroup-3
图 配置SoAdSocketConnectionGroup-4
图 SoAdSocketConnectionGroup-5
图 配置SoAdSocketConnectionGroup-6
配置SoAdRoute,即报文发送。
图 配置SoAdRoute-1
图 配置SoAdRoute-2
配置SoAdSocketRoute,即报文接收。
图 配置SoAdSocketRoute-1
图 配置SoAdSocketRoute-2
校验后提示窗口没有错误信息,即校验通过。
ComM模块配置¶
ComMGeneral页面一般不需要配置,保持默认即可。
配置ComMConfigSet页面。
ComM配置完成,校验。
EthSM模块配置¶
Nm模块配置¶
配置NmChannelConfig,需要配置2个地方。第一个是NmChannelConfig,关联到ComM的channel,第二个需要创建NmStandardBusNmConfig,选择网络管理类型。
图 配置NmChannelConfig-1
图 配置NmChannelConfig-2
配置NmGlobalConfig,需要配置NmGlobalConstants和NmGlobalFeatures。配置的重点在NmGlobalFeatures。这里主要是全局选择网络管理的功能。部分功能还需要在OsekNm中配置。
图 配置NmGlobalConfig-1
图 配置NmGlobalConfig-2
Nm配置完成,校验。
UdpNm模块配置¶
源码集成¶
项目交付给用户的工程结构如下:
BSW_Cfg目录,这个目录用来存放配置工具生成的配置文件,网络管理有关的配置文件放在NM和UdpNm文件夹中。
src目录,存放模块相关的源代码。可以看到Source目录下各个文件夹下是各个模块的源代码。
网络管理源代码集成步骤如下:
将章节(模块的配置)中ORIENTAIS Studio生成的配置文件复制到Config文件夹下的各个模块的对应文件夹中【例如:Config\inc\NM】。
将项目提供的协议栈源代码文件复制到Source文件夹下的对应模块的文件夹中【例如:SourceS\NM】。
将所需的头文件包含进工程设置中,如下步骤:
添加头文件路径。
添加所需的头文件。
添加调度文件,点击应用保存。
编译工程。
调度集成¶
调度集成步骤如下:
协议栈调度集成。
编译链接代码,将生成的elf文件烧写进芯片。
UdpNm有关的代码,在下方的main.c文件中给出重点标注。
Note
本示例中,UdpNm网络管理初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。
1#include "Timer.h"
2#include "Led.h"
3#include "Mcal.h"
4#include "UserTimer.h"
5// UdpNm协议栈相关模块头文件
6#include "EthIf.h"
7#include "TcpIp.h"
8#include "SoAd.h"
9#include "EthSM.h"
10#include "Nm.h"
11#include "UdpNm.h"
12#include "ComM.h"
13#include "ComM_Internal.h"
14
15Com_IpduGroupVector g_ComIpduGroupVector;
16
17int main(void)
18{
19 McalUser_Init();
20 Led_Init();
21
22 // 初始化EthIf、EthSM、TcpIp、SoAd、Nm、UdpNm、ComM模块
23 EthIf_Init(&EthIf_ConfigData);
24 EthSM_Init();
25 TcpIp_Init(&TcpIp_Config);
26 SoAd_Init(&SoAd_Config);
27 Nm_Init(&Nm_Config);
28 UdpNm_Init(&UdpNm_Config);
29 ComM_Init(&ComM_Config);
30
31 // 打开通信:初始化网络管理及UdpNm模块
32 ComM_Channel[ComMChannel_Eth].CommunicationAllowed = TRUE;
33 ComM_RequestComMode(ComMUser_Eth, COMM_FULL_COMMUNICATION);
34
35 StartOS(OSDEFAULTAPPMODE);
36
37 while (1);
38}
39
40/* OsTask_c0_1ms: Core0(CPU0), Type = BASIC, Priority = 8*/
41TASK(OsTask_c0_1ms)
42{
43 /* please insert your code here ... */
44 // EthSM模块周期处理函数
45 EthSM_MainFunction();
46
47 if (E_OK != TerminateTask())
48 {
49 while (1)
50 {
51 /* dead loop */
52 }
53 }
54}
55
56/* OsTask_c0_5ms: Core0(CPU0), Type = BASIC, Priority = 6*/
57TASK(OsTask_c0_5ms)
58{
59 /* please insert your code here ... */
60 // ComM、EthIf、UdpNm模块周期处理函数
61 ComM_MainFunction(ComMUser_Eth);
62 EthIf_MainFunctionState();
63 UdpNm_MainFunction(0);
64
65 if (E_OK != TerminateTask())
66 {
67 while (1)
68 {
69 /* dead loop */
70 }
71 }
72}
73
74/* OsTask_c0_20ms: Core0(CPU0), Type = BASIC, Priority = 6*/
75TASK(OsTask_c0_20ms)
76{
77 /* please insert your code here ... */
78 // SoAd、TcpIp模块周期处理函数
79 SoAd_MainFunction();
80 TcpIp_MainFunction();
81
82 if (E_OK != TerminateTask())
83 {
84 while (1)
85 {
86 /* dead loop */
87 }
88 }
89}
验证结果¶
根据集成目标,使用Wireshark工具查看报文发送方式是否正确。前10个报文发送间隔50ms,后面报文的间隔是500ms,符合集成目标。