(1)输入输出寄存器。输入寄存器接收由接口函数传递的功能代码和参数,输出寄存器将执行结果返回给接口函数。
(2)中断控制器。接收外部事件中断,中断控制器使用FPGA的I/O(输入/输出)管脚,每个管脚对应一个外部中断,一个或者多个外部中断对应一个中断处理任务[6]。当外部中断到来时,相应的事件标志位被置位,中断任务被置为就绪态。
(3)控制器。从事件控制块和信号量控制块获知任务的状态,结合系统调用的功能代码和参数信息,确定将要执行的操作并发出控制信号。每个硬件单元都通过CPU发出的控制信号进行工作。
RTOS主要功能模块包括:事件标志组管理、信号量管理、任务管理及时钟管理。
(1)事件标志组管理。事件标志组是一个数据结构,采用FPGA的片内寄存器实现,每个事件占1 bit。任务或中断服务可以将某一位置位或复位。当任务所需要的事件发生时,则将相应的事件位置位;当任务所等待的事件都发生时,则应向控制器提出改变任务状态的相应申请,同时将任务的ID号送给任务管理模块。
(2)信号量管理。信号量由2部分组成:16 bit的无符号整型的计数值(0~65535);等待该信号量的任务组成的等待任务表。采用可预置的双向计数器(up/down)实现计数值部分,采用FPGA片内的寄存器实现该信号量的等待任务表。寄存器的位数对应系统中的任务数,每个任务占1 bit,且初始值为0(表示没有任务等待该信号量)。等待该信号量的任务将寄存器的相应位置1,释放该信号量的任务唤醒优先级较高的等待任务,将寄存器的相应位置0。每发生一次置位或复位操作,也必须向控制器提出改变任务状态的相应申请,同时将相应任务的ID号送给任务管理模块。
(3)任务管理。负责各种任务状态的切换和任务调度。任务管理模块接收从输入寄存器、事件标志组管理模块或信号量管理模块传递来的任务ID号,在控制器的相应控制信号作用下,执行任务状态的切换。调度器以任务的状态为敏感信号,当任务的状态发生改变时,触发调度器执行一次任务调度,找出当前优先级最高的就绪态任务。若其优先级高于当前正在运行的任务的优先级,则向CPU发出硬件中断处理信号。
(4)定时器管理。主要实现任务的延时,当设置的延时时间到且任务没有等待别的资源时,将任务的状态置为就绪。
由图1可知,硬件RTOS的工作过程如下:
(1)在应用程序中调用系统服务。
(2)系统调用的接口函数将功能代码和参数传给硬件部分的输入寄存器。
(3)硬件部分执行系统调用。
(4)在硬件逻辑执行系统调用的过程中,可以接收外部事件的异步请求,因此,硬件部分执行系统调用过程中可能转向以下不同的处理过程:
①若外部事件请求使中断任务就绪,则向处理器发出要求任务切换的硬件中断请求。
②若系统调用使高优先级的任务就绪,则硬件部分向处理器发出要求任务切换的硬件中断请求。
③硬件部分完成系统调用功能,则采用中断形式通知处理器并回送处理结果。
(5)中断处理函数完成任务切换。
(6)处理器执行新任务。
2 μC/OS-II任务管理硬件设计
任务管理是RTOS的核心,本文首先对μC/OS-II任务管理模块进行了硬件设计,其他的模块可以依托任务管理展开。μC/OS-II任务管理主要包括建立任务、删除任务、挂起任务、恢复任务、查询任务和任务调度等。其中建立任务、删除任务、挂起任务、恢复任务和查询任务是通过系统调用形式交给用户调用的;而任务调度是交给系统函数调用的,用户不能直接调用它。因此,本文将任务管理分成系统调用函数的硬件实现和任务调度器硬件实现2部分。
2.1 任务管理系统调用函数的硬件设计
μC/OS-II的任务由3部分组成:即任务程序代码、任务堆栈、任务控制块TCB(Task Control Block)。TCB把任务代码和任务堆栈进行关联而使三者成为一个整体。
任务管理系统调用的硬件实现电路如图2所示。参数1是建立任务时,写入TCB的任务代码段地址、任务优先级、任务的参数指针和分配给任务的堆栈栈顶指针等任务运行和管理的信息;参数2是分配给任务的ID号。每个任务依据任务的ID号对应一个TCB。