数字信号处理器上多任务的实现的制作方法

文档序号:6567243阅读:171来源:国知局
专利名称:数字信号处理器上多任务的实现的制作方法
技术领域
本发明涉及按照权利要求1的在具有硬件栈的数字信号处理器
上实现多任务处理的方法、按照权利要求5的计算机程序产品、按照 权利要求6的计算机系统和按照权利要求7的数据载体。
背景技术
今天,多媒体应用越来越多地在具有包括多处理器的硬件环境 的消费产品中实现。作为这些多处理器的一部分,经常会使用一个或 多个数字信号处理器(DSP)来加快计算繁重任务的速度。传统上, DSP适合于执行一个单一程序。这对可以很容易地在一个单一程序中 描述的静态应用程序来说是够用的。不过,新的算法在行为上是动态 的,例如是与数据相关的,并且因此将应用程序开发成通信任务的图 表。任务必须易于设计和易于整合,以便实现足够高的设计产出率。
对于数据交换而言,任务通过用于任务间通信的专用函数彼此 通信。例如,这些函数可以提供从先入先出(FIFO)缓冲器读取数据 和向先入先出(FIFO)缓冲器写入数据的机制。为此,需要两种基本 种类的操作,a)同步和b)数据传递。同步操作检查是否在缓冲器 中分别有充足的数据或空间可用,并且检查在哪里可应用新的数据或 空间分别已经可用的信号。数据传递操作向缓冲器内移动数据/从缓 冲器向外移动数据。可以以多种不同的方式将这些操作组合成函数。
同步操作的语义可以具有不同的种类。主要地,分别检查数据 或空间的同步操作可以是逻辑阻断,直到数据或空间分别可用。不过, 对于处理器硬件的更好的利用来说,如果需要的数据或空间对于一个 任务不可用,则另一个任务应当得到执行的机会。这样,实现检查数 据或空间的可用性的同步操作的函数可以直接向该任务返回真/假 值。如果返回值为假,则需要进行任务切换。这称为非阻断同步。
第一种办法是,应用程序可以包括使用用于任务间通信的非阻 断同步的任务,该任务间通信在非阻断同步函数返回假值(即,发出 例如数据或空间分别不可用的信号)的情况下通过从该任务返回来将 控制权交还给任务调度程序。不过,对于具有与数据相关的通信行为 的任务来说,这将会导致复杂的代码结构,因为在下一次安排执行该 任务的时候必须要重新计算执行点。
按照第二种办法,使用阻断同步函数,代码结构得到了简化, 因为任务会逻辑上一直等待,直到同步函数调用返回。较为简单的代 码结构意味着,通过使用阻断同步,任务较为容易设计并且从而设计 产出率增高。现在的问题是如何实现阻断同步函数,因为当函数调用
阻断时,任务切换必须发生,以避免停顿以及实现对DSP的高效使用。 此外,实际的DSP并不支持任务切换。而且,实际的DSP通常包括硬 件栈,以降低函数调用的系统开销。不过,硬件栈(对于软件来说, 它是不可见的)的使用阻碍了基于阻断函数调用的受软件控制的任务 切换。这个问题将在下面更加详细地加以解释。
硬件栈用在执行例如将汇编指令集(AIS)共同地与汇编指令 G0SUB相对应的函数调用的时候。在所调用的函数的第一个指令开始 执行之前,将程序计数器(PC)的当前值推到硬件栈上。此外, 一旦 在处理器的各个堆栈寄存器段中沿着向上的方向建立了堆栈,硬件栈 指针就会据此递增。只有现在,将所调用函数的第一个指令的地址拷 贝到PC中并且能够取出所调用函数的代码并开始执行。在执行之后, 调用函数返回,这例如将AIS统一地与汇编指令RTS相对应。然后, 据此将堆栈指针减一,并且将函数调用之前程序计数器的值从硬件栈 中上托出来,即,拷贝到PC。随后,函数调用之后的调代码继续执 行。在因为所调用函数遭到阻断而进行任务切换的情况下,硬件栈的 内容可以在几个任务之间混杂。
下面,使用有两个任务A和B的实例情形来解释说明这一问题。 开始,假设正在执行任务A并且硬件栈是空的。由此,堆栈指针为0。 现在,任务A调用函数fl,这使得任务A的返回地址被推到硬件栈 的位置0上,并且堆栈指针递增到l。现在,由于某种原因,所调用
的函数fl阻断。然后,进行到任务B的任务切换,给任务B提供执 行的机会。在执行任务B期间,调用函数f2,这造成任务B的返回 地址被推到硬件栈的位置1上,并且由此,堆栈指针递增到2。由于 某种原因所调用的函数f2也遭到了阻断,因此,进行返回到任务A 的任务切换。现在假设函数fl不再阻断,并且因此得到执行。在执 行之后,函数fl返回,即,将堆栈位置2上的值拷贝到PC。不过, 堆栈位置2上的值是任务B的返回地址而不是任务A的。这明显是个 错误,因为函数fl是从任务A中调用的。
结果,已经表明任务切换并非与DSP的硬件栈无关。在通用处 理器中,所描述的问题并不存在,因为多个任务典型地是利用阻断函 数执行的并且没有硬件栈。不过,在DSP (通常具有硬件栈)中,任 务切换是有如上所述的问题的。

