硬件实时操作系统的设计与实现
dy_TASK1_pro) then
cmp_level3_01_pro<= Ready_TASK0_pro;
cmp_level3_01_id<= Ready_TASK0_id;
else
cmp_level3_01_pro<=Ready_TASK1_pro;
cmp_level3_01_id<=Ready_TASK1_id;
end if;
end process;
每个比较单元以任务ID为索引,以优先级为比较内容,每次比较都将优先级高的任务送入下一级比较,经过2n-1次比较,可以把2n个任务中优先级最高的任务选出。硬件逻辑是物理并行执行的,所以与软件实现的实时操作系统调度内核相比,硬件调度内核的执行速度快,而且这种优势在多任务虚拟并行和高时钟节拍的情况下将更加明显。
硬件调度内核逻辑结构如图5所示,处理器和硬件调度内核之间通过接口总线通信。硬件调度内核在调度时机进行任务调度,调度时机在以下几种情况产生:(1)周期任务周期时间到达,任务状态由等待变为就绪。(2)延时时间到达,等待任务状态由等待变为就绪。(3)外部中断到达,中断任务状态由等待变为就绪。(4)应用程序调用由硬件RTOS提供的系统API改变了任务状态或优先级。
以上述第4种情况为例,描述调度执行过程如下:处理器在执行到应用程序调用的系统API时,将其转换成对应的命令和数据,经编码后传递到调度内核,触发硬件调度内核的一次调度时机。后者解析收到的数据,并执行调度操作,通过比较各任务优先级,计算出优先级最高的就绪任务。若该任务与当前处理器中正在运行的任务不同,则将该任务的ID号和堆栈终止地址利用通知中断回送给处理器。
2.2 中断管理模块的设计实现
普通任务控制块的中断号为0,而中断任务的中断号为大于0的整数值,并与中断号对应的外部中断相关。中断管理模块使用FPGA的I/O(输入/输出)管脚,每个管脚对应一个外部中断,一个或者多个外部中断对应一个中断处理任务。应用程序初始化阶段设定任务控制块中断号字段Int_Number,能注册中断处理任务。在FPGA中建立以外部中断为敏感信号的守护进程,当外部中断到达时,该进程将中断任务置于就绪状态,其伪代码如下:
process(Task_Int_Number)//外部中断为敏感信号
begin
if (Task_Int_Number’event and Task_Int_Number=0) then//下降沿触发
Task_State <=1;//任务置于就绪态
else
Task_State<=0;
end if;
end process;
硬件调度内核以任务状态为敏感信号,当外部中断通过中断管理模块使中断任务就绪时,会触发调度内核执行一次任务调度。中断管理模块的逻辑结构如图6所示。为了保证外部事件的实时处理,应用程序可为中断任务设置高于普通任务的优先级。
2.3 定时器管理模块的设计实现
定时器管理模块以FPGA外部晶振为基准进行分频,创建多个定时器以设定任务周期。与定时器关联的任务称作周期任务。定时器管理模块在每个定时器的周期到达后,使对应的周期任务就绪,触发调度内核进行任务调度。
设定任务控制块中的Timer_Number注册周期任务。如图7所示,定时器管理模块实现:(1)任务周期运行。在应用程序设置并使能周期计数器Timer_Counter后,每当系统时钟到达,计数器减1。当计数器为0时,触发对应的守护进程,使任务进入就绪态并重置周期计数器。任务状态的改变触发FPGA中的调度进程,执行一次任务调度。(2)任务延时。在应用程序设置并使能延时计数器Delay_Counter后,模块使任务变为等待状态。每次系统时钟到达,计数器减1。当计数器为0时,触发对应守护进程,使任务进入就绪态,并执行一次任务调度。
2.4 接口设计
接口总线的硬件由32位数据总线、5位地址总线、1个片选引线和1个通知中断引线构成。接口软件包括系统API和通知中断处理程序。
2.4.1 系统API的设计
系统API实现处理器中应用程序与硬件RTOS的交互。首先为任务调度内核、中断管理和定时器管理等各硬件模块分配处理器访问地址;然后,定义各模块使用的API,确定其功能和转换后向硬件RTOS发出的数据格式及内容。
任务管理API包括:创建任务(Task_Creat)、阻塞任务(Task_Block)、改变任务优先级(Task_Change_Prio)和改变任务状态(Task_Change_State)。
定时器管理API包括:设定分频值(Set_Timer_Fre)、使能周期任务(Set_Timer_Task)和延时(Delay)。
中断管理API包括:设定中断任务(Set_Int_Task)和等待中断(Wait_IRQ)。
下面以创建任务API为例,描述其伪代码和功能注释:
Task_Creat(ID,PRO,STATE)//创建任务,ID为任务索引, //PRO为优先级,STATE为起始状态
{
Senddata=0001∷ID:PRO:STATE;//拼装数据, //变成发送数据格式
&TASKADD=Senddata;//将数据发送给硬件RTOS
}
2.4.2 通知中断
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- VXWORKS内核分析(11-11)
- 嵌入式实时操作系统设计探讨(10-15)
- 嵌入式实时操作系统μC/OS-II 在P89V51RD2中的移植(04-09)
- LPC2292的伪中断与伪中断处理(03-25)
- 网络处理器IP2022及其在嵌入式牌照识别系统中的应用设计(05-16)