通过tcp/ip协议栈来实现数据通信,是目前大多数通信设备所必备的。在以太网上实现tcp/ip更是一种价廉物美的选择。本文描述的正是这种通信设备一种实现方法。
通信控制设备大多是嵌入式系统,求cpu功耗低、接口种类丰富。powerpc 860t芯片是摩托罗拉公司mpc860系列通信专用嵌入式cpu的产品,主要特点是增加了1个10/100m自适应以太网口,工作频率可达80mhz,广泛地用于中、高档通信设备。其内部结构框图如图1所示。
从图1中可以看出,860t芯片主要由微处理器内核(embedded poweprpc core)、系统接口单元siu(system interface unit)、通信处理器单元cpm(communication processor module)和快速以太网模块fem(fast ethernet module)等组成。由于860t中集成了许多外围接口的控制器,同flash、sram、sdram等各种存储器可实现无缝隙连接。外部通信接口一般只需添加线路接口单元。本文实现的系统硬件框图如图2所示。flash采用的是am29lv017,sram为sodimm sdram条。
cpu部分的4个scc均可配置为10m以太网控制器,fem为一个10/100m以太网自适应控制器。通过这些以太网控制器,只需简单的线路接口单元就可构成10m以太网口和10/100m自适应网口。该以太网口符合ieee802.3规范。实际使用中,860t设备多少个网口,应根据芯片的运行主频和接口要求来统筹考虑。在设计时,相关的性能计算可使用摩托罗拉公司推供的软件进行估算。我们在50 mhz mpc860t芯片上,实现了1个10m网口(采用scc1实现,如图3所示)和1个10/100m自适应网口(如图4所示)。
mpc860t中i/o口引脚几乎都有多种功能,通过对有关的寄存器进行设置或将某些引脚设置成指定电位,使得有关i/o口的功能为设计指定的功能。在设计时,可能会发现某些多功能引脚要么只能处于a功能,要么处于b功能,无法使得a、b功能同时满足。由于mpc860t的引脚多、各引脚的功能也多,为了能够尽快地确定各引脚的功能,可利用摩托罗拉公司提供的引脚功能安排工具,检查引脚功能上的冲突。
mpc860t是遵照powerpc结构体系的嵌入式芯片系列,因此可实现多任务操作,并支持多种内存映射方式,完全能够运行实时多任务操作系统,以便满足通信控制设备所要求的实时性。
wind river公司的vxworks实时多任务嵌入式操作系统是大多数实时嵌入式系统的首选,具有其它嵌入式操作系统无法比拟的内核代码少、裁剪性强、实时性强、软件模块多等优点。本文的多网口通信实现是在vxworks集成环境tornado 2.0下开发的。关于vxworks实时嵌入式操作系统可参见wind river公司的相关资料。
vxworks支持tcp/ip协议栈,用户程序可通过bsd套接字方式访问网络,工作方式和windows下的bsd套接字方式基本一样。
vxworks的tcp/ip协议栈与网络设备驱动的接口有两种。一种是标准的bsd4驱动程序。它将驱动程序和协议紧密关联在一起,不利于多协议的支持(后期bsd进行了改进,可实现多协议的支持)。vxworks不推荐使用bsd4驱动程序。另一种标准是vxworks专有的end(enhanced network driver)驱动程序。它通过一个称为mux的薄层,将驱动程序和协议栈隔离开,达到驱动程序独立于具体协议的目的,从而实现多协议的支持。end驱动程序技术多播和轮询通信方式。因此,我们采用end驱动程序方式来实现网络设备驱动程序,扩展通信功能。
vxworks的驱动程序既可以在启动时加载,也可以在系统启动后加载。不过网络驱动程序,最好是在启动时加载(本文采用此方式)。vxworks启动时,发起的tusrroot任务初始化网络任务的job队列,同时发起tnettask任务来处理网络任务中的job队列,调用muxdevload()装载用户网络设备驱动程序。之后,通过muxdevstart()启动该网络设备驱动程序。
用户驱动程序的中断例程,通过sysintconnect()挂接在系统的中断结构上。一般在muxdevstart()中完成该工作。
驱动程序的中断例程,一般尽可能少地做一些将接收的数据包搬移工作,以减少中断关闭的时间。用户的实际中断处理服务例程放在netjob任务中完成(中断例程通过netjobadd()函数将实际中断处理服务例程加到netjob任务的队列中)。
用户在编写好驱动程序后,应根据要求修改板级支持软件包(bsp)中confignet.h的内容,以例系统正确加载。主要修改endtb1表。
修改config.h中的相关内容:在默认情况下,系统仅仅支持1个网络接口。如果在config.h包含了#define fads_860t,那么默认启动能够工作的是100m的网络接口(motfec0);如果在config.h中没有包含#define fads_860t,那么默认启动能够工作的是10m的网络接口(cpm0)。
操作系统根据启动参数来对网络接口进行配置,简要流程如下:
①在usrroot()中调用usrnetworkinit()(在prjconfig.c中)。在usrnetworkinit()中调用:
*usrnetprotoinit()初始化网络协议堆栈(包括bsd socket support、host table、bsd4.4ipv4、bsd4.4udpv4、bsd4.4tcpv4、bsd4.4icmpv4、bsd4.4igmpv4以及调试和show facility部分等等)。
*muxlibinit()初始化连接协议与end driver的mux层。
*usrendlibinit()(在comps/src/net/usrendlib.c中)支持使用mux/end接口的网络设备。
*usrnetworkboot()使用启动参数来初始化一个网络设备。
*usrnetappinit()初始化网络应用协议和一些server,比如rpc、rlogin、telnet server以及ftp server等等。
②在usrendibinit()中,遍历confignet.h内的enddevtb1[]数组,调用muxdevload(…)装载end驱动程序,并调用muxdevstart(…)将它启动。
③在usrnetworkboot()中调用:
*usrnetboot()从命令参数行(bootline)提取网络接口的ip地址、目标名字(target name)以及单元号(unit number)。
*usrnetmaskget()获取接口的网络掩码。
*usrnetworkdevstart()加入并配置一个网络设备(cpm或者motfec)。
④在usrnetworkdevstart()中,调用usrnetenddevstart(…)、usrnetbsddevstart(…)以及usrnetloopbackstart()。以上3个函数中,使用命令参数行启动了1个物理网络接口以及1个本地回路接口。
从以上流程来看,当定义了fads_860t时,默认根据命令参数行(在config.h中,有一个初始的默认值default_boot_line)启动并配置了一个motfec网络接口。
支持双网口时的修改:
①在config.h中加入#define include_cpm这一行。
②在confignet.h中,于#ifndef ip_max_units行之前加入1行:#undef ip_max_units。在默认情况下,由于仅仅支持motfec接口,ip_max_units的值为1。因此,需要重新定义ip_max_units,使其等于我们加入的mux有关的网络接口的个数。
③在usrnetenddevstart(…)中的#endif /*
cpu = =simnt*/行之后加入以下几行代码;
#ifdef fads_860t
#ifdef include_cpm
usrcpmenddevstart(“cpm”,1,ininfo[0].target_name,inpnfo[0].ip_address,ininfo[0].netmask);
routeadd(ipinfo[0].network,ipinfo[0].gateway);
#endif
#endif/*fads_860t*/
以下是有关定义以及usrcpmenddevstart(…)的源代码:
struct cpmininfo{
char *target_name; /*目标的名称*/
char *ip_address; /*目标的ip地址*/
char *network; /*网络*/
int netmask; /*网络的掩码*/
char *gateway; /*网关*/
};
struct cpmininfo ipinfo[]= {
{null,null,null,0,null},
{null,null,null,0,null},
{null,null,null,0,null}
};
void usrcpmenddevstart ();
void usrcpmenddevstart (
char* pdevname, /*设备的名称*/
int unitnum, /*单元号*/
char* ptgtname, /*目标机名称*/
char* paddrstring, /*网络地址*/
int netmask /*网络掩码*/
)
{
end_obj* pend;
m2_interfacetbl endm2tb1;
if(pdevname= =null)
return;
#ifdef include_end
pend=endfindbyname(pdevname,unitnum);
if(pend= =null){
printf(could not find %s%d,pdevname,unitnum);
returm;
}
if(muxioctl(pend,eiocgmib2,(caddr_t)endm2tbl)= =error)}
printf(cannot perform eiocmib2 ioctl.);
return;
}
if(ipattach(unitnum,pdevname)!=ok){
printf(failed to attach to device %s,pdevname);
return;
}
if(usrnetifconfig(pdevname,unitnum,paddrstring,ptgtname,netmask)!=ok){
printf(failed to configure %s%d for ip.,pdevname,unitnum);
return;
}
printf(attached tcp/ip interface to %s unit %d,
pdevname,unitnum);
#endif /*include_end*/
return;
}
以上我们加入的设备名字由设备名和unit number组成。在加入第2个网络接口之前,第1个网络接口motfec0已经可以正常工作了。由于所有的enddriver都是通过遍历在confignet.h中的enddevtbl[]数组而启动的,因此第2个网络接口的unit number是1。依次数推,第3个网络接口的unit number是2…。我们加入的第2个网络接口的名字为cpml。
在支持双网口时,不同的网口应处在不同的网段上,每一个网口可支持多个网络地址。
目前世界上最好的无线蓝牙音箱,Devialet Phantom评测
ICinsights:增长19%!三星再次成为全球最大半导体供应商
IPOSIM的引擎——PLECS
物联网时代 嵌入式系统迎来发展的新机遇
小型数据模块在工业互联网中的应用特点
基于POWERPC860T芯片和VxWorks操作系统实现以太网通信系统设计
非隔离LED恒流控制技术的LED日光灯驱动方案设计
汽车线束三维布局设计的基本规范
上海交通大学---固纬电子 第二届电力电子技术培训交流会-圆满成功
SMT生产线它对贴片机都有哪几个方面的要求
智融科技SW2505H、SW3566H、SW2325通过UFCS融合快充功能认证
火山引擎视频云科技原力峰会于2月25日顺利召开
嵌入式工控机的主要特性有哪些
iphone13pro max电池多少毫安
华为麒麟960的三款旗舰机:荣耀9、荣耀v9和华为P10plus哪款更有吸引力?荣耀9、荣耀v9和华为P10plus区别对比评测
MINIWARE迷你数字电源MDP-P906
号称最强的手机VR产品,三星Gear VR拆解
5G+机器人,为工业4.0打下坚实基础
油烟在线监测系统解决方案
digilent数字式电位计介绍