Tasks And Functions

大多数嵌入式和实时控制系统都是根据一个模型设计的,在这个模型中,中断处理程序和软件管理任务都被认为是在它们自己的“虚拟”微控制器上执行的。

该模型通常由实时执行器或实时操作系统(RTOs)的服务支持。在底层机器架构的特性和功能之上分层。在TriCoreM架构中,RTOS层可以非常“薄”,硬件可以有效地处理一个任务和另一个任务之间的切换。

同时,该体系结构允许所使用的任务模型具有相当大的灵活性。系统设计人员可以选择最适合其应用程序需求的实时执行和软件设计方法,而体系结构施加的约束相对较少。在TriCore体系结构中,低开销任务切换机制和函数调用机制是密切相关的。

一、上下文类型

        任务是一个独立的控制线程。任务的状态由其上下文定义。当一个任务被中断时,处理器使用该任务的上下文来重新启用该任务的继续执行。

上下文类型是:

              ·上层上下文:由上层地址寄存器A[10] ~ A[15]和上层数据寄存器D[8] ~ D[15]组成。上层环                                     境还包括PCXI和PSW。为了函数调用的目的,这些寄存器被指定为非易失                                     性(它们的内容在调用期间被保留)

                ·下层上下文:由下层地址寄存器A[2]到A[7],下数据寄存器D[0]到D[7], A[11](返回地址)                                      和PCXI组成。

上下文保存到内存时,占用16个字块,称为上下文保存区(CSA)


1、 上下文保存区

        该体系结构使用固定大小的上下文保存区域的链表。CSA是16个字的内存存储,按16个字的边界对齐。每个CSA只能包含一个上层或下层上下文。CSA通过链接字连接在一起。

链接字包括两个字段,它们将给定的CSA链接到链中的下一个CSA。字段是一个4位的段和一个16位的偏移量。段号和偏移量用于生成链路CSA的有效地址EA (Effective Address)。将指针偏移量增加1总是将EA增加到比前一个地址高16个字的地址。每个csa地址段的总可用范围为4MBytes,可为2^16个csa提供存储空间。

        如果正在使用CSA(例如,它保存挂起任务的上下上下文图像),则链接字还包含有关链接上下文的其他信息。整个链接字是关联任务的PCXI寄存器的副本。


二、任务切换操作

当下表中列出的事件或指令之一发生时,体系结构将切换任务。当遇到这些事件或指令之一时,将保存或恢复任务的上层或下层上下文。上层上下文作为外部中断、陷阱或函数调用的结果自动保存。下层上下文通过指令显式保存。

下表中,“Save”是从链接字中读取FCX的下一个值后,通过Free CSA列表头指针寄存器(FCX)进行存储。“Store”是通过指令的有效地址存储,不改变CSA列表或FCX寄存器。“Restore”是“Save”的反义词。“Load”是“Store”的反义词。

就如何维护其内容而言,在上层和下层上下文中对寄存器的处理有本质的区别。

下层上下文寄存器类似于全局寄存器,因为中断处理程序、陷阱处理程序或被调用的函数看到的值与中断、陷阱或调用之前寄存器中出现的值相同。在中断、陷阱处理程序或被调用函数中对这些寄存器所做的任何更改,在事件返回后仍然存在,因为它们不会作为调用返回(RET)或异常返回(RFE)语义的一部分自动恢复。这意味着下层上下文寄存器可以用来向被调用的函数传递参数,并从这些函数传递返回值。这也意味着中断和陷阱处理程序必须在使用寄存器之前保存它们在这些寄存器中找到的原始值,并在退出之前恢复原始值。

上层上下文寄存器不能保证是静态硬件寄存器。从概念上讲,函数调用或中断处理程序总是从它自己的私有上层上下文寄存器集开始执行。中断函数或调用函数的上层上下文寄存器不被继承。只有A[10](SP), A[11](RA), PSW, PCXI和(在陷阱的情况下)D[15]寄存器从被调用函数,陷阱处理程序或中断处理程序中的体系结构定义的值开始。一个函数、陷阱处理程序或中断处理程序在将值写入任何其他上层上下文寄存器之前,正在执行未定义的操作。

                                                               相关事件和指令

    
