深度分析T-Kernel在Blackfin处理器上的移植
扫描二维码
随时随地手机看文章
1 概述
在嵌入式RTOS(Real Time Operating System)领域,日本T-Engine组织推出的T-Kernel以其开源免费,小体积强实时性内核,统一的接口规范等特点显出了优势;ADI. Blackfin系列处理器在嵌入式控制和数字信号处理领域应用非常广泛,同时结合了MCU(Micro Controller Unit)和DSP特点,非常适合于运行RTOS系统。
本文分析T-Kernel内核调度原理和Blackfin处理器内核结构,归纳了T-Kernel在Blackfin处理器BF533系统移植过程中的三个主要问题:中断管理,任务切换和系统调用入口三个模块的实现方法,并讨论了系统稳定性和实时性的测试以保证系统的稳定性和实时性。
2 T-Kernel概述
2.1 T-Kernel的系统结构
图1 T-Kernel的位置
T-Kernel的系统结构如图1所示,各功能模块是以子系统(subsystem)的形式存在的,如设备管理模块。
T-Kernel的内核是系统默认的子系统,它为应用层提供系统服务(SVC)接口,同时管理着其他子系统。子系统为应用层提供扩展服务(Extended SVC)调用接口。系统中各子系统运行在相互独立的地址空间中,保证了系统的模块化,易于扩充和裁减。
2.2 T-Kernel的系统状态和任务调度
T-Kernel规范[1]中对系统状态做了明确的划分和定义,移植相关的状态有:(1)任务态 (Task Portion),指系统运行在应用层最高优先级的就绪任务中;(2)任务无关态 (Task Independent Portion),指系统的中断和异常处理过程。任务无关态具有最高的执行优先权,可以中断其它状态的执行。
T-Kernel内核采用了基于优先级的可抢先调度策略,优先级相同的任务采用先进先出的时间片轮转调度,允许任务动态更改优先级。
T-Kernel的任务调度和切换是分离的过程。内核中维护着按照优先级排列的就绪任务TCB(Task Control Block)指针链表队列。全局指针ctxtsk指向当前运行任务的TCB。有更高优先级任务就绪时,全局指针schedtsk指向其TCB,此为任务调度过程;任务调度发生后,必须在条件满足时,系统触发软中断异常进行任务切换,将ctxtsk更新为schedtsk,程序转入新任务运行。
3 Blackfin处理器概述
Blakcfin处理器内核包含双算术处理单元的DSP引擎,执行RISK指令集,结合了优异的数字信号处理功能和完善的控制功能。.
Blackfin内核相关的寄存器除了堆栈和返回地址寄存器:SP(Stack Pointer),FP(Frame Pointer),RETS(Subroutine Return Address Register),RETI(Interrupt Return Address Register),通用数据寄存器R0~R7,通用地址寄存器P0~P7,还包含数字信号处理相关寄存器 L0~L3,LB0~LB1,LC0~LC1,LT0~LT1,ASTAT,A0~A1,I0~I3, B0~B3,M0~M3. 在任务切换和中断前后处理中,需要进行寄存器保存恢复及相应的设置[2]。
Blackfin处理器内核支持15个优先级的中断。ILAT寄存器显示当前触发的中断;IMASK寄存器控制各优先级中断的使能和禁止;IPEND寄存器显示当前执行的中断,其第4位IPEND[4]是全局中断的使能和禁止位。T-Kernel运行在第15级(最低)中断处理程序中,这样系统运行于Supervisor Mode,可以获得对处理器操作的最大权限[2]。
T-Kernel系统运行在ADSP-BF533 EZ-KIT LITE开发板,开发环境是ADI VisualDSP++4.5 Environment.
4 T-Kernel在BF533上的移植
4.1 系统中断管理
T-Kernel对处理器中断资源进行动态管理,在运行时任务可以动态更改中断向量表、注册和取消中断,通过系统服务tk_def_int(Define Interrupt Handler) 来实现。
在中断管理模块的移植中,需要考虑以下三点:
(1)保证中断状态寄存器IMASK的全局性
在进行上下文保存恢复和临界区管理时,必须维持IMASK寄存器为全局变量。如果每个任务都拥有一个局部的IMASK值,则一个任务等待的中断可能在另一个任务运行时被禁止,造成系统对中断无法实时响应。同时,tk_def_int函数需要实现不同任务对各级中断定义的互斥功能,以保证全局 IMASK的有效和系统的稳定。
(2)中断前后处理
中断前后处理是中断管理移植的关键,影响到系统稳定性和中断处理的实时性。它对于任务是不可见过程,执行不能被中断。其主要操作包括:保存和恢复上下文;设置标志变量标示任务无关态的嵌套;更改堆栈指针使中断子程序运行在处理器内部RAM;取得当前触发的最高优先级中断号对应的子程序地址进行调用;在中断后处理判断是否进行任务切换。
系统为中断程序分配独立的内部堆栈,使中断程序运行的地址空间独立于任务和虚拟存储地址,加快了中断程序的处理速度,在系统进入省电模式停止了外部存储器时也不影响对中断唤醒的响应。在T-Kernel系统中,中断处理属于任务无关态,其执行优先级高于任务态,在中断处理程序中发生的任务调度,需要延迟到中断结束才能进行切换。当任务无关态运行无嵌套,系统允许任务切换,schedtsk不等于ctxtsk三个条件满足时,中断结束后即转入任务切换。
(3)T-Kernel的系统时钟中断
T-Kernel的系统时钟中断使用Blackfin内核的core timer 6号中断。其前后处理步骤与(2)相同,为了保证系统稳定性和实时性,一般为系统时钟的中断程序分配单独的堆栈,使其在高速内部RAM中执行。
4.2 任务切换模块的移植
任务切换包括任务间上下文切换和中断到任务上下文切换,前者在临界区结束时触发软中断进入dispatch_entry()完成,后者则在中断后处理中调用tk_ret_int()开始执行。
图2 任务切换流程图
dispatch_entry()和tk_ret_int()的处理过程都是保存ctxtsk任务的上下文,替换ctxtsk为schedtsk,恢复其上下文,执行流程如图2所示。二者的不同在于dispatch_entry()软中断的优先级为14级,而tk_ret_int()在中断后处理中被调用,仍处于中断过程,其优先级由中断处理程序的优先级决定;这样可能出现tk_ret_int()嵌套dispatch_entry()的情况,所以在从tk_ret_int()切入新任务或低功耗状态之前需要判断是否需要清除IPEND寄存器中断执行的标志。当没有就绪任务时,schedtsk值为空,系统转入低功耗状态。[!--empirenews.page--]
T-Kernel系统中的每个任务可以定义一个特定的任务异常处理程序,任务异常处理被触发后,优先于该任务得到执行。
4.3系统调用入口移植
T-Kernel对应用层调用系统服务和扩展服务进行了限制,只能调用相应的接口函数(以tk_***_***()命名的API),在接口函数中触发软中断进入Call_entry(),在Call_entry()函数中才能取得实际服务函数(以_tk_***_***()命名)的入口地址执行[3]。处理流程如图3所示。系统调用可能发生在中断过程中,所以Call_entry()软中断异常的优先级需要设为最高。Fncd是每个服务函数唯一的标识码,从中可以判断出该函数是系统服务还是子系统的扩展系统服务,后者需要通过svc_ientry()函数调用。
图3 T-Kernel系统调用处理流程
5 移植测试
移植测试工作主要分为稳定性测试和实时性测试两部分。测试的目的是保证移植工作的正确性。
通过新建15个不同优先级的任务进行休眠暂停请求异常处理和请求信号量等操作,同时定义计时器中断唤醒任务,可以测试系统的稳定性。移植系统的实时性可以通过任务的建立时间,结束时间,任务的切换时间,抢占时间,中断延迟时间,信号量混洗时间等指标来确定。
任务切换时间为系统在两个具有相同优先级独立任务之间切换所需的时间。抢占时间定义为系统控制从低优先级任务转移到高优先级任务所花费的时间。中断延迟时间指从中断响应到中断子程序语句得到执行的时间间隔。信号量混洗时间指一个信号被释放到等待该信号量的任务被激活的时间延迟[6]。部分的测试结果如表5.1所示。移植代码编译为速度优化100%,时间单位是Blackfin处理器cycles寄存器所记录的运行时钟周期。可以看到,系统运行在600MHz时的性能指标都在微秒级。
表1 部分适时性测试时间结果
6 总结
本文针对Blackfin处理器(BF533)平台上移植T-Kernel的应用需求,分析和归纳了移植的主要过程,总结了中断管理、任务切换和系统调用接口三部分的移植方法,对系统的稳定性和实时性进行相应的测试以保证移植工作的正确性。移植过程揭示了T-Kernel内核任务调度的原理和技术细节,对于其它RTOS的开发有很大的借鉴意义。
文中所讨论的移植方法,没有包括对于MMU(Memory Management Unit)管理模块的移植,因为在绝大多数嵌入式实时性应用中,由于对速度和资源的限制,并不开启处理器的MMU功能,如果在数据和信息处理的应用中有需求,可以针对特定处理器的MMU模块进行相关代码的移植。
(特别感谢上海易律电子刘湘毅的技术支持)
参考文献
[1] T-Engine Forum T-Kernel Specification Version 1.00.00 2005
[2] ADI ADSP-BF533 Blackfin Processor Hardware Reference Revision 3.0 Feb 2004
[3] Mohit Sindhwani, Anatomy of a T-Engine System Call, page:www.onghu.com/te 2006
[4]T-Engine Forum T-Kernel Implementation guide to New Hardware Rev.1.00.01 2006.06.2
[5]黄天戍,李秀红 RTOS数据采集系统中实时处理与高速性的设计考虑[J] 微计算机信息 No.28 P.95-97 2005
[6] 李庆诚,顾健 嵌入式实时操作系统性能测试方法研究 单片机与嵌入式系统应用
NO.8 P.19-21 2005