基于物联网的嵌入式以太网终端平台的设计方案

来源:电子发烧友 作者:—— 时间:2012-11-22 11:03

  物联网是在互联网的基础上,将用户与物品或者物品与物品用互联网进行连接,并通过互联网进行信息交换和通信的一种概念。物联网主要通过信息采集设备以及能够将这些信息采集设备接入互联网的终端平台来实现。近年来,嵌入式系统以其功能完善,设计方案灵活,功耗可控制等特点,已广泛应用于生活、商业、医疗以及工业等各个领域。比起通用计算机来,嵌入式系统具有针对性更强、体积更小,成本更低等优点,是物联网领域应用设计的首选方案。对于一些数据量不大,传输速率要求不高的应用,要考虑用较低的成本实现最可靠的物联网服务。

  1 平台硬件设计

  1.1 平台结构及原理

  该平台采用ATMEL公司AT91SAM7X512处理器作为主控芯片,该处理器内部集成了以太网控制器、512kbytes FALSH以及128kbytes SRAM。只需外接一片以太网物理层(PHY)收发芯片DM9161和一个网络变压器HR601680,即可构成以太网终端硬件平台。 AT91SAM7X512采用3.3 V和1.8 V双工作电压,使用频率为18.432 MHZ的晶振作为时钟电路的振荡源,调试电路采用标准的20针JTAG仿真调试接口。该方案成本低,功耗小,并且所用芯片集成度很高因而保证了系统的稳定性。

  AT91SAM7X512的以太网控制模块实现了一个与IEEE802.3标准兼容的以太网MAC,支持全双工模式,可通过DMA方式进行数据收发。当物理层芯片DM9161接收到来自以太网的上位机数据时,ARM通过MII接口(媒体独立接口)读取数据,并在内部通过DMA方式将数据读入 SRAM中交给TCP/IP协议栈进行处理。同时,当RFID射频读卡器或者传感模块有数据需要传输时,平台也能沿着相同的通道将数据传输至上位机。系统整体结构如图1所示:

  a.JPG

  1.2 AT91SAM7X512和DM9161的接口电路设计

  AT91SAM7X512的以太网控制器和物理层收发芯片 DM9161之间有MII(Media Independent Interface)和RMII(Reduced Media Independent Interface)两种接口。这两种接口都能够工作在10 Mb/s和100 Mb/s共两种速率下,在本设计中采用MII接口。MII数据接口总共需要16个信号,包括 TX_ER,TXD《3:0》,TX_EN,TX_CLK,COL,RXD《3:0》,RX_EX,RX_CLK,CRS,RX_DV 等,在时钟速率25 MHz的情况下以4-bit并行方式发送和接收数据。以太网控制器依靠MDIO接口与物理层芯片进行通信,用于自动协商期间确保以太网控制器和物理层芯片被配置为相同的速度和双工模式。AT91SAM7X512和DM9161的接口电路如图2所示。

  b.JPG

  当系统上电后,由AT91SAM7X512给DM9161提供复位信号及引脚初始化电平,完成DM9161的上电初始化工作。当初始化完成后,系统会通过MII接口读取DM9161内部状态寄存器的值来完成对网络连接模式和连接状态的检测。

  2 平台软件的实现

  2.1 TCP/IP协议栈的移植

  LwIP是瑞典计算机科学研究院(SICS)设计的一个开源的轻量级TCP/IP协议栈。它的目的是减少内存使用率和代码大小,使LwIP能够适用于资源紧张的嵌入式系统。利用μC/OS-Ⅱ提供的信号量和消息传递机制等系统服务可以实现对LwIP的移植。

  2.1.1 信号量操作函数

  LwIP 使用信号量进行通信,这个信号量可以是计数信号量,也可以是二值信号量,所以在sys_arch中需要实现与信号量操作相关的信号量结构体struct sys_sem_t、信号量建立函数sys_sem_new()、信号量释放函数sys_sem_free()、信号量发出函数 sys_sem_signal()和信号量等待函数sys_arch_sem_wait()。由于在μC/OS-Ⅱ中已经实现了与信号量操作有关的各种函数,而且功能和上述几个LwIP中所需要实现的函数的功能是完全一致的,所以只要调用μC/OS-Ⅱ中的信号量操作函数来重新包装成LwIP中的信号量操作函数即可。

  2.1.2 邮箱操作函数

  LwIP使用邮箱来进行消息传递,用户可以用一个队列来将其实现,需要注意的一点是,投递进邮箱中的消息只能是一个指针。因此要根据以上要求来实现消息队列结构sys_mbox_t,以及相应的操作函数:sys_mbox_new()、 sys_mbox_free()、sys_mbox_post()和sys_arch_mbox _fetch()。μC/OS-Ⅱ很好地实现了消息队列结构及其操作,为消息队列提供了丰富的管理函数,但μC/OS-Ⅱ没有对消息队列中的消息进行管理,因而不能直接使用,必须在μC/OS-Ⅱ的基础上重新实现。具体实现时,可创建多个邮箱,并使用单向链表将这些邮箱链接在一起,每个邮箱可接收消息的数量由消息数组的大小来决定。对消息队列本身的管理用μC/OS-Ⅱ中的队列操作函数来完成,然后通过对链表的操作来实现对消息的创建、使用、删除和回收,两部分综合起来形成了LwIP的邮箱功能。

  2.1.3 创建新线程函数

  在μC/OS-Ⅱ中只有任务的概念,建立一个新的线程实际上就是建立一个新的任务。因此只需要把OSTaskCreate()封装一下,就可以实现sys_thread_new()。需要注意的是当前μC/OS-Ⅱ 不支持时间片轮番调度法,不允许两个或两个以上的任务有同样的优先级,所以用户要事先为LwIP中创建的线程分配好优先级。通过对LwIP中的宏 TCPIP_THREAD_PRIO进行包装,来避免TCPIP线程优先级与其他线程相同。

  2.1.4 定时器函数

  LwIP中每个线程都有一个timeouts链表,这个链表在建立之后其首地址必须固定。因此用于保存链表首地址的sys_timeouts结构必须与线程一一对应,而且其地址不能改变,以便能够随时得到链表的首地址。可用一个静态的sys_timeouts结构数组来存放各个线程的链表,以线程的优先级号来作为数组索引号,这样每一个线程就能对应一个sys-timeouts结构体了,并且在系统运行期间对应的结构体数组成员的地址会一直固定不变。移植时通过实现 stmctsys_timeouts*sys_arch_timeouts(void)函数,来返回目前正处于运行态的线程所对应的timeouts队列指针。

资讯排行榜

  • 每日排行
  • 每周排行
  • 每月排行

华强资讯微信号

关注方法:
· 使用微信扫一扫二维码
· 搜索微信号:华强微电子