三、CSA和上下文链表

        上下上下文保存在CSA (Context Save Areas)中。未使用的CSA 在Free Context List (FCX)中链接在一起。包含已保存的上层或下层上下文的CSA 在前一个上下文列表(PCX)中链接在一起。下图显示了两个上下文列表中CSA 的简单配置。

                                                        上下文列表中的CSA

FCX寄存器的内容总是指向空闲上下文列表中可用的CSA。CSA链接字指向空闲上下文列表中下一个可用的CSA。在将上层或下层上下文保存到第一个可用的CSA之前,读取它的Link Word,为FCX提供一个新值。因此,对于内存子系统,上下文保存是一个读/修改/写操作。FCX的新值指向下一个可用的CSA,可立即用于后续的上层或下层上下文保存。LCX寄存器指向空闲列表中最后一个CSA,用于识别即将耗尽的空闲CSA列表。

如果FCX的值与LCX的值相匹配,则在执行上下文保存操作时,操作完成,并在下一条指令中使用空闲的CSA列表耗尽陷阱(FCD),也就是说,FCD陷阱的返回地址是陷阱/中断/被调用例程的第一条指令,或者是SVLCX或BISR指令之后的指令。

陷阱处理程序所采取的操作取决于软件实现。例如,如果确定CSA列表耗尽是由不可恢复的软件错误造成的,它可能会发出系统重置。但是,通常情况下,它通过分配额外内存或终止一个或多个任务并回收它们的CSA调用链来扩展空闲列表。在这些情况下,陷阱处理程序使用RFE指令退出。

在第一次使用空闲上下文列表中的最后一个CSA中的链接字之前,必须将其设置为空。这是支持FCU trap所必需的。在首次使用CSA之前,PCX指针的值应该为空。这是为了支持CSU(调用堆栈下溢)陷阱。PCXI.PCX字段指向保存前一个上下文的CSA。PCXI.UL位标识保存的上下文是高(PCXI.UL=1)还是低(PCXI.UL==0)。如果类型与执行上下文恢复操作时期望的类型不匹配,则会发生CYTP异常并产生上下文管理trap。

上下文保存操作完成后,返回地址A[11](RA)被更新:

                    对于调用,使用函数返回地址更新a [11](RA)。

                    对于同步陷阱,a [11](RA)用触发陷阱的指令所在的PC进行更新。

                    对于SYSCALL和异步陷阱或中断,a [11](RA)用要执行的下一条指令所在的PC更新。

当执行较低的上下文保存操作时,A[11](RA)的值将包含在保存的上下文中,并放在CSA的第二个字中。该[11](RA)通过较低的上下文恢复相应地得到恢复。呼叫深度控制域(PSW.CDC)由两个子域组成;一个调用深度计数器,以及一个掩码,用于确定计数器的宽度以及何时溢出。调用深度计数器在调用时递增,在返回时恢复到之前的值。当计数器溢出时发生异常。它的目的是防止软件错误导致“失控递归”并耗尽CSA空闲列表。

 
四、带中断和陷进的上下文切换

当中断或陷阱(例如NMI或SYSTRAP)发生时,处理器将当前任务的上层上下文保存在内存中,暂停当前任务的执行,然后开始执行中断或陷阱处理程序。

当发生中断或陷阱时,如果处理器没有使用中断堆栈(PSW.IS位==0),堆栈指针就会加载ISP(中断堆栈指针)的当前内容。PSW.IS位设置为1,表示从中断堆栈执行。中断控制寄存器(ICR)保存当前CPU优先级号(ICR. CCPN),中断使能位(ICR. IE)和挂起中断优先级号(ICR. PIPN)。这些字段,连同前一个CPU优先级数(PCXI.PCPN)和前一个中断使能(PCXI.PIE)都是中断管理系统的一部分。

