一种嵌入式电网监测仪的实现方案
任务是负责处理时钟中断,调用系统实现OSTimeTick( )函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。
OSTickISR( )是标准的中断服务程序,函数的入口写入ISR的中断向量表。其实现的过程是:向S3C44BOX 的0x18写入任意的数(0x18在ARM中是IRQ的中断入口地址),读取S3C44BOX的状态寄存器清除中断,保护CPU寄存器入栈,调用OSIntEnter( )对中断嵌套标志加1。调用中断服务程序OSTimeTick( ),调用OSIntExit( )判断是否需要任务切换,如果需要则调用OSIntCtxSW( )来进行任务切换。若没有调用任务切换函数OSCtxsw( ),则说明CPU寄存器入栈的工作已经在进入中断时完成。
2 LwIP协议栈的移植
lwip是瑞典计算机科学院的一个开源的TCP/IP协议栈实现。lwIP是TCP/IP协议栈的一个实现。lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,一般它只需要几百字节的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
下面介绍在μC/OS-II操作平台上移植LwIP的主要步骤。
2.1 与CPU或编译器相关的include文件
/src/arch/include/arch目录下cc.h、cpu.h、perf.h中,有一些与CPU或编译器相关的定义,如数据长度、字的高低位顺序等,这些参数应该与实现μC/OS-II时定义的数据长度等参数是一致的。
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和PN
- SN2005学习系统 数字语音室解决方案(05-19)
- 以可编程DSP架构应对TD-SCDMA以及TD-LTE带来的设计挑战 (02-14)
- ARM-μCLinux嵌入式系统启动引导的实现(07-26)
- 多核处理器架构及调试方案(03-28)
- 基于DSP的电源解决方案(06-13)
- 间歇性Bug最佳解决方案(09-24)