发明内容
因此,本发明的目的是提供一种能够实现任务切换而不会有硬 件栈的数据一致性问题的方法。具体来说,本发明的目的是提供数字 信号处理器(DSP)上的任务切换。
本发明的全部或特定目的是借助权利要求1中所述的方法解决 的。由此, 一种通过阻断同步函数在具有硬件栈的数字信号处理器上
实现多任务处理的方法,所述方法包括步骤存储第一个任务的各自 的返回地址并且转移到执行阻断函数的代码;确定对所述阻断函数的 阻断状况是否存在;在阻断状况的情况下,存储处理器的共享资源; 以及切换到至少第二个任务。
本发明的总体发明思想在于将阻断函数实现为它们并不利用硬 件栈。换句话说,用一段内嵌汇编代码改造各个函数调用,这段内嵌 汇编代码主要存储程序计数器并且跳转到执行所述函数的正确例程, 艮口,由于使用转移指令代替调用子例程,因此处理器不使用硬件栈。 现在,如果遇到阻断状况,有益地是能够完成任务切换,以继续进行 另一个任务。当在任务切换可能必须发生时没有使用硬件栈的时候, 前面介绍的由不同任务进行的函数调用中硬件栈的内容混杂问题通
过按照本发明的方法得到了克服。
通过此外还包括步骤在从所述至少第二个任务切换回来之后, 重新检查所述阻断状况,如果所述阻断状况依然存在,则切换到所述 至少第二个任务,有益地是本发明的方法借助包括所述任务切换和重
新检查的循环,在所述第一任务以及实现该方法的任何任务中提供了 自给的任务切换接口。如果所述第一任务仍然受到所述阻断函数的所 述阻断状况的阻断,则进行切换到另一个任务的另一次任务切换。如 果所述阻断状况不再存在,则恢复所述第一个任务的共享资源。然后, 转移到所述第一个任务的所述返回地址并且继续进行所述第一个任 务的执行。
如果在所述确定步骤中,确定了所述阻断状况不存在,则转移 到所述第一个任务的所述返回地址并且继续进行所述第一个任务的 执行。
在DSP中,有用于安排多个任务的调度程序。所述调度程序可
以管理多个任务,例如,借助就绪队列来进行管理。所述多个任务可 以彼此通信,即,通过用于任务间通信的专用函数来交换公共使用的 和/或处理的数据。这样,由所述多个任务构成的应用程序的效率可 以在运行在具有带有硬件栈的数字信号处理器的计算机系统上时,通 过所述多个任务之间的任务切换得到提高。
按照本发明的方法可以是包括代码构件的计算机程序产品的一 部分或者优选地用在包括代码构件的计算机程序产品中,该计算机产 品可以运行在具有带有对所述代码构件不可见的硬件栈的至少一个 处理器的计算机系统上。这样,按照本发明通过利用阻断函数的阻断 同步,可以在这样的计算机程序中轻松地使用任务切换。由此,本发 明可以用在具有处理器和存储器的计算机系统中,该处理器具有对运 行在所述计算机系统上的代码构件不可见的硬件栈,该处理器能够执 行存储在所述存储器中的代码构件。最后,仍然很重要,数据载体可 以包含这种代码构件,所述代码构件安排成在具有处理器的计算机系 统上运行时,使用按照本发明的方法,所述处理器具有对运行在所述 计算机系统上的代码构件不可见的硬件栈,从而所述计算机系统可以
借助多个任务之间的任务切换来处理所述多个任务。