ICR.CCPN通常仅在中断服务例程(ISR)中是非零的,用于安排中断服务。它保存在一个与PSW分开的寄存器中,并且不是RTOS处理软件管理任务(SMT)之间切换的上下文的一部分。PCXI.PIE通常只在ISR内启动的Trap处理程序中为零,例如在外围服务请求期间发生的NMI或SYSTRAP。

无论是中断还是trap,当前PCXI中已有的PCPN和PIE值都保存在上层上下文的CSA中,而ICR中已有的IE和CCPN值则复制到PCXI中。PIE和PCXI.PCPN字段。一旦中断或陷阱被处理,如果需要,保存的较低上下文将被重新加载,被中断任务的执行将被恢复(RFE)。

在中断或陷阱中,当前任务上下文的上层上下文由硬件作为中断或陷阱序列的显式部分保存。对于可以完全在保存在中断上的这组寄存器内执行的小型中断和陷阱处理程序,不需要进一步保存上下文。处理程序可以立即执行并返回。通常,调用或需要更多寄存器的处理程序执行BISR(开始中断服务程序)或SVLCX(保存较低上下文)指令来保存未作为中断或陷阱序列的一部分保存的较低上下文寄存器。该指令必须在任何相关寄存器被修改之前发出,但它不必是处理程序中的第一条指令。

具有临界响应时间要求的中断处理程序可以使用上层上下文寄存器立即执行其初始的、时间关键的处理。之后,他们可以执行BISR并继续进行时间要求较低的处理。BISR重新启用中断,因此它的用途是将时间关键的处理与时间不那么关键的处理分开。陷阱处理程序通常没有关键的响应时间要求,但是那些可能发生在ISR中或可能使中断延迟太长时间的处理程序也可以采用类似的方法来区分不可中断和可中断的执行段。

  
五、函数调用的上下文切换

         当进行函数调用(执行call指令)时,必须保存并恢复调用例程的上下文,以便在从函数返回后恢复调用者的执行。在函数调用时,整个上层上下文寄存器集由硬件保存(自动保存)。此外,CALL指令对上层上下文的保存与调用跳转同时进行。此外,恢复上层上下文由RET(返回)指令执行,并与返回跳转并行进行。被调用的函数不需要保存和恢复调用者的上下文,并且不需要限制其对上层上下文寄存器的使用。调用和被调用的函数必须协作使用下层上下文寄存器。


六、带FCALL/FRET指令的快速函数调用

        在不需要保存和恢复上层上下文寄存器的情况下,可以优先使用FCALL指令而不是CALL指令。FCALL指令执行调用跳转,并且并行地将当前返回地址A[11]保存到堆栈中。没有保存其他状态。因此,被调用的函数在与调用方相同的上下文中开始执行(A[10]和A[11]除外)。为了从FCALL调用的函数中返回,需要执行一条FRET指令。这将执行跳转到当前返回地址[A11],并从堆栈中加载之前的A[11]。没有加载其他状态。因此,调用函数使用被调用函数修改过的上下文继续执行。调用函数和被调用函数必须在所有寄存器的使用上合作。

  
七、上下文保存和恢复举例

本节提供上下文保存操作的示例和上下文恢复操作的示例。

  
1、Context Save 

下图显示了此示例的空闲和先前上下文列表。空闲上下文列表(FCX)包含三个空闲CSA(3、4和5),前一个上下文列表(PCX)包含两个CSA(2和1)。

FCX 指向 CSA3,这是第一个可用的 CSA。CSA3 的链接字指向 CSA4,CSA4 的链接词指向CSA5。

PCX指向上一个上下文列表中最近保存的CSA。CSA2的Link Word指向CSA1。CSA1包含在CSA2之前保存的上下文。当执行上下文保存操作时,将取出空闲上下文列表(CSA3)中的第一个CSA,并将其放在前一个上下文列表的前面。

                                        上下文保存之前的csa和处理器状态

下图显示了在上下文保存操作期间所采取的步骤。图中的数字对应图后列出的步骤。

                                        上下文保存进程的CSA和处理器SFR更新

