新闻中心

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

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

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

成功运用了S3C44BOX微处理器和RTL8019AS以太网控制器组成的硬件平台,并结合了实时操作系统μC/OS-II和 LwIP协议栈。在实时操作系统和LwIP协议栈的驱动下,由微处理器数据采集、数据处理和采集模块的控制功能。具有极高的性能价格比,可以直接取代常规电力变送器、测量指示仪表、电能计量仪表以及相关的辅助单元,具有安装方便、接线简单、维护方便,工程量小、现场可编程设置输入参数的特点。μC/OS-II是一种适用于嵌入式系统的源码开放的占先式实时多任务操作系统。本文讨论了基于μC/OS-II嵌入式系统的网络通信,包括μC/OS-II实时操作系统、LwIP协议栈的移植和网络设备驱动程序的建立以及系统任务的调度。

本文引用地址:http://www.eepw.com.cn/article/150441.htm

  1 μC/OS-II的移植

  μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU 时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。μC/OS-II可以管理多达64个任务。由于它的作者占用和保留了8个任务,所以留给用户应用程序最多可有56个任务。赋予各个任务的优先级必须是不相同的。这意味着μC/OS-II不支持时间片轮转调度法(round-robin scheduli ng)。

  μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域, 如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。它适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。

  移植μC/OS-II时,系统可以运行于用户模式(User Mode),也可以运行于管理模式(Supervision Mode),大部分的移植都运行于管理模式。如果需要,也可以设置为在用户模式运行,但进行处理模式的切换时必须由异常处理完成,这样操作要复杂一些。

  下面介绍在本系统中进行μC/OS-II移植时需要解决的主要问题。

  (1)OS_CPU.H修改

  此修改主要是改变与处理器、编译器有关的数据类型和宏定义,S3C44BOX为32位微处理器,使用armcc编译器。Char类型长度8位,Short类型长度16位,Int和Long类型长度32位。ARM 寄存器都是32 位的,所以将堆栈数据类型OS_STK 声明为32位。所有的堆栈都必须使用OS_STK 声明。

  将开关中断的宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL定义为OS_CPU_ASM.S中的函数ARMDisableINT和ARMEnableINT,用于屏蔽中断和开中断。

  (2)OSTaskStkInit( )

  OSTaskCreate( )和OSTaskCreateExt( )通过调用OSTask-StkInit( )来初始化任务的堆栈结构,因此,堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。

  μC/OS-II为每个任务建立堆栈,用于保存处理器的寄存器。其结构体定义OS_STK[17],任务堆栈空间由高至低依次保存着处理器工作模式(SVC模式)的pc、lr、r12、r11、r10……r1、r0、CPSR、SPSR。

  μC/OS-II在OS_CPU_C.C中由任务堆栈初始化函数OSTaskStkInit,需要将任务栈内的CPSR 和SPSR 设为SVC 模式。

  (3)OSCtxsw( )

  用于任务级的上下文切换。当任务因为被阻塞而主动请求CPU调度时OSCtxsw( )被执行,此时的任务切换在非异常模式下进行。它的工作是先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行。这样就完成了一次任务切换。

  (4)OSIntCtxSW( )

  用于中断级的任务切换。若在时钟中断ISR中发现有高优先级任务等待的时钟信号到来,则在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行,从而能够尽快地使高优先级的任务得到响应,保证系统的实时性能。

  OSIntCtxSW( )完成的工作为:向S3C44BOX的INTCON寄存器写入值,将IRQ栈内保存的中断CPU寄存器的值写入被中断的任务栈,将就绪的高优先级的任务栈内容写入对应的CPU 寄存器。

  (5)OSTickISR( )

  时钟中断处理函数。其主要任务是负责处理时钟中断,调用系统实现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时定义的数据长度等参数是一致的。

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

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