DSP

DSP/BIOS

2019-07-13 11:59发布

    很多实时的 DSP 应用程序很可能会在同一时间执行多个看似不相关的任务。比如当外部数据变为有效或者出现控制信号时,对外部事件进行响应。这些任务都很重要,而且必须同时进行。      通常,我们将这些任务称为线程。不同的系统对线程进行了狭义或广义的定义。在 DSP/BIOS中采用广义的定义,即 DSP 执行的所有独立的指令流。一个线程是一个单独的控制点,它可能包含一个子程序、一个宏或者是一个函数调用。 DSP/BIOS内核使你的应用程序可以由一系列线程组成,而每个线程执行一个模块化的函数。多线程的程序在一个单独的处理器上运行是通过允许高优先级的线程抢先低优先级的线程来实现的,并且允许各线程之间的各种相互作用,包括暂停、通信及同步。 DSP/BIOS内核支持具有不同优先级的多种类型的线程。每种线程类型具有不同的执行及抢先特点。主要有以下几种线程类型(从高优先级到低优先级):
  • 硬件中断(HWI):包括 CLK 功能;
  • 软件中断(SWI):包括 PRD 功能;
  • 任务线程(TSK);
  • 后台线程(IDL)
在DSP/BIOS应用程序中主要有四类线程:
  • 硬件中断(HWI)。硬件中断线程将由外部的同步事件触发而执行。HWI 函数或中断服务子程序(ISR)将在中断发生后执行。由于硬件中断具有最高优先级,所以HWI 函数具有严格的实时性。在 DSP/BIOS 的应用程序中,HWI 中断函数能够处理频率为200kHz 的中断,这要求在2到100内处理完。
  • 软件中断(SWI)。软件中断线程往往伴随着硬件中断的发生。每当有硬件中断发生时,会触发 HWI 硬件中断服务函数,而软件中断的触发是靠 SWI 软件中断API 函数调用实现的。软件中断在硬件中断和TSK之间提供了额外的优先级。SWI处理那些有处理时间限制但又不适合作为任务来运行的线程,但它不像硬件中断服务子程序那样对处理时间有严格的要求。与HWI硬件中断线程一样,SWI软件中断线程总会一直执行下去,直到结束。软件中断可用于处理时间在100或以上的事件。SWI 软件中断可以帮助HWI硬件中断将一些非严格实时性的处理放到低优先级的线程中,以减少硬件中断的响应时间,这样就不需要用到HWI硬件中断了。
  • 任务线程(TSK)。任务线程的优先级高于后台线程但低于软件中断。任务线程与软件中断的不同之处在于在运行过程中任务可以等待(阻塞)到所需资源可用再继续执行。DSP/BIOS内核提供了一组用于任务之间通信和同步的数据结构,包括队列,旗语和邮箱。
  • 后台线程。IDL 等待循环是 DSP/BIOS 内核中最低优先级的线程。当应用程序的主函数返回后,DSP/BIOS 内核调用该应用程序所用到的 DSP/BIOS 模块的初始化启动代码。在这些启动代码结束后,便进入这个 IDL 等待循环。该循环是一个无限循环,它不停地调用 IDL 后台对象中的所有函数。每个函数在前一个函数结束后依次运行。这些 IDL 函数不断被运行,直到被更高优先级的线程抢先。IDL 函数不适合于有实时性要求的任何处理任务。
DSP/BIOS程序中还可以执行其他一些函数。
  • 时钟函数(CLK)。由片上的定时器中断触发。通常这些函数由硬件中断触发,在HWI硬件中断中执行。
  • 周期函数(PRD)。多次地由片上的定时器中断或其他事件产生。周期函数是一类特殊的软件中断。
  选择线程类型 在应用程序中对每个线程的类型和优先级的选择将影响到线程是否按时执行以及是否正确执行。DSP/BIOS的静态配置文件使你可以很容易的修改线程的类型。 以下是在程序中确定使用哪种线程类型的一些原则:
  • SWI或TSK与HWI。当线程的执行需要严格的实时性时才使用硬件中断服务子程序。使用HWI硬件中断时应考虑到硬件中断处理时间需在5内,不然数据就有可能被覆盖掉。当任务处理时间稍长,大概100或以上的话,就可以考虑使用软件中断或任务线程来完成。用户的HWI函数应当调用软件中断或任务线程去执行优先级较低的处理。低优先级的线程可以减少中断潜伏期,允许其他硬件中断产生。
  • SWI与TSK。如果处理函数之间只有简单的联系和数据共享要求则使用软件中断。更复杂的要求则应使用任务线程。虽然高优先级线程可以抢先低优先级线程,但任务线程可以等待其他事件,如等待可用资源。当使用共享数据时任务线程比SWI软件中断有更多的选择。当程序调用SWI软件中断时,软件中断函数需要的所有数据应当准备好。SWI 软件中断对象中的邮箱提供了一种判断资源准备情况的方法。软件中断线程比任务线程使用更少的存储器,因为所有的软件中断线程都使用同一个堆栈空间。
  • IDL。当没有其他任务需要执行时,应创建后台函数来执行无关紧要的后台任务。IDL函数对执行时间没有要求,它只是在系统的空闲时间才运行。
线程优先级 在DSP/BIOS中,硬件中断有最高的优先级。除非将CSR中的GIE位复位,或将IER中的相应位置位使得硬件中断无效,否则其他中断不能抢先硬件中断。 软件中断的优先级低于硬件中断。软件中断分为14个可用的优先级。软件中断可以被高优先级的软件中断和任何硬件中断抢先。软件中断不能阻塞。 任务线程的优先级低于软件中断。任务线程分为15个优先级。任务线程可以被任何高优先级的线程抢先。当等待可用资源和低优先级的线程时,任务线程可以阻塞。 后台等待循环线程的优先级最低。它在CPU没有运行其他线程时循环执行。   让步和抢先 DSP/BIOS调度程序会运行具有最高优先级的准备就绪的线程,除非出现以下的情况:
  • 当前线程暂时禁止了某些或全部硬件中断(通过HWI_disable或HWI_enter),使得硬件中断服务子程序不能运行。
  • 当前线程暂时禁止了软件中断(通过SWI_disable),使得任何其他高优先级的软件中断不能抢先当前线程,但不能阻止硬件中断的抢先。
  • 当前线程暂时禁止了任务调度(通过TSK_disable),使得任何其他高优先级的任务线程不能抢先当前线程,但不能阻止硬件中断和软件中断的抢先。
  • 最高优先级的线程是一个被阻塞的任务线程,当任务线程调用TSK_sleep,LCK_pend,MBX_pend,SEM_pend就会出现这种情况。
硬件中断和软件中断都可以影响DSP/BIOS的任务调度程序。一个任务线程被阻塞常常是因为该线程等待的旗语不可用。HWI硬件中断,SWI软件中断以及其他任务线程都可以发送旗语。如果一个HWI硬件中断或SWI软件中断通过发送一个旗语开启了一个等待任务线程并且该线程优先级高于当前线程,处理器就会转移到该线程。 当运行一个HWI硬件中断或SWI软件中断时,DSP/BIOS2使用一个专用的系统中断堆栈,称为系统堆栈。每个任务使用各自所有的堆栈。因此,如果系统没有TSK任务线程,所以的线程将共享同一系统堆栈。因为DSP/BIOS为每个任务线程分配独立的堆栈,应用程序和任务的堆栈都可以更小。由于系统堆栈更小,用户就可以将其放到宝贵的快速存储器中。