ti dspbios 4:线程调度( part 1 )

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.1.4 线程的比较 (1)
4.1.4 线程的比较 (2)
4.1.5 线程让出和抢先 (1)
DSP/BIOS运行优先级最高的线程
当下面情况发生时, 不一定运行优先级最高的线 程: (1) HWI_disable, SWI_disable或TSK_disable被 调用 (2) 高优先级的任务处于阻塞时,即调用了 TSK_sleep, LCK_pend, MBX_pend, or SEM_pend.
PRD: PRD函数以整数倍于低分辨时钟中断或其它事件(如 外部中断)的频率执行。
4.1.2 线程的选择 (4)
PRD与SWI: 所有的PRD函数属于同一个SWI优先级, 所有PRD函数间不能互相抢占。PRD函数 可以触发(post)低优先级软件中断来延长 处理时间。这可以保证在下一个系统计数 (tick)到来时PRD_swi(周期函数对应的 软件中断)可以抢占这些低优先级中断, 新的PRD_swi得以执行。
系统栈上保存了当软件中断抢占其它线程时的寄存器内容。
为了满足同一时刻最大可能的抢占数量,每增加一个软件 优先级别,系统栈大小都要增长。从堆栈使用的角度上看, 给所有的软件中断一个优先级更有效。
当建立第一个PRD对象时,会自动建立一个新的SWI对象 (称作PRD_swi)和系统时钟。如果没有其它的SWI对象, 那么PRD_swi对象使用最低优先级,同时增加系统栈的大 小。
DSP BIOS 4: 线程调度( part 1 )
4.1 线程调度概述
许多实时DSP应用都需要同时执行许多不相关的 功能(functions,函数),这些功能一般是对外部 事件的响应. 这些功能就叫线程.
DSP/BIOS定义线程为任何独立的指令流. 可以是 一个函数, 或一个中断服务程序.
4.1.1 线程的类型(续)
在DSP/BIOS中还有另外几种函数可以执行,它们 是在某一种类型的线程上下文中被执行的:
时钟(CLK)函数:在每个定时器中断的末尾执 行。缺省情况下,这些函数是按HWI函数执行的。
周期(PRD)函数:在片上定时器中断或其它事 件多次计数后执行周期函数,周期函数是一种特 殊类型的软件中断。
4.1.3 线程的优先级
在DSP/BIOS中,硬件中断有最 高的优先级,然后是软件中断, 软件中断可以被高优先权软件中 断或硬件中断抢先。软件中断是 不能被阻塞的。任务的优先权低 于软件中断,共有15个任务优先 权级别(加上TSK_idle应该16 个)。任务在等待某个资源有效 时可以被阻塞。后台线程 idle_loop是优先级最低的线程。
如果在一个SWI得到执行权之前被触发(post) 了多次,那么这个SWI只被执行一次。
4.3.4 软件中断的执行(2)
Postexecution的过程: 当一个SWI对象被触发时(post),SWI管理器将它加入到一个触发 递软件中断列表等待执行。然后SWI管理器检查软件中断是否被允 许: (1)如果没有被允许,就像在HWI函数中一样,SWI管理器将执行 权交给当前线程。 (2)如果软件中断是允许的,SWI管理器将被触发(post)SWI对 象的优先级和当前线程的优先级作比较: (2.1)如果当前运行线程是后台线程或是低优先级的SWI,那么 SWI管理器将这个SWI对象从已触发(posted)SWI对象列表中移去, 并将CPU控制权转到被触发的SWI,开始执行这个SWI。 (2.2)如果当前运行线程的优先级大于等于被触发(post)的 SWI,SWI管理器将控制权转到当前运行线程,当所有高优先级的 SWI运行结束后,被触发(post)的SWI才得以运行。
4.1.2 线程的选择 (2)
SWI与TSK 之间的选择: SWI一般用于相对独立的函数,如果要求比 较复杂的话使用TSK。TSK提供了很多任务 间通讯和同步的手段。一个任务可以挂起 等待某一个资源的有效。使用共享数据时, TSK比SWI有更多的选择。而软件中断执行 时必须保证所需的数据已经准备好。所有 的SWI使用同一个堆栈,所以在存储器使用 上更加高效。
一个软件中断会一直执行到完毕(没有挂起状态),除非 被硬件中断或更高级别的软件中断抢占。
如果在HWI中断服务程序内部需要调用任何会触发软件中 断的SWI函数,那么需要在中断服务程序的入口和出口调 用HWI_enter和HWI_exit,或者使用HWI分派器 (diapatcher)来调用中断服务程序。
4.1.2 线程的选择 (3)
IDL: 后台函数用于执行没有执行时间限制的非关键处理
CLK: 如果希望每个定时器中断时触发一个函数的执行则使 用CLK函数。这些函数是当作HWI来运行,所以应该 保证运行时间尽量小。缺省的CLK对象PRD_clk增加 周期函数的一次计数(tick)。可以增加更多的CLK 对象以相同的速率执行某个函数。
一个硬件中断在响应前触发多次, 则仅响应 一次. 所以硬件中断的响应尽量快.
4.2.1 硬件中断的配置
在DSP/BIOS配置工具中为每一个硬件中断 建立了HWI对象。
使用HWI管理器,可以配置每个硬件中断的 ISR(中断服务函数)。在HWI对象的属性页 中输入ISR的函数名即可。
DSP/BIOS负责设置中断向量表。在配置工 具中也允许配置中断向量表在内存中的位 置(MEM 管理器中设置)。
IEMASK,定义那些中断位需要被屏蔽。
CCMASK,定义CSR中的缓存控制位的 设置值。
4.2.3 中断中的上下文切换和
硬件中断管理 (3)
HWI_enter/HWI_exit宏还保证在中断嵌套情况下只在最外层中断服 务例程中调用DSP/BIOS调度器。如果在HWI或其嵌套的HWI中触发 了(trigger)一个SWI(使用SWI_post)或使能了一个高优先权的 TSK,那么在最外层的HWI_exit中会调用SWI或TSK的调度器。SWI 调度器在切换到任何高优先权TSK之前首先服务所有未决的SWI。
4.2.1 硬件中断的配置(图)
4.2.2 允许和禁止硬件中断
在一个软件中断或任务中,可以在一个关键段的处理中暂 时禁止硬件中断。
函数HWI_disable和HWI_enable/HWI_restore需成对使用 来禁止或允许中断。
HWI_disable和HWI_restore成对使用允许硬件中断嵌套。
4.3 软件中断
软件中断不同于一般处理器上的软件中断指令, DSP/BIOS的SWI模块是独立于任何处理器相关的软件中断 指令的。
SWI线程适于处理的应用是速率较低的或时限不如HWI严 格的工作。
SWI的触发是编程实现的,有五个函数可以触发软件中断: SWI_andn,SWI_dec,SWI_inc,SWI_or,SWI_post
typedef struct SWI_Attrs {
SWI_Fxn
fxn;
Arg
arg0;
Arg
arg1;
#if defined(_54_)
Bool iscfxn;
#endif
Int
priority;
Uns
mailbox;
} SWI_Attrs;
4.3.2 设置软件中断优先级
配置工具中设置SWI对象的优先级。
时钟中断post的SWI的运行: DSP/BIOS是时钟驱动的操作系统。每个时钟中断服务CLK_F_isr后 调用FXN_F_run,FXN_F_run中运行每个CLK对象的函数(这些 CLK对象一般用于触发SWI,比如PRD_F_tick时钟函数触发 KNL_swi)。接着转到SWI_RUNFXN中,按优先级运行FXN_F_run 中post的每个软件中断。最低级的软件中断KNL_swi进行任务调度。 最后,回到IDL_loop中。
不要进行任务切换
4.2.3 中断中的上下文切换和 硬件中断管理 (1)
一个中断抢占另外一个中断时,这个中断要保存 和恢复它修改的寄存器。使用HWI_enter和 HWI_exit保存和恢复寄存器。
HWI_enter/HWI_exit还保证SWI和TSK管理器在 合适的时候被调用。
使用HWI dispatcher,就把C写的HWI函数放到 HWI_enter/HWI_exit宏对中。所以使用HWI dispatcher后,不能再调用HWI_enter/HWI_exit, 否会导致系统崩溃。
4.2.3 中断中的上下文切换和 硬件中断管理 (2)
HWI_enter ‘isr code‘
HWI_exit
C62_ABTEMPS, C62_CTEMPS, IEMASK, CCMASK C62_ABTEMPS, C62_CTEMPS, IEMASK, CCMASK
C62_ABTEMPS和C62_CTEMPS ,决定 保存并恢复那些A、B或控制寄存器。
只要存储器容量没有限制,可以建立任意多的SWI对象。
软件中断可以有15个优先级,从最低的SWI_MINPR(0) 到最高的SWI_MAXPRI(14)。优先级0是保留给 KNL_swi对象的,它是任务调度器。
4.3.3 软件中断优先级和 应用程序堆栈大小
除了任务,所有DSP/BIOS中的线程都是在同一个系统栈 上运行的。
DSP/BIOS使应用程序按线程结构化设计,每个线 程完成一个模块化的功能.
多线程程序中允许高优先级线程抢占低优先级线 程,以及线程间的同步和通讯
4.1.1 线程的类型
DSP/BIOS 支持4种线程:
(1)硬件中断(HWI): 频率可达200KHz(5us),处理 时限在2us~100us . (2)软件中断(SWI):时限100us以上,SWI允许HWI 将一些非关键处理在低优先级上延迟执行,这样可以减少 在中断服务程序中的驻留时间 (3)任务(TSK):任务与软件中断不同的地方在于在运行 过程中可以被挂起。DSP/BIOS提供了一些任务间同步和 通讯的机制,包括队列、信号灯和邮箱。 (4)后台线程(IDL): MAIN->空闲循环: 运行那些没 有执行期限(deadlines)的函数
4.1.5 线程让出和抢先 (2)
4.1.5 线程让出和抢先 (3)
线程抢先的例子
4.2 硬件中断
硬件中断是对外界异步事件触发的, 来源可 以是片上(on-device)设备或外部设备.
硬件中断发生,处理器转向中断处理向量.
一个硬件中断在处理时可以被另外一个硬 件中断抢占,而不论其优先级.
4.3.1 建立SWI对象
动态法:SWI_creat;可以动态删除 静态法:配置工具; 不能动态删除
swi = SWI_create(attrs); 其中,swiห้องสมุดไป่ตู้一个句柄。 attrs是一个 SWI_Attrs结构。
SWI_create只能在任务 级调用,而不能在HWI或 其它SWI中调用。
4.3.5 SWI对象的邮箱(1)
每个SWI都有一个32位的邮箱,它用来决定是否 触发中断或者被SWI函数内部使用。
5个触发SWI的函数的不同和对邮箱的作用
4.3.5 SWI对象的邮箱(2)
SWI触发后,邮箱的 值恢复初始化的值。
SWI_getmbox(),得到 SWI在触发前的邮箱 值。 利用这一点,可以控 制SWI的函数的执行 次数。(难点之一) 提供的运行机制!
4.3.4 软件中断的执行(1)
一般通过调用SWI_andn、SWI_dec、SWI_inc、 SWI_or和SWI_post来使软件中断进入调度。这 些函数可以在程序的任何地方调用。
SWI可以被更高优先级的线程抢占,但是,SWI不 能被阻塞,即使软件中断正在等待一个外部设备 (比如等到设备准备好)也不可以将它挂起。
数据通知函数:在使用管道(PIP)或主机通道 (HST)传输数据时执行。
4.1.2 线程的选择 (1)
SWI、TSK与HWI之间的选择: 硬件中断只处理时间要求苛刻的关键任务。 HWI可以处理发生频率在200KHz左右的事 件。软件中断或任务可以用于执行时间限 制在100us以上的事件。HWI函数应该触发 (post)软件中断或任务来进行低优先级处 理。使用低优先级线程可以减小中断禁止 的时间,允许其它中断的触发。
相关文档
最新文档