一个比较单元的实现代码如下:
process(Ready_TASK0_pro, Ready_TASK1_pro)
begin
if (Ready_TASK0_pro< Ready_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所示。为了保证外部事件的实时处理,应用程序可为中断任务设置高于普通任务的优先级。