**概要:**本节内容描述了MMS-EASE Lite栈组件间的关系。
1 配置文件选项(Profile Options)
“MMS-EASE Lite栈组件”是一种基于不同的OSI协议层的实现。它专门为一些硬件资源非常有限的系统而设计,比如某些嵌入式系统,它具有模块化的特点,以便在实际使用时可以仅仅调用特定应用程序所需的协议层。它由几个C代码模块组成,可以方便地在任何嵌入式系统中编译。除了几个简单的函数(隔离在tp4port.c模块中)以外,MMS-EASE Lite全部使用ANSI标准C文件。在OSI七层参考模型的术语中,每个协议层都被描述为其上层提供“服务”。在本应用中,这些“服务”是通过一系列API来提供的。下图显示了OSI协议层与连接它们的api之间的关系。
2 底层组件移植(Lower Layer Component Portation)
2.1 OSI传输层(TP4)移植
对于新的操作系统或硬件平台,需要移植以下函数:
tp4_init_timer
tp4_check_timer
编译选项的配置:
必选编译选项:-DLEAN_T
,功能:编译该版本的TP4 API;
可选编译选项:-DDEBUG_SISCO
,功能:使用“slog”启用日志记录
mvl_init_glb_vars
函数名 | mvl_init_glb_vars |
---|---|
功能 | 在TP4初始化过程(tp4_initialize))中被调用,用于初始化定时器服务 |
函数原型 | ST_VOID tp4_init_timer (ST_VOID); |
参数 | 无 |
返回值 | ST_VOID |
tp4_check_timer
函数名 | mvl_init_glb_vars |
---|---|
功能 | 被tp4_event调用。该函数负责监视定时器,每当计时达到1s就调用函数tp4_timer_tick。由sisco提供的tp4_check_timer示例函数适用于大多数系统,但如果目标系统上有更有效的方法,用户也可自由修改该函数。在事件驱动的系统上,重要的是要确保mvl_comm_serve至少每秒钟调用一次,这样这个函数也会被调用。因此,系统休眠时间不应超过1秒。然而,这个限制仅在正在使用TP4服务时生效 |
函数原型 | ST_VOID tp4_init_timer (ST_VOID); |
参数 | 无 |
返回值 | ST_VOID |
2.2 OSI子网络层移植
用户必须提供子网API。更多信息请参阅附录G。
2.3 TCP/IP(via RFC1006)移植
TCP/IP(via RFC1006)协议栈由以下组件组成:
ACSE
OSI演示
OSI对话
TP0(OSI传输层类0)
TCP/IP(由操作系统通过socket提供)
socket接口实现概述
MMS-EASE Lite的sockets接口包含三个任务,每个任务具有阻塞能力(用于等待来自用户或其他任务的消息),如下所示:
Main任务 (每台主机上仅有一个)
Listen任务 (用于监听socket,每台主机上仅有一个)
Read任务 (用于读取socket,每个连接仅有一个)
Main任务包括所有MMS的编解码进程以及用户接口。在启动时,它会生成Listen任务,该任务会监听是否存在被建立的连接。当检测到已建立的连接时,Listen任务向Main任务发送管道消息,Main任务调用" accept "来接收消息,并生成一个Read任务。
如果要进行向外传输的连接,Main任务会执行一个非阻塞连接调用(可参考tp0_sock.c和p_connect_req),然后生成一个Read任务实例,该实例会等待连接完成。
在两种情况(传入或传出)下,当连接完成后,Read任务会接收连接中的包并将它们传递给Main任务。所有连接中的数据包都是由Main任务发送的。
Main任务含有多层函数调用,因此有时很难跟踪用户级函数是如何在最低层实现的。例如,处理传入事件的函数调用层级如下:
main (\mmslite\mvl\usr\server\server.c) 调用 /*主函数*/
mvl_comm_serve (\mmslite\mvl\src\mvl_serv