微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于μC/OS-II+NiosII的电力谐波分析仪的研究

基于μC/OS-II+NiosII的电力谐波分析仪的研究

时间:06-05 来源:互联网 点击:

2 μC/OS-II内核向NiosII的移植操作

所谓移植,就是使一个实时内核在某个微处理器或微控制器上运行,为了方便移植,μC/OS-II大部分的代码用C语言写,但仍需要用汇编语言写一些与处理器相关的代码,这是因为μC/OS-II在读写处理器寄存器时只能通过汇编语言来实现。

μC/OS-II可以看作是一个多任务的调度器,在这个任务调度器上添加了和多任务操作系统相关的一些系统服务。μC/OS-II的设计分为与处理器类型无关的代码、与处理器类型相关的代码和与应用程序有关的配置代码三部分。这也是μC/OS-II具有良好的可移植性的原因。移植工作主要集中在多任务切换的实现上。这部分代码主要是用来保存和恢复处理器现场(即相关寄存器),因此不能用C语言,只能使用特定处理器的汇编语言完成。在NiosII上移植μC/OS-II只需修改三个和Nios体系结构相关的文件即可[6,7]。下面分别介绍这三个文件的移植工作。

2.1 OS_CPU.H文件

这部分的移植是和所用的编译器相关的,本文使用的编译器是nios-elf-gcc。需要定义的数据类型包括无符号和有符号的8 bit、16 bit和32 bit整型变量等。

因为处理器现场的寄存器在任务切换时都将被保存在当前运行任务的堆栈中,所以OS_STK数据类型应该与处理器的寄存器长度一致。

typedef unsigned int OS_STK;
堆栈由高地址向低地址增长,这和选择的编译器有关。
#define OS_STK_GROWTH 1
宏定义(包括开、关中断的宏定义,以及进行任务切换的宏定义):
#define OS_ENTER_CRITICAL()disable_interrupt();
#define OS_EXIT_CRITICAL()enable_interrupt();
#define OS_TASK_SW()OSCtxSw

2.2 OS_CPU_C.C文件

该文件必须实现任务初始化时的堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器的位置。本文将堆栈空间设计为按任务堆栈空间由高至低依次保存寄存器ra、ISTATUS、r1~r31。
该文件还需要实现几个操作系统规定的hook函数,通常都实现为空函数。

2.3 OS_CPU A.ASM文件

(1)OSStartHighRdy()函数

此函数是在OSStart()多任务启动后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将CPU现场恢复。这时系统就将控制权交给用户创建的该任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动优先级最高的任务执行,以后多任务的调度和切换就由下面的函数来实现。

(2)OSCtxSw()函数

任务级的上下文切换。它是当任务因被阻塞而主动请求CPU调度时被执行的。它的工作是先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行。

(3)OSIntCtxSw()函数

中断级的任务切换,它是在ISR(中断服务例程)中执行任务切换。当发现有高优先级任务就绪,则在中断退出后并不返回被中断的任务,而是直接调度就绪的最高优先级任务执行。这样做的目的是能够尽快地让高优先级的任务得到响应,保证系统的实时性。其原理基本上与任务级的切换相同,但是由于进入中断时已经保存过被中断任务的CPU现场,因此这里就不用再保存。

(4)OSTickISR()函数

时钟中断处理函数。它的主要任务是负责处理时钟中断,调用系统实现的OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。

(5)OS_ENTER_CRITICAL和OS_EXIT_CRITICAL()函数

该函数分别是进入临界区和退出临界区的宏指令。主要用于在进入临界区之前关中断,在退出临界区的时候恢复原来的中断状态。

本文将实时嵌入式操作系统μC/OS-II作为操作平台,实现在NiosII上的移植,用于在电力系统谐波分析中的精确检测。该电力谐波分析仪不但可以对电网进行实时在线谐波分析,而且可以对数据进行远传,具有精度高、运行稳定、实时性好、抗干扰能力强、性价比高等特点,特别是它具有高稳定性和强实时性,为解决电力谐波问题提供了一种有效的分析装置。

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

网站地图

Top