资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章,TI DSP/BIOS,第,3,节,DSP_BIOS,:线程调度,7.3.1,线程调度概述,许多实时,DSP,应用都需要同时执行许多不相关的功能(,functions,函数),这些功能一般是对外部事件的响应.,这些功能就叫线程.,DSP/BIOS,定义线程为任何独立的指令流.可以是一个函数,或一个中断服务程序.,DSP/BIOS,使应用程序按线程结构化设计,每个线程完成一个模块化的功能.,多线程程序中允许高优先级线程抢占低优先级线程,以及线程间的同步和通讯,7.3.1.1,线程的类型,DSP/BIOS,支持4种线程:,(1)硬件中断(,HWI):,频率可达200,KHz(5us),,处理时限在2,us100us.,(2)软件中断(,SWI):,时限100,us,以上,,SWI,允许,HWI,将一些非关键处理在低优先级上延迟执行,这样可以减少在中断服务程序中的驻留时间(3)任务(,TSK):,任务与软件中断不同的地方在于在运行过程中可以被挂起。,DSP/BIOS,提供了一些任务间同步和通讯的机制,包括队列、信号灯和邮箱。(4)后台线程(,IDL):MAIN-,空闲循环:运行那些没有执行期限(,deadlines),的函数,7.3.1.1,线程的类型(续),在,DSP/BIOS,中还有另外几种函数可以执行,它们是在某一种类型的线程上下文中被执行的:,时钟(,CLK,),函数:在每个定时器中断的末尾执行。缺省情况下,这些函数是按,HWI,函数执行的。,周期(,PRD,),函数:在片上定时器中断或其它事件多次计数后执行周期函数,周期函数是一种特殊类型的软件中断。,数据通知函数:在使用管道(,PIP,),或主机通道(,HST,),传输数据时执行。,7.3.1.2,线程的选择 (1),SWI,、,TSK,与,HWI,之间的选择,:硬件中断只处理时间要求苛刻的关键任务。,HWI,可以处理发生频率在,200,KHz,左右的事件。软件中断或任务可以用于执行时间限制在,100,ms,以上的事件。,HWI,函数应该触发(,post,),软件中断或任务来进行低优先级处理。使用低优先级线程可以减小中断禁止的时间,允许其它中断的触发。,7.3.1.2,线程的选择 (2),SWI,与,TSK,之间的选择:,SWI,一般用于相对独立的函数,如果要求比较复杂的话使用,TSK,。,TSK,提供了很多任务间通讯和同步的手段。一个任务可以挂起等待某一个资源的有效。使用共享数据时,,TSK,比,SWI,有更多的选择。而软件中断执行时必须保证所需的数据已经准备好。所有的,SWI,使用同一个堆栈,所以在存储器使用上更加有效。,7.3.1.2,线程的选择 (3),IDL:,后台函数用于执行没有执行时间限制的非关键处理,CLK:,如果希望每个定时器中断时触发一个函数的执行则使用,CLK,函数。这些函数是当作,HWI,来运行,所以应该保证运行时间尽量小。缺省的,CLK,对象,PRD_clk,增加周期函数的一次计数(,tick)。,可以增加更多的,CLK,对象以相同的速率执行某个函数。,PRD:PRD,函数以整数倍于低分辩时钟中断或其它事件(如外部中断)的频率执行。,7.3.1.2,线程的选择 (4),PRD,与,SWI,:,所有的,PRD,函数属于同一个,SWI,优先级,所有,PRD,函数间不能互相抢占。,PRD,函数可以触发(,post,),低优先级软件中断来延长处理时间。这可以保证在下一个系统计数(,tick,),到来时,PRD_swi,(,周期函数对应的软件中断)可以抢占这些低优先级中断,新的,PRD_swi,得以执行。,7.3.1.3,线程的优先级,在,DSP/BIOS,中,硬件中断有最高的优先级,然后是软件中断,软件中断可以被高优先权软件中断或硬件中断抢先。软件中断是不能被阻塞的。任务的优先权低于软件中断,共有,15,个任务优先权级别(加上,TSK_idle,应该16个)。任务在等待某个资源有效时可以被阻塞。后台线程,idle_loop,是优先级最低的线程。,7.3.1.4,线程让出和抢先(1),DSP/BIOS,运行优先级最高的线程,当下面情况发生时,不一定运行优先级最高的线程:(1),HWI_disable,SWI_disable,或,TSK_disable,被调用(2)高优先级的,任务,处于阻塞时,即调用了,TSK_sleep,LCK_pend,MBX_pend,or,SEM_pend,.,7.3.1.4,线程让出和抢先(2),7.3.1.5,线程让出和抢先(3),线程抢先的例子,7.3.2,硬件中断,硬件中断是对外界异步事件触发的,来源可以是片上(,on-device),设备或外部设备.,硬件中断发生,处理器转向中断处理向量.,一个硬件中断在处理时可以被另外一个硬件中断抢占,而不论其优先级.,一个硬件中断在响应前触发多次,则仅响应一次.所以硬件中断的响应尽量快.,7.3.2.1,硬件中断的配置,在,DSP/BIOS,配置工具中为每一个硬件中断建立了,HWI,对象。,使用,HWI,管理器,可以配置每个硬件中断的,ISR(,中断服务函数)。在,HWI,对象的属性页中输入,ISR,的函数名即可。,DSP/BIOS,负责设置中断向量表。在配置工具中也允许配置中断向量表在内存中的位置(,MEM,管理器中设置)。,7.3.2.1,硬件中断的配置(图),7.3,.2.2,允许和禁止硬件中断,在一个软件中断或任务中,可以在一个关键段的处理中暂时禁止硬件中断,。,函数,HWI_disable,和,HWI_enable/HWI_restore,需成对使用来禁止或允许中断。,HWI_disable,和,HWI_restore,成对使用允许硬件中断嵌套。,不要进行任务切换,7.3,.3 软件中断,软件中断不同于一般处理器上的软件中断指令,,DSP/BIOS,的,SWI,模块是独立于任何处理器相关的软件中断指令的。,SWI,线程适于处理的应用是速率较低的或时限不如,HWI,严格的工作。,SWI,的触发是编程实现的,有五个函数可以触发软件中断:,SWI_andn,SWI_dec,SWI_inc,SWI_or,SWI_post,一个软件中断会一直执行到完毕(没有挂起状态),除非被硬件中断或更高级别的软件中断抢占。,如果在,HWI,中断服务程序内部需要调用任何会触发软件中断的,SWI,函数,那么需要在中断服务程序的入口和出口调用,HWI_enter,和,HWI_exit,,,或者使用,HWI,分派器(,diapatcher,),来调用中断服务程序。,7.3,.3,.1,建立,SWI,对象,动态法:,SWI_creat,;,可以动态删除静态法:配置工具;不能动态删除,swi,=,SWI_create(attrs,);,其中,,swi,是一个句柄。,attrs,是一个,SWI_Attrs,结构。,SWI_create,只能在任务级调用,而不能在,HWI,或其它,SWI,中调用。,typedef,struct,SWI_Attrs,SWI_Fxn,fxn,;,Arg,arg0;,Arg,arg1;,#if defined(_54_),Bool,iscfxn,;,#,endif,Int,priority;,Uns,mailbox;,SWI_Attrs,;,7.3,.3.2,设置软件中断优先级,配置工具中设置,SWI,对象的优先级。,只要存储器容量没有限制,可以建立任意多的,SWI,对象。,软件中断可以有15个优先级,从最低的,SWI_MINPR(0),到最高的,SWI_MAXPRI(14)。,优先级0是保留给,KNL_swi,对象的,它是任务调度器。,7.3,.3.3,软件中断优先级和应用程序堆栈大小,除了任务,所有,DSP/BIOS,中的线程都是在同一个系统栈上运行的。,系统栈上保存了当软件中断抢占其它线程时的寄存器内容。,为了满足同一时刻最大可能的抢占数量,每增加一个软件优先级别,系统栈大小都要增长。从堆栈使用的角度上看,给所有的软件中断一个优先级更有效。,当建立第一个,PRD,对象时,会自动建立一个新的,SWI,对象(称作,PRD_swi,),和系统时钟。如果没有其它的,SWI,对象,那么,PRD_swi,对象使用最低优先级,同时增加系统栈的大小。,7.3.4,任务调度,任务对象是那些被,TSK,模块管理的线程。任务的优先级高于空闲循环,低于硬件和软件中断。,TSK,模块根据任务的,优先级,和当前的,执行状态,动态地调度和抢占任务。,Ready,中最高优先级的任务运行。151(,idle loop),TSK,模块提供了一组函数来操纵任务对象。并使用,TSK_Handle,类型的句柄来存取,TSK,对象。,内核为每个任务对象保留了处理器寄存器的拷贝,每个任务都有自己的运行时栈用于保存局部变量和用于嵌套的函数调用。,每个,TSK,对象的堆栈大小可以分别设置,每个堆栈必须足够处理子程序调用加上一个任务抢占上下文的保存。,7.3.4.1,任务的创建(1),动态创建和删除任务,注意,:一般情况下,应该先释放任务占有的资源(信号灯、邮箱等)再删除掉该任务。,7.3.4.1,任务的创建(2),配置工具创建任务,创建时挂起,7.3.4.2,任务执行的状态和调度(1),4种执行状态:,运行态(,Running),,代表任务是处理器当前正在执行的线程,以,TSK_RUNNING,表示。,就绪态(,Ready),,代表任务一旦获得处理器的处理时间就可以执行,以,TSK_READY,表示。,阻塞态(,Blocked),,代表任务必须等到某个事件的发生才可以运行,以,TSK_BLOCKED,表示。,终止态(,Terminated),,代表任务已经结束,不会再运行,以,TSK_TERMINATED,表示。,7.3.4.2,任务执行的状态和调度(2),与一般的基于时间片调度策略的,RTOS,不同的是,一旦有更高优先级的任务进入就绪状态,,DSP/BIOS,立刻抢占,当前的任务。,理解,:但是,,DSP/BIOS,也是可以实现的时间驱动的,RTOS。,在程序执行过程中,任务可能因为不同的原因在各个状态见切换。,TSK、SEM,和,SIO,模块中的函数可以改变任务的运行状态:阻塞或终止当前运行任务,使一个阻塞的任务就绪,重新调度当前线程,等等。,7.3.5 IDLE,循环(1),IDLE,线程是背景任务。任何其它线程都可以,在任何时间,抢占空闲循环的执行。,IDLE,函数:可以在配置工具中插入。,IDLE,函数的应用环境:用于查询非实时设备(这些设备不能产生中断),监测系统状态,或执行其它后台操作。,目标处理器和主机,DSP/BIOS,分析工具间的通讯是在空闲循环中执行的。,7.3.5 IDLE,循环(2),缺省时的,IDLE,对象函数:(1),LNK_dataPump,:,管理实时分析数据(,LOG,和,STS,数据),和主机通道数据的传输。在,C55x,和,C6000,平台上,主机通过触发一个中断来传输数据。这个中断的优先级高于,SWI、TSK,和,IDL,函数。实际的,HWI,函数只执行很短的时间。,LNK_dataPump,作了耗时的数据准备工作,只有实际的数据传输是在高优先级下执行的。(2),RTA_dispatcher,:,用于在目标处理器端接收主机实时分析工具的命令,搜集目标处理器上的监测信息并上传。,RTA_dsipatcher,处在两个主机通道的末端,它通过,LNK_dataPump,程序接收命令和传输相应数据。(3),IDL_cpuLoad,:,使用,IDL_busyObj,统计对象计算目标处理器载荷。数据是通过,RTA_dispatcher,上传给,DSP/BIOS,分析工具的。(4),RTDX_dataPump,(,仅,C54):,调用,RTDX_Poll,,,在,target,和,host,间传递数据。(,C55,和,C6000,是靠中断实现的),
展开阅读全文