1. CSA3中链接词的内容被加载到NEW_FCX中。NEW_FCX现在指向CSA4。NEW_FCX是一个内部缓冲区,不能被用户访问。

2. PCX的内容被写入CSA3的Link Word中。CSA3的链接词现在指向CSA2。

3.FCX的内容写入PCX。PCX现在指向CSA3,它位于前一个上下文列表的前面。

4. NEW_FCX被加载到FCX中。

处理器SFR和CSA如图所示。要保存的处理器上下文现在被写入CSA3的其余部分。

  
2、Context Restore   

下图中的示例显示了包含三个CSA(3、2和1)的前一个上下文列表(PCX)和包含两个CSA(4和5)的空闲上下文列表(FCX)。FCX指向CSA4,这是空闲上下文列表中第一个可用的CSA。PCX指向CSA3,即上一个上下文列表中最近保存的CSA。CSA3 的链接字指向 CSA2,CSA2 的 Link Word 指向 CSA1,CSA4 的链接字指向 CSA5。

                                                上下文恢复前的csa和处理器状态

 当执行上下文恢复操作时,将取消前一个上下文列表(CSA3)中的第一个CSA,并将其放在空闲上下文列表的前面。下图显示了上下文恢复操作期间采取的步骤。

图中数字对应的步骤如下:

1. CSA3中链接字的内容被加载到NEW_PCX中。NEW_PCX现在指向CSA2。NEW_PCX是一个内部缓冲区,用户不能访问。

2. FCX的内容被写入CSA3的Link Word中。CSA3的链接词现在指向CSA4。

3.PCX的内容被写入FCX。FCX现在指向CSA3,它位于空闲上下文列表的前面。

4. NEW_PCX被加载到PCX中。

然后将恢复的上下文写入上层或下层上下文寄存器。


八、上下文管理寄存器

三个上下文管理寄存器是在上下文保存和恢复操作期间使用的指针。

                FCX:空闲CSA列表头指针

                PCX:上一个上下文指针

                LCX:空闲CSA列表限制指针

每个指针由两个字段组成:

                A16-bit偏移量

                一个4位段说明符

          下表显示了如何使用这两个字段生成上下文保存区域(Context Save Area, CSA)的有效地址。上下文保存区域是包含16个位置(64字节)的地址范围,是保存一个上下上下文所需的空间。将指针偏移量增加1总是将有效地址(EA)增加到比前一个地址高16个字的地址。CSA的每个地址段的总可用范围为4Mbytes,因此CSA的存储空间为64Kbyte。


1、Registers 

空闲CSA表头指针寄存器(FCX)

空闲的CSA列表头指针(FCX)寄存器保存空闲的CSA列表头指针。这总是指向一个可用的CSA。

前一个上下文指针寄存器(PCX)

前一个上下文指针(PCX)保存前一个任务的CSA的地址。PCX是PCXI寄存器的一部分。

  
2、 Free CSA List Limit Pointer Register (LCX) 

空闲CSA列表限制指针(LCX)寄存器用于识别即将耗尽的空闲CSA列表。如果发生上下文保存操作,并且FCX的值与LCX匹配,则识别出“自由上下文耗尽”条件,该条件在操作完成后立即触发FCD陷阱,导致上下文保存;也就是说,FCD陷阱的返回地址是陷阱/中断/调用例程的第一条指令,或者是SVLCX或BISR指令之后的指令。

  
九、访问CSA内存位置

 实现可以在内部缓冲上下文信息以提高性能。为了确保内存一致性,必须在访问活动CSA内存位置之前执行DSYNC指令。DSYNC指令强制将所有内部缓冲的CSA寄存器状态写入内存。

 
十、上下文保存区放置  

保存区域(csa)可能不会被放置在具有外设空间属性的内存段中,或者在经历地址转换的内存区域中(如果MMU存在并启用)。

注意:单独的TriCore实现可能会对CSA的放置施加额外的限制。这些限制将在特定TriCore产品附带的文档中详细说明。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值