新闻中心

EEPW首页>嵌入式系统>设计应用> 一种嵌入式电网监测仪的实现方案

一种嵌入式电网监测仪的实现方案

作者: 时间:2011-07-24 来源:网络 收藏

  2.2 改写操作系统相关的函数

  sys_arch.c中具有与操作系统相关的一些结构和函数,主要可以分为三个部分。

 (1)进程间通信的函数

  函数sys_sem_new( )、sys_sem_free( )、sys_sem_signal( )、sys_arch_sem_wait( )、sys_mbox_new( )、sys_mbox_free( )、sys_mbox_post( )、sys_arch_mbox_fetch( )的功能在μC/OS-II中基本都有,但要注意这里的mbox要用μC/OS-II中的消息队列。但是,μC/OS-II没有对消息队列中的消息进行管理,因此不能直接使用,必须在μC/OS-II的基础上重新。而有一些mbox只可能有一个消息,可以用邮箱。另外函数sys_sem_free( )和sys_mbox_free( )不易实现,可以采用从空闲队列中动态分配和回收的方法。

 (2)sys_arch_timeout( )

  LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为:每个线程都对应一个sys_timeout结构体队列,包括这个线程的timeout时间长度以及超时后应调用的timeout函数,该函数可以做一些释放连接和回收资源的工作。如果一个线程对应的sys_timeout为空(NULL),说明该线程会对连接做永久的等待。

(3)sys_thread_new( )

  LwIP可以是单线程运行,即只有一个tcpip线程(tcpip_thread),负责处理所有的tcp/ucp连接,各种网络程序都通过tcpip线程与网络交互。但LwIP也可以多线程运行,以提高效率,降低编程复杂度。

  创建新线程的函数为:

  void sys_thread_new(void(*thread)(void*arg),void*arg)

  在μC/OS-II中,没有线程(thread)的概念,只有任务(task)。它已经提供了创建新任务的系统API调用OSTask-Create。因此,只要把OSTaskCreate封装一下,就可以实现sys_thread_new。需要注意的是:LwIP中的thread并没有μC/OS-II中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。

  2.3 lib_arch中库函数的实现

  在ARM SDT 2.开发环境下,gcc编译器的lib库里已经有了LwIP协议栈中系统CPU或编辑器有关的外部函数:strlen( )、strcmp( )、bcopy( )、bzero( ),只需要编写htons( )、ntohs( )、htonl( )、ntohl( )即可。

  3 网络设备驱动程序

  基于RTL8019AS网络芯片驱动的编写,主要是进行相关寄存器的设置。LwIP协议栈中,网络接口层负责接收上层的IP数据报,装配成不完整的物理帧后复制到控制器片内RAM中,并通过控制器发送到传输介质上,发送时由控制器装配成完整的物理帧;或者将控制器中缓存的接收到的物理帧先复制到系统内存,然后抽出IP数据报,交给IP层进行处理。修改ethernetif.c文件,实现底层的输入输出。

  RTL8019AS是一种全双工即插即用的以太网控制器,它在一块芯片上集成了RTL8019内核和一个16KB的SDRAM存储器。它兼容RTL8019控制软件和NE2000 8bit或16bit的传输,支持UTP,AUI,BNC和PNP自动检测模式,支持外接闪烁存储器读写操作,支持I/O口地址的完全解码,具有LED指示功能。

  3.1 网卡初始化函数

  void ethernetif_init(struct netif*netif)用于初始化网卡,在程序启动之初被调用。这里主要完成网卡的复位操作以及通过对各个寄存器赋值,确定网卡的工作方式等。

  3.2 网卡发送函数

  函数err_t ethernetif_output(struct netif*netif,struct pbuf*p,struct ip_addr*ipaddr)为IP层传来的IP报文加上以太网包头并通过网络接口发送。RTL8019AS使用远端DMA将封装好的以太网包写到RTL8019AS内部的双口RAM的发送缓冲环中,然后启动本地DMA,网卡自动发送缓冲环里的数据到以太网。

  发送过程有三个步骤:数据包的封装;通过远程DMA将数据包送到数据发送缓冲区;通过RTL8019的本地DMA将数据送入FIFO进行发送。

  3.3 网卡接收函数

  函数void ethernetif_input(struct netif*netif)从网络接口接收以太网数据包并把其中的IP报文向IP层发送。网卡对于以太网上目的地为该网卡的包会自动启动本地DMA接收数据,并存放在RTL8019AS芯片内部RAM的接收缓冲环中,然后以中断的方式通知CPU。此时该函数使用远端DMA接收数据到系统的RAM当中。

  3.4 中断处理函数

  void ethernetif_isr(void)处理网卡相关的中断,RTL8019AS接收到数据后,就通过中断入口把接收数据的工作交给函数ethernetif_input()来处理。

  在实时多任务环境中,一般采用中断方式处理RTL8019AS的收发。图1是一个典型中断处理程序(ISR)的流程。当主程序响应RTL8019AS的中断时,ISR的入口将根据读取的中断状态寄存器(ISR)的值来确定程序的走向。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