十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【TriCore OS】Part1_CSA基础

【TriCore OS】Part1_CSA基础 文章目录1. Tricore内核架构里 上下文的概念1.1 Task和Functions1.1.1 Context类型1.1.2 Context Save Area(CSA)1.2 Task切换操作1.3 Context Save Areas (CSAs)和Context Lists1.4 Interrupts和Traps上下文切换1.5 Function调用的上下文切换1.6 Fast Function调用的FCALL/FRET1.7 上下文保存和恢复示例1.7.1 上下文保存1.7.2 上下文恢复2. 寄存器2.1 SYSCON2.2 PCXI2.3 FCX2.4 LCX2.5 PSW3. 指令3.1 SVLCX3.2 RSLCX3.3 RFE3.4 MTCR3.5 MFCR3.6 ISYNC3.7 DSYNC3.8 SYSCALL1. Tricore内核架构里 上下文的概念1.1 Task和Functions大多数嵌入式与实时控制系统的设计都遵循这样一种模型中断处理程序与软件管理任务各自被视作运行在独立的 “虚拟” 微控制器之上。该模型通常由实时执行内核或实时操作系统RTOS提供服务支持RTOS 构建于底层硬件架构的各项功能与能力之上。在 TriCore™架构中RTOS 层可以做到非常 “轻量化”硬件能够高效完成大部分任务间切换工作。与此同时该架构对所采用的任务模型具备很高的灵活性。系统设计人员可以选择最适配自身应用需求的实时执行内核以及软件设计方案架构本身带来的约束相对较少。TriCore 架构内部低开销任务切换机制与函数调用机制二者联系紧密。1.1.1 Context类型Task是独立的控制线程。Task的状态由其上下文决定。当Task被中断时处理器利用该Task的上下文使Task能够继续执行。上下文分为如下类型上上下文Upper context包含高地址寄存器 A [10]A [15] 以及高数据寄存器 D [8]D [15]。Upper Context还包含 PCXI 和 PSW 寄存器。在函数调用规范中这些寄存器被定义为非易失寄存器函数调用期间其内容保持不变。下上下文Lower context包含低地址寄存器 A [2]A [7]、低数据寄存器 D [0]D [7]、A [11]返回地址以及 PCXI。上下文保存至内存时占用 16 个字的存储块该存储块称为上下文保存区Context Save AreasCSAs。1.1.2 Context Save Area(CSA)该架构使用固定大小的上下文保存区CSA链表。一个 CSA 占用 16 个字的内存存储空间按 16 字边界对齐。每个 CSA 恰好可以存放一个Upper Context或者一个Lower Context。CSA 通过链接字Link Word串联在一起。链接字包含两个字段用于将当前 CSA 链接到链表中的下一个 CSA这两个字段分别为 4 位段号与 16 位偏移量。通过段号和偏移量可以计算出被链接 CSA 的有效地址EA参见图 13。将指针偏移值加 1有效地址 EA 的结果总是在上一个地址基础上增加 16 个字。每个地址段中 CSA 的可用总范围为 4MB可提供 2¹⁶个 CSA 的存储空间。如果该 CSA 正在被使用例如其中保存了挂起任务的上部或下部上下文镜像则链接字还包含该链接上下文的其他相关信息。整个链接字是对应任务的 PCXI 寄存器的一份副本。1.2 Task切换操作当表 7 所列的事件或指令发生时本架构会执行Task切换。当触发这类事件或指令时Task的Upper Context或Lower Context将被保存或恢复。外部中断、陷阱或者函数调用会自动保存Upper ContextLower Context则通过指令显式保存。在表 7 中Save保存从链接字读取 FCX 的下一个值之后通过空闲 CSA 链表头指针寄存器FCX完成存储操作。Store存放基于指令给出的有效地址执行存储不会修改 CSA 链表也不会修改 FCX 寄存器。Restore恢复与 “Save保存” 操作互为逆操作。Load加载与 “Store存放” 操作互为逆操作。Upper Context与Lower Context寄存器在内容维护机制上存在本质区别。Lower Context寄存器的行为类似于全局寄存器中断处理程序、陷阱处理程序或是被调用函数读取到的寄存器值就是中断、陷阱或者函数调用发生前一刻寄存器内的原有数值。在中断服务程序、陷阱处理程序或被调用函数内部对这些寄存器做出的任何修改在事件返回之后仍然会保留因为执行函数返回RET或异常返回RFE时硬件不会自动恢复这些寄存器。这就意味着Lower Context寄存器可用于向被调用函数传递入参也可以用来返回函数输出值。同时也说明中断与陷阱处理程序在使用这些寄存器之前必须先保存寄存器原始值退出前再将原始值恢复。Upper Context寄存器并不能视作固定不变的硬件寄存器。从概念上讲函数调用、中断处理程序开始运行时会获得一套属于自身私有的Upper Context寄存器并不会继承被中断函数或者调用方函数的Upper Context寄存器。只有 A [10]栈指针 SP、A [11]返回地址 RA、PSW、PCXI陷阱场景下额外包含 D [15] 寄存器在被调用函数、陷阱处理程序、中断处理程序启动时具备架构规定的确定初值。如果函数、陷阱处理程序或者中断处理程序在未对其余Upper Context寄存器执行写操作之前就读取该寄存器该行为属于未定义操作。1.3 Context Save Areas (CSAs)和Context ListsUpper Context与Lower Context均保存在Context Save AreasCSAs中。未使用的 CSA 通过空闲上下文链表FCX链接在一起。保存了Upper或Lower Context的 CSA 通过前上下文链表PCX链接在一起。下图图 14展示了这两条上下文链表中 CSA 的一种简单配置。FCX 寄存器的内容始终指向空闲上下文链表中的一个可用 CSA。该 CSA 的链接字指向空闲上下文链表中的下一个可用 CSA。在将Upper或Lower Context保存到首个可用 CSA 之前会读取该 CSA 的链接字以此为 FCX 提供新的取值。因此对于内存子系统而言上下文保存是一次读‑修改‑写操作。指向下一可用 CSA 的 FCX 新值可立即用于后续的Upper / Lower Context保存操作。LCX 寄存器指向空闲链表末尾的 CSA 之一用于检测空闲 CSA 链表即将耗尽的情况。当尝试执行上下文保存操作时如果 FCX 的值与 LCX 相等则本次操作执行完成并会在下一条指令触发空闲 CSA 链表耗尽陷阱FCD即 FCD 陷阱的返回地址为陷阱 / 中断 / 被调用例程的第一条指令或是 SVLCX、BISR 指令的后续指令。陷阱处理程序执行的动作取决于软件实现。例如如果判定 CSA 链表耗尽源于不可恢复的软件错误处理程序可以执行系统复位。但通常情况下陷阱处理程序会扩展空闲链表可以分配额外内存或是终止一个或多个任务并回收其 CSA 调用链。上述场景下陷阱处理程序通过 RFE 指令退出。空闲上下文链表中最后一个 CSA 的链接字在首次使用前必须置为空。该设置是为了支持 FCU 陷阱。CSA 首次使用前PCX 指针值应当为空用于支持调用栈下溢CSU陷阱。PCXI 寄存器的 PCX 字段指向保存了前驱上下文的 CSA。PCXI.UL 位用于标识所保存上下文的类型为 1 代表Upper Context为 0 代表Lower Context。执行上下文恢复操作时如果上下文类型与预期类型不匹配则触发CYTP 异常并进入上下文管理陷阱。完成上下文保存操作后返回地址寄存器 A [11]RA会被更新函数调用场景A [11]RA更新为函数返回地址。同步陷阱场景A [11]RA更新为触发该陷阱指令的程序计数器 PC。SYSCALL 系统调用、异步陷阱或中断场景A [11]RA更新为待执行的下一条指令的 PC。执行Lower Context保存操作时A [11]RA的值会被纳入待保存上下文存放于 CSA 的第二个字。执行Lower Context恢复操作时会对应恢复该 A [11]RA的值。调用深度控制字段PSW.CDC包含两个子字段调用深度计数器以及掩码掩码决定计数器位宽与溢出触发条件。调用深度计数器在函数调用时自增函数返回时恢复为之前的数值。计数器溢出时会触发异常。该机制用于防范软件错误引发的失控递归避免空闲 CSA 链表被耗尽。1.4 Interrupts和Traps上下文切换当发生中断或陷阱例如 NMI 或 SYSTRAP时处理器会将当前任务的Upper Context保存至内存挂起当前Task的执行随后开始执行中断或陷阱处理程序。若响应中断或陷阱时处理器并未使用中断栈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 一般仅在中断服务程序内部触发的陷阱处理程序中为 0例如外设服务请求期间发生 NMI 或 SYSTRAP。对于中断和陷阱当前 PCXI 中已有的 PCPN 与 PIE 值会保存到Upper Context对应的 CSA 中同时 ICR 内现有的 IE 与 CCPN 值会复制到 PCXI.PIE 与 PCXI.PCPN 字段。中断或陷阱处理完成后必要时会重新加载保存的Lower Context恢复被中断任务的执行RFE 指令。发生中断或陷阱时硬件会把当前任务的Upper Context作为中断 / 陷阱处理流程的固有环节自动保存。对于短小的中断、陷阱处理程序若全部操作仅使用本次中断所保存的这组寄存器则无需额外保存上下文处理程序可直接执行并返回。如果处理程序需要调用函数或是需要更多寄存器资源则通常会执行 BISR开启中断服务例程或者 SVLCX保存下部上下文指令用于保存中断 / 陷阱流程没有自动保存的Lower Context寄存器。该指令必须在修改对应寄存器之前执行但不必是处理程序的第一条指令。具备关键响应时间要求的中断处理程序可以直接使用Upper Context寄存器完成对时间严苛的初始处理。完成这部分工作之后再执行 BISR 指令继续处理时间要求相对宽松的业务逻辑。BISR 指令会重新使能中断借此将高实时性处理逻辑与低实时性处理逻辑分离开。陷阱处理程序通常没有严苛的响应时间要求但对于那些会在中断服务程序内部触发、或是会长时间阻塞中断的陷阱处理程序也可以采用类似方式划分出不可中断执行段与可中断执行段。1.5 Function调用的上下文切换当执行函数调用执行 CALL 指令时调用例程的上下文必须被保存并在函数返回后恢复以便继续执行调用方代码。进行函数调用时硬件会保存一整套Upper Context寄存器。并且CALL 指令保存Upper Context的操作与调用跳转并行执行。与之对应RET返回指令完成Upper Context的恢复该恢复操作同样与返回跳转并行执行。被调用函数无需保存和恢复调用方的上下文也不用对Upper Context寄存器的使用做任何限制。而对于Lower Context寄存器调用方与被调用函数需要配合使用。1.6 Fast Function调用的FCALL/FRET在不需要保存与恢复Upper Context寄存器的场景下可以优先使用 FCALL 指令而非 CALL 指令。FCALL 指令执行调用跳转同时并行将当前返回地址A11保存到栈中其余状态均不保存。因此被调用函数启动执行时与调用方共用同一套上下文A10、A11 寄存器除外。从 FCALL 调用的函数返回时需要执行 FRET 指令。该指令跳转到当前返回地址A11并从栈中恢复之前的 A11 寄存器值不会加载其他状态。所以调用方恢复运行后其上下文会保留被调用函数造成的修改。调用方与被调用函数必须对全部寄存器的使用做配合约定。1.7 上下文保存和恢复示例本节给出一个上下文保存操作示例以及一个上下文恢复操作示例。1.7.1 上下文保存图 15 展示了本示例中的空闲上下文链表与前驱上下文链表。空闲上下文链表FCX包含 3 个空闲 CSA3、4、5前上下文链表PCX包含 2 个 CSA2、1。FCX 指向第一个可用 CSA即 CSA3。CSA3 的链接字指向 CSA4CSA4 的链接字指向 CSA5。PCX 指向前驱上下文链表中最新保存的 CSA。CSA2 的链接字指向 CSA1。CSA1 存放 CSA2 之前保存的上下文。执行上下文保存操作时取出空闲上下文链表的首个 CSACSA3并将其挂载到前驱上下文链表的表头位置。图 16 展示了上下文保存操作的执行步骤。图中的编号与图后列出的步骤一一对应。将 CSA3 内链接字的内容加载至 NEW_FCX。此时 NEW_FCX 指向 CSA4。NEW_FCX 为内部缓冲用户无法访问。将 PCX 的内容写入 CSA3 的链接字。CSA3 的链接字此时指向 CSA2。将 FCX 的内容写入 PCX。PCX 现在指向 CSA3CSA3 成为前驱上下文链表的表头节点。将 NEW_FCX 加载到 FCX 寄存器。处理器特殊功能寄存器 (SFR) 与 CSA 的状态如图 17 所示。待保存的处理器上下文随后写入 CSA3 的剩余存储空间。1.7.2 上下文恢复图 18 中的示例展示前驱上下文链表PCX包含 3 个 CSA3、2、1空闲上下文链表FCX包含 2 个 CSA4、5。FCX 指向空闲上下文链表中的第一个可用 CSA即 CSA4。PCX 指向前驱上下文链表中最新保存的 CSA即 CSA3。CSA3 的链接字指向 CSA2CSA2 的链接字指向 CSA1CSA4 的链接字指向 CSA5。执行上下文恢复操作时取出前上下文链表的首个 CSACSA3并将其挂载到空闲上下文链表的表头位置。图 19 展示了上下文恢复操作的执行步骤。图中的编号与下述步骤一一对应将 CSA3 内链接字的内容加载至 NEW_PCX。此时 NEW_PCX 指向 CSA2。NEW_PCX 为内部缓冲用户无法访问。将 FCX 的内容写入 CSA3 的链接字。CSA3 的链接字此时指向 CSA4。将 PCX 的内容写入 FCX。FCX 现在指向 CSA3CSA3 成为空闲上下文链表的表头节点。将 NEW_PCX 加载到 PCX 寄存器。此时处理器特殊功能寄存器SFR与上下文保存区CSA的状态如图 20 所示。随后将已恢复的上下文写入上部或下部上下文寄存器。2. 寄存器2.1 SYSCONBHALT(Bit:23)内核冻结/释放标志上电时只有主核BHALT0其他核的BHALT1TPROT(Bit:19)1-开启CPU时间保护监控(ASIL-D功能安全必备)超时触发Trap/复位。MPEN(Bit:18)1-开启MPU内存保护Autosar OS内存保护依赖此位开启后User0/User1人无禁止直接MFCR/MTCR指令U1_IO(Bit:17)0-User1模式不能直接访问外设必须SYSCAL1-User1外设可以访问外设无需且管理员模式U1_IED(Bit:16)0-User1禁止执行ENABLE/DISABLE修改ICR.IE全局中断控制寄存器操作中断会触发Trap6TS(Bit:15)1-Trap进入后自动切Supervisor模式0-Trap保持原权限IS(Bit:14)1-中断响应时自动切Supervisor模式0-中断响应保持原权限ESDIS(Bit:10)安全相关1-关闭内核紧急停机功能FCDSF(Bit:1)FCD (Free Context List Depleted) trap发生置1上下文切换崩溃预警2.2 PCXI名称Bit位内容PCXO0:15CSA内存偏移PCXS16:19CSA内存段号UL20Upper Context/Lower Context 标志1Upper Context, 0Lower ContextPIE21Previous Interrupt Enable前一次中断使能状态PCPN22:29Previous CPU Priority Number前一次中断优先级2.3 FCX名称Bit位内容PCXO0:15CSA内存偏移PCXS16:19CSA内存段号2.4 LCX名称Bit位内容PCXO0:15CSA内存偏移PCXS16:19CSA内存段号2.5 PSW名称Bit位内容CDC0:6调用深度计数器(函数嵌套层数硬件自增/自减)CDC 溢出触发 CDO Trap防止无限递归耗尽 CSACDE7调用深度计数器使能GW8全局地址寄存器(A0/A1/A8/A9)写使能IS9中断栈标记位IS0当前使用任务私有栈 (A10SP)发生中断时硬件自动切到 ISP 中断栈IS1当前已经在全局中断栈中断嵌套不切换栈IO10:11IO权限模式00-User0,禁止访问外设、禁止操作中断寄存器、禁止MFCR/MTCR01-User1可访问普通外设能否操作中断寄存器由SYSCON.U1_IED控制、禁止MFCR/MTCR10-Supervisor模式特权模式11-预留S14安全任务标记位ASIL-D 锁步区分安全任务PRS[1:0]12:13内存保护寄存器组低 2bit共 3bit 选 0~7 组保护配置PRS[2]15内存保护寄存器组选择 Bit2SAV (Sticky AV)27黏性高级溢出标志AV (Adv Overflow)28MAC/DSP 高级运算溢出SV (Sticky Overflow)29黏性溢出溢出后置 1软件清零V (Overflow)30有符号算术溢出标志C (Carry)31无符号运算进位 / 借位标志3. 指令3.1 SVLCXSVLCXSave Lower Context汇编指令仅Supervisor管理员模式可执行作用把下上下文(Lower Context)存入空闲的CSA内存块并自动更新FCX/PCXI上下文链表指针esmp;esmp;执行SVLCX时硬件一次性存入CSA地址寄存器A2-A7数据寄存器D0-D7返回地址A11上下文链接字PCXI3.2 RSLCX和SVLCX对应。3.3 RFEReturn From Exception从 Upper Context 恢复 PCXI/PSW/PC/SP并回收 Upper CSA3.4 MTCR写核心寄存器3.5 MFCR读核心寄存器3.6 ISYNC指令同步3.7 DSYNC数据同步3.8 SYSCALL触发系统调用 trap
返回列表