微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 一种嵌入式电网监测仪的实现方案

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

时间:07-24 来源:互联网 点击:

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

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( )

时钟中断处理函数。其主要

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top