结合附图考虑下面本发明的实施方式的详细介绍,本发明将会 得到更加完整的理解,其中
图l表示图解说明按照本发明的任务切换的实现方式的流程图。
具体实施例方式
按照本发明的优选实施方式,所发明的方法是借助几种类型的 代码段来实现的。虽然可以将本发明修改成各种不同的改造方案和其 它可供选用的形式,但是将要展示的是它的具体实例。不过,要注意, 为一般有效性起见,实施方式的解释说明使用的是伪代码。该实施方 式表明了如何按照本发明在正常使用硬件栈的处理器上实现多任务
处理,该硬件栈对于软件是不可见的,类似于DSP。虽然本发明利用 了几个代码段来实现阻断函数,但是应当理解,并非意在将本发明局 限于所介绍的特定实施方式。相反,我们意在覆盖所有落在由所附权 利要求定义的本发明的范围之内的改变方案、等价方案和其它可供选 用的方案。首先,应当注意,针对阻断函数给出的例子是检查数据可 用性的同步函数。
下面,将会介绍在DSP上实现本发明的代码段。首先,在当前 任务的代码"Current—task"中,使用内嵌汇编代码段代替针对这些 预定函数的函数调用,这些预定函数在阻断状况下可以阻断,可以造 成任务切换。这里将内嵌汇编代码称为类型A,或者简称为代码A: "Temp一pc 二 PC+2;
GOTO Check—data—available;
Continue;,,
代码a是一段内嵌汇编代码,借助这段代码来进行到各个函数 代码的转移,而不是调用该函数。这样,不用说,对于每种分别的预 定阻断函数,即,可以阻断并且在阻断时应该会进行到另一个任务的 切换的任何函数,都有单独的代码类型A。变量"Temp一pc"作为临时程序计数器使用,它的值(PC+2)指向"Continue"指令的位置并 且因此将用于跳回到主调代码,从而能够继续执行主调代码。就此而 言,值得指出的是,本发明人发现,在执行指令"Temp—pc = PC+2" 期间禁止中断是非常有益的。可以在设定变量"Te即一pc"之后再次 允许中断。指令"GOTO Check—data—available "是到名为 "Check—data—available,,的代码的跳转,"Check—data—available" 代码是(原本要调用的)函数的实际代码并且接下来将会对其详细解 释。
代码"Check—data_available"是执行按照现有技术应该已经 调用了的函数的代码。这里将"Check—data—available"称为类型B 的代码,或者简称为代码B:
"Check—data一available: If (enough tokens) GOTO Temp—pc;
Else
GOSUB Save—state; Current—task->return—point=Re—check—data—available; GOTO Task—switch;" 主要地,通过执行代码B,判断是否遇到了阻断状况。如果没有, 则通过跳回到"Temp—pc"所指向的位置继续执行,否则,通过调用 接下来将要解释的"SaVe_state"代码并将变量"Current_task -〉return一point" 设定成使得它指向各个 "Re—check—data—available"代码(稍后将会对此进行解释)来准 备任务切换。再次指出,对于每个不同的可能阻断函数,也有单独的 代码B,代码B可以发起到另一个任务的任务切换。
就代码"Save—state"而言,它用于将所有寄存器的状态保存 在存储器中。将代码"Save—state"称为类型C的代码,或者简称为 代码C:
"Save—state:
Save all registers in memory;Return;"
代码C是状态保存代码,它保存处理器共享资源的内容,作为 切换到另一个任务的准备过程的第一步骤,任务切换由下面的代码 "Task—switch"控制。
代码"Task—switch"为由预定阻断函数造成的停顿任务之间的 同步任务切换提供了一种类型的接口。将代码"Task—switch"称为 类型D的代码,或者简称为代码D: "Task—switch:
Current—task-〉parameters 二 parameters; Current—task = scheduler—get—next—task; Parameters = Current—task->parameters; GOTO Current—task-〉return—point;"
主要地,代码D是任务切换代码,该代码将控制权交给另一个 任务,例如由调度程序管理的就绪队列中的下一个任务。在任务切换 之前,将"Current—task"的实际参数存储为"Current—task -parameters"。要注意,这些参数还包括各个Temp—pc值。然后, 可以将"current_task"转换为另一个任务。从各个"Current—task -parameters "中恢复出另 一个任务的参数,即,新的"Current—task" 的参数。接着,进行跳转至'J各个"Current—task -〉return一point,, 的操作。如上所述,对于"Current一task",己经将变量"Current—task -〉ret訓—point"设定为"Re—check—data—available"的地址,接 下来将对此进行解释说明。
代码"Re_check—data—available"用于重新检查阻断函数的阻 断状况,即,在本实施方式中为函数"Check—data—available"。将 代码"Re—check—data—available"称为类型E的代码,或者简称为 代码E:
"Re—check—data—available: If (enough tokens)
GOSUB Restore—state; GOTO Temp—pc;
Else
GOTO Task—switch;,, 就是说,代码E是在发生了任务切换回来之后重新检查各个 "Current—task"的各个阻断函数的阻断状况的代码。主要地,它具 有与各个代码B相同的特点。如果阻断状况不再存在,则调用接下来 将要介绍的代码"Res t or e__s t at e "并且继续执行由跳转到"Temp—pc " 所指向的位置而发起的原始任务,即,类型A的代码中的"Continue" 指令。如果阻断条件仍然存在,则有返回代码D的跳转,艮P, "Task—switch",并且可以使另一个任务再次启用。这样,代码D 和E 二者构成了任务切换与重新检查各个"Current—task"中的阻断 原因之间的循环。
代码"Restore—state"用于从存储器中恢复所有寄存器的状态。 将代码"Restore—state"称为类型F的代码,或者简称为代码F: "Restore—state :
Restore all registers from memory; Return ;',
代码F是状态恢复代码,该代码恢复处理器共享资源的内容。 要注意,按照本发明的代码C、 D和F可以在所有预定阻断函数 之间共享,即,可以总体上是相同的。只有代码A、 B和E可以或多 或少地单独适用于各个阻断函数。
下面,将结合图1的流程图介绍前面讨论的代码A、 B、 C、 D、 E 和F的执行。当在"Current—task" Tl中执行代码A时,由程序计 数器PC的值设定的临时程序计数器"Te,_pc"递增2。然后,完成 到相应代码B的跳转。代码B的结果可以是a)没有遇到阻断状况, 这意味着图1中的YES;或者b)遇到了阻断状况,这意味着图l中 的N0。
在a)的情况下,完成返回到临时程序计数器"Te即—pc"所指 向的代码A的末尾的跳转,并且任务继续进行,即,执行原来调用的 函数。在b)的情况下,执行代码C并且将当前任务Tl的所有相关 值(即,处理器的共享资源)保存在存储器中。然后,完成到代码D
的跳转。代码D还存储与任务切换的原因相关的信息。值得指出的是, "Temp—pc,,的值也属于存储在变量"Current—task -〉parameters,, 中的参数。这之后,代码D从就绪列表中取出另一个任务T2并且使 其成为新的"Current—task"。在从另 一个任务T2或多个任务切换 回来之后,f^石马D瑕^转至U "Current—task —〉return point",这个 "Current—task -〉return point"是代码E并且在本实施方式中是 函数"re—check—data—available ,,,艮卩,是基于离开原始的 "Current—task" Tl到另一个任务T2的第一次任务切换的原因。
代码E执行与代码B类似的代码。同样有两种可能的结果,c) 阻断状况不再存在,这意味着图1中YES;或d)仍然存在阻断状况, 这意味着图1中的N0。在c)的情况下,调用类型F的代码,该代码 从存储器中恢复共享资源(即,处理器寄存器),并且随后进行回到 原始的"Current—task"中的原始代码A的末尾(即,由"Temp_pc" 的值代表的位置)的跳转。原始的"Current—task"能够得以继续进 行。在d)的情况下,针对另一次任务切换完成到代码D的跳转。在
这种情况下,不需要恢复共享资源,因为这些值己经被保存在变量 "Current_task -〉parameters" 中了。
本发明公开了在数字信号处理器上实现多任务处理的方法。为 了这个目的,将阻断函数安排成它们并不利用处理器的硬件栈。各个 函数调用由一段内嵌汇编代码取代,该段内嵌汇编代码取而代之地进 行向执行所述函数的正确例程的转移。如果遇到阻断函数的阻断状 况,则可以完成任务切换,以继续进行另一个任务。当在任务切换可 能必须发生时没有使用硬件栈的时候,避免了由不同任务进行的函数 调用之间的硬件栈的内容混杂。
总地来说,本发明的能够在具有硬件栈的数字信号处理器上实 现多任务处理的方法可一般性地应用于任何在函数调用的情况下利 用对软件不可见的硬件栈的处理器。通过实现按照本发明的方法,任 务切换在诸如DSP这样的处理器(例如,由Philips Semiconductors 出品的处理器Epics7b)上成为可能。仍然值得注意的是,为了确保 硬件栈在任务关闭的时候和在任务再次开启的时候具有相同的内容,
可以仅仅在任务的主函数中使用阻断调用。
权利要求
1.一种在具有硬件栈的数字信号处理器上实现多任务处理的方法,所述方法包括步骤-存储第一个任务的各自的返回地址并且转移到执行阻断函数的代码;-确定针对所述阻断函数的阻断状况是否存在;-如果确定了阻断状况,则存储处理器的共享资源;和-切换到至少第二个任务。
2. 按照权利要求1所述的方法,此外还包括步骤在从所述至 少第二个任务切换回来之后,重新检查所述阻断状况,如果所述阻断 状况依然存在,则切换到所述至少第二个任务。
3. 按照权利要求2所述的方法,此外还包括步骤如果所述阻 断状况不再存在,则恢复所述共享资源,转移到所述第一个任务的所 述返回地址,并且继续所述第一个任务的执行。
4. 按照权利要求1到3中任何一项所述的方法,在所述确定步 骤中此外还包括步骤如果所述阻断状况不存在,则转移到所述第一 个任务的所述返回地址并且继续所述第一个任务的执行。
5. —种包括代码构件的计算机程序产品,所述代码构件安排成 当在具有至少一个处理器的计算机系统上运行时,其使用按照权利要 求1到4之一的方法来阻断任务切换过程中阻断函数的同步,所述处 理器具有对所述代码构件不可见的硬件栈。
6. —种计算机系统,该计算机系统具有处理器和存储器,所述处理器具有对运行在所述计算机系统上的代码构件不可见的硬件栈, 所述处理器能够执行存储在所述存储器中的代码构件,其中所述代码构件包括多个任务并且安排成用于利用权利要求1到4之一的方法来 阻断所述多个任务中使用的阻断函数的同步。
7. —种包含代码构件的数据载体,所述代码构件安排成当在具 有处理器的计算机系统上运行时来使用按照权利要求1到4之一的方法,所述处理器具有对运行在所述计算机系统上的代码构件不可见的 硬件栈。
全文摘要
本发明涉及在数字信号处理器上实现多任务处理的实现方法。为了这个目的,将阻断函数安排成它们并不利用处理器的硬件栈。各个函数调用由一段内嵌汇编代码取代,该段内嵌汇编代码取而代之地进行向用于执行所述函数的正确例程的转移。如果遇到阻断函数的阻断状况,则可以完成任务切换,以继续进行另一个任务。当在任务切换可能必须发生时没有使用硬件栈的时候,避免了由不同任务进行的函数调用之间的硬件栈的内容混杂。
文档编号G06F9/42GK101176061SQ200680013495
公开日2008年5月7日 申请日期2006年4月7日 优先权日2005年4月22日
发明者托马斯·亨里克松 申请人:Nxp股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1