DSP

TMS320C6474学习总结(六)----如何选择线程的类型?

2019-07-13 11:32发布

        DSP在同一时间执行多个任务,当外部数据变为有效或者出现控制信号时,对外部事件进行响应。通常将这些任务称为线程,DSP/BIOS采用广义的定义:DSP执行的所有独立的指令流。一个线程是一个单独的控制点,可能包含一个字程序、一个宏或者是一个函数调用。         DSP/BIOS系统主要有四类线程类型:HWI、SWI、TSK、IDL,那么我们该如何选择合适的线程呢?下面主要介绍下线程的选取规则:  

1:严格的实时性

        如果线程的执行需要严格的实时性,而线程执行需要的时间又很少时,可以使用硬件中断或者时钟函数完成硬件中断线程将由外部的同步事件(如A/D转换器的中断信号)触发而执行。HWI函数或中断服务子程序将在中断发生后执行。DSP/BIOS的应用程序中,HWI中断函数冷处理频率为200KHz的中断(这是一个概数),处理时间在2-5us之间时,使用硬件中断线程。硬件中断线程有极小的中断潜伏期(中断触发到中断服务子程序的第一条指令开始执行的时间)硬件中断线程推荐使用汇编语言。硬件中断处理函数中,可以将SWI软件中断对象或TSK任务对象放到执行队列里面,但它们必须等到所有的硬件中断线程结束后才有效,所以要使HWI硬件中断函数尽快结束。硬件中断函数在调用某些PIP管道模块的API函数时,PIP_alloc,PIP_free,PIP_get,PIP_put等,读写通知函数也将在中断响应中调用执行。

2:部分实时性

SWI软件中断或TSK任务线程来完成一些非实时性的处理任务。二者有如下特点:能完成实时的处理任务但允许处理时间相对较长、允许被其他线程抢先。 如果有以下情况之一,使用TSK:         处理函数需要等待某些资源,以便继续运行         处理函数与其它线程之间有复杂的联系或数据共享要求        处理函数有自己的堆栈空间而不是用系统的堆栈空间        处理函数用到LCK、MBX、SEM等内核模块        处理函数在创建、删除、退出、就绪、切换时调用钩子函数 因为:        任务可以被挂起,等待条件满足而继续运行,而SWI不能;        任务之间通信和同步有SEM、MBX、LCK等,SWI没有;        任务使用自己的堆栈,而SWI使用系统堆栈;        任务可调用钩子函数 软件中断:往往伴随着硬件中断的发生。一般地若在硬件中断服务函数中调用SWI_post函数,产生软件中断。其适合处理一些发生速率较低的任务,对实时性要求不苛刻的任务。SWI可以帮助HWI将一些非严格实时性的处理放到低优先级的线程中。(注意:硬件中断响应过程中,系统关中断)由于软件中断不能挂起,所以软件中断处理之前必须所有的数据准备好,用邮箱判断。

 

3:周期性的服务

        周期性地或在固定的时间间隔内完成处理任务,一般地,时间间隔比处理任务所需的时间长得多,就用PRD。周期性函数属于SWI软件中断的PRD_swi对象,所有周期函数具有同样的SWI软件中断优先级,所以周期函数不能抢先于其它周期函数。假若其它的SWI或者TSK处理时间较长,此时需要提高整个PRD周期函数的优先级。多个周期函数如果被同一个系统时钟触发,那么执行顺序是按照创建时候的顺序执行。  

4:不需要实时性

      收集统计数据,与自己交换检测数据,用IDL线程。IDL线程当主函数返回之后,DSP/BIOS内核调用该应用程序所用到的DSP/BIOS模块的初始化启动代码。结束后,进入IDL等待循环,不停地依次调用IDL后台对象中的所有函数。