技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

LINUX网络嵌入式设备

来源:技术员联盟┆发布时间:2019-02-26 00:22┆点击:

  这不是什么新鲜东西,无线路由器很早前就开始使用了,不过最近才慢慢理解其原理。现在网络嵌入式设备的功能越来越强大了,各芯片厂商的解决方法支持着这种复杂性。最近公司实习,做一个家庭网关的项目。下面的内容应该不算泄密吧,写得随意一点。

  1.一个网络芯片架构

LINUX网络嵌入式设备 三联

  大家应该看得出来,这是一个DSL芯片。其网络部分由一个switch core构成核心,对外有3个交换口(粉红色的):左侧为以太网MAC,可外接以太网芯片MAC或PHY,称为LAN端;右侧为DSL的TPS子层,按照DSL标准传输ATM/PTM数据,成为WAN端;上面的是一个PDMA片级总线,与片上系统SoC通信。

  另外还有几个额外的交换口,主要是提供额外功能的:一个QDMA用于扩展core外Mem;LTR和WTR是两个转换引擎,当LAN或WAN端的数据包需要一些特殊处理时(如VLAN、PPPOE头等),会被分别交换到这两个口进行转换后,再发回Queue中。再另外,LAN、WAN端各有一个classifier,是预分类器,在数据包进入switch core前,先进行一个粗略的划分,决定发往哪个端口。

  以上的这些功能都市switch core独立完成的,SoC系统只需对其进行简单的配置、控制即可。所以SoC的新能并不需要太高(CPU大概是130MHz的)。注意,该switch core和一般以太网switch的区别,首先其端口类型就不同,所提供的功能也跟为复杂。

  这里给出一个简单的以太网switch芯片的架构,如下图所示,其核心就是一个register集,对它们进行配置(内部EEPROM、或外部MDIO总线),可以实现port-VLAN、二层filter等功能。其结构相对简单,因为其所有端口都是以太网口。

LINUX网络嵌入式设备

  用该芯片接在上述DSL芯片的LAN端,构成网络系统如下图所示:

LINUX网络嵌入式设备

  以太网switch可以自主实现port-VLAN功能,并通过一个trunk口与switch core相连。而switch core有很好的vlan_tag classifier功能。另外WAN端实现了8个硬件通道PVCs,且switch core也能对它进行很好的classifier。综上,就可以实现所谓的port-mapping功能,只要一跟DSL接入线,就可在家庭里实现IPTV、Internet、可视电话等业务的分离。

  注意,所有这些功能都是switch core自动完成的,网络数据包不需要进入SoC的协议栈,这和后面讲的一般的路由器是不同的。

  2.嵌入式片上系统

  2.1与外界的交互方式

  这里的SoC系统主要功能有:与外界用户的交互,解析用户指令,配置系统。

  解析指令对软件系统来说很简单,配置系统,前面也说了,主要是读写一些register,也很简单。关键就在于与外界用户交互。

  很容易想到的一种方式是网络,SoC也连在switch core上,有自己的IP、MAC。当然它和switch core是片上bus相连的,通信时并不需要MAC,这里只是把自己伪装成一个通用的以太网设备,可以被switch core和外界PC识别。

  要通信,当然就需要协议栈了,不过,这里的SoC系统不需要处理额外(正常通信)的数据,所以协议栈也选择简单的LWIP,如之前的博文所述。最常用的网络通信方式就http了,另外还有telent等。

  呵呵,连接192.168.1.1实际就是去连接其内部的SoC,一般的交换机、路由器都是这样的,而不是什么端口。当我还是一个超级菜鸟时,这个问题困扰了好久,纠结。

  另外,嵌入式系统中,还有一个最常用的交互方式是串口UART。UART是一个非常简单的I/O设备,它通过直接读写管脚的电平信号(串行的)来实现输入输出,没有任何额外的中断、控制等机制。虽然简单,不能用以实现复杂、可靠的功能,但用作嵌入式系统的调试方法却非常有效。

  UART就像是嵌入式设备的键盘/显示器。它是一种非常简单的硬件资源,在它之上可以构建通用的I/O设备tty,在tty之上,就可以实现各种应用,如shell等。

LINUX网络嵌入式设备

  硬件资源UART、虚拟层设备tty都是系统的资源,在Uc/OS中,一般作为全局量,在其上的应用则通过task来完成。如XSHELL_TASK中,就是通过一个while(1)循环,不停地通过tty_get_line()读取命令行。注意,该函数已经不是裸的硬件操作了,而是加上了一个上层操作,即识别/r/n来作为结束符,也是通过一个while(1)循环来作的。读到电平为空,则忽略,因为UART太简单了,没有中断、缓存机制等(没有详细区考究,只是粗略地浏览了一下代码,好像是这样的吧!)。

  最后,外界用户读写电平,当然不同用示波器了。呵呵,PC上装个串口驱动,那么PC的键盘/显示器就为嵌入式板子所用啦。

  2.2bootloader

  这就像一个心结,你一天不理解它,就一天不能安心地开发嵌入式系统,尽管你可以把软件写得很出色。