CLA主要特点:
一、任务与优先级
- CLA 程序代码最多可包含 8 个任务或中断服务程序,其中任务 1 优先级最高,任务 8 优先级最低;
- 同一时间仅处理一个任务,直至其执行完成,不支持任务嵌套;
- 一个任务执行完毕后,下一个优先级最高的挂起任务将自动启动;
二、CLA 配置与调试
- CLA 初始化 :主 CPU 完成,包括拷贝 CLA 代码、初始化数据 RAM、配置寄存器、初始化 PIE 向量表等步骤,需注意中断触发和外设初始化顺序。
- CLA 代码调试
- 断点支持:插入 MDEBUGSTOP 指令设断点,使能断点后启动任务,任务执行到断点 CLA 暂停,流水线冻结。
- 单步执行:单步行为与 C28x 不同,可运行到下断点或任务结束,遇特殊情况有不同处理方式。
- 禁用断点:在 IDE 中断开 CLA 核心连接可禁用,操作前需运行或复位。
Type-1 型控制律加速器(CLA) 是一款独立的、全可编程的 32 位浮点数学处理器,为 C28x 系列芯片实现了控制环路的并行执行。CLA 具备低中断延迟特性,可对 ADC 采样数据进行即时读取,大幅缩短从 ADC 采样到输出的延迟,从而实现更快的系统响应和更高兆赫兹级的控制环路。将对时延敏感的控制环路交由 CLA 处理后,主 CPU 可释放资源,执行通信、诊断等其他系统任务。本章将概述控制律加速器的架构结构与核心组件。
6.1 概述
控制律加速器(CLA)通过新增并行处理能力,拓展了 C28x CPU 的功能。由 CLA 处理的时间关键型控制环路,可实现从 ADC 采样到输出的低延迟,进而使系统响应更快、控制环路的运行频率更高。将时间关键型任务交由 CLA 处理,能释放主 CPU 资源,使其可并行执行其他系统功能与通信功能。
6.1.1 特性
控制律加速器(CLA)的主要特性如下:
- 提供 C 语言编译器,支持 CLA 软件开发;
- 工作时钟与主 CPU 一致(为系统时钟输出 SYSCLKOUT);
- 采用独立架构,CLA 算法的执行可独立于主 C28x CPU:
- 具备完整的总线架构:
- 程序地址总线(PAB)、程序数据总线(PDB);
- 数据读地址总线(DRAB)、数据读数据总线(DRDB)、数据写地址总线(DWAB)、数据写数据总线(DWDB);
- 拥有独立的八级流水线;
- 配备 16 位程序计数器(MPC);
- 配备 4 个 32 位结果寄存器(MR0~MR3);
- 配备 2 个 16 位辅助寄存器(MAR0、MAR1);
- 配备状态寄存器(MSTF);
- 具备完整的总线架构:
- 指令集包含以下类型:
- IEEE 单精度(32 位)浮点数学运算指令;
- 可并行执行加载 / 存储操作的浮点数学运算指令;
- 可并行执行加 / 减操作的浮点乘法运算指令;
- 倒数(1/X)和平方根倒数(1/√X)估算指令;
- 数据类型转换指令;
- 条件分支与调用指令;
- 数据加载 / 存储操作指令;
- CLA 程序代码最多可包含 8 个任务或中断服务程序:
- 每个任务的起始地址由 MVECT 寄存器指定;
- 只要任务能放入可配置的 CLA 程序存储空间,任务大小无限制;
- 同一时间仅处理一个任务,直至其执行完成,不支持任务嵌套;
- 任务执行完成后,会在外设中断扩展模块(PIE)中置位该任务对应的中断标志;
- 一个任务执行完毕后,下一个优先级最高的挂起任务将自动启动;
- 任务触发机制:
- 主 C28x CPU 通过执行 IACK 指令触发;
- 任务 1 至任务 8:可从连接在共享总线上的外设获取最多 256 个潜在触发源,CLA 为该共享总线的次级所有者;
- 存储器与共享外设相关特性:
- 配备 2 个专用消息 RAM,用于 CLA 与主 CPU 之间的通信;
- C28x CPU 可将 CLA 程序存储器和数据存储器映射至主 CPU 地址空间或 CLA 地址空间;
- 芯片复位后,对于所有可将 CLA 或 DMA 作为次级主控的外设,CLA 默认为其次级主控。
6.1.2 CLA 相关参考资料
基础资料
- C2000 技术学堂 - 控制律加速器(CLA)相关内容
- C2000 系列 CLA C 语言编译器系列视频
- CLA 实操研习班视频
- 谷值开关型升压功率因数校正(PFC)参考设计中的 CLA 应用视频
6.1.3 框图
图 6-1 为控制律加速器(CLA)的框图。

6.2 CLA 接口
本节介绍 C28x 主 CPU 与 CLA 之间的双向交互方式。
6.2.1 CLA 存储器
CLA 可访问三类存储器:程序存储器、数据存储器和消息随机存取存储器(RAM)。本章将阐述各类存储器的工作特性与访问仲裁机制。CLA 的 RAM 受双代码安全模块(DCSM)保护,有关该安全机制的详细说明,请参见《系统控制与中断》章节中的双代码安全模块(DCSM)部分。
.CLA 程序存储器
内核上的任意本地共享存储器(LSxRAM)均可加载 CLA 程序。芯片复位后,所有存储块均映射至 CPU 地址空间,此时 CPU 可将 CLA 程序代码拷贝至该存储器中;调试阶段,也可通过(Code Composer Studio™)集成开发环境(IDE)直接向该存储器加载程序。
当 CLA 程序完成存储器加载后,CPU 需通过以下两步将该存储器映射至 CLA 程序地址空间:
- 向该存储块对应的MemCfgRegs.LSxMSEL[MSEL_LSx] 位写入 1,将存储块的所有权分配给 CLA;
- 向该存储块对应的MemCfgRegs.LSxCLAPGM[CLAPGM_LSx] 位写入 1,将该存储块指定为 CLA 的程序存储块。
当某一存储块被配置为 CLA 程序存储器后,仅在 CLA 未执行新指令取指的时钟周期内,允许对其进行调试访问。有关存储器配置及访问仲裁(CPU、CLA、调试模式)流程的详细说明,请参见《系统控制与中断》章节中的存储器控制器模块部分。
CLA 的所有程序取指操作均以 32 位读操作执行,且所有操作码的存储地址必须按偶地址对齐。由于 CLA 的所有操作码均为 32 位,该地址对齐要求会自然满足。
.CLA 数据存储器
器件上的任意本地共享存储器(LSxRAM)均可作为 CLA 的数据存储块。芯片复位后,所有存储块均映射至 CPU 地址空间,此时 CPU 可向该存储器中初始化数据表、系数等数据,供 CLA 后续调用。
当 CLA 数据完成存储器加载后,CPU 需通过以下两步将该存储器映射至 CLA 数据地址空间:
- 向该存储块对应的MemCfgRegs.LSxMSEL[MSEL_LSx] 位写入 1,将存储块的所有权分配给 CLA;
- 向该存储块对应的MemCfgRegs.LSxCLAPGM[CLAPGM_LSx] 位写入 0(该位的复位默认值为 0),将该存储块指定为 CLA 的数据存储块。
当某一存储块被配置为 CLA 数据存储器后,CLA 对其的读写访问操作将与 CPU 的访问操作进行仲裁。用户可通过向MemCfgRegs.LSxACCPROTx 寄存器的相应位写入配置值,为该存储器开启 CPU 取指保护或写保护功能。有关存储器配置及访问仲裁(CPU、CLA、调试模式)流程的详细说明,请参见《系统控制与中断》章节中的存储器控制器模块部分。
.CLA 共享消息 RAM
每个 CPU 子系统中均配有两个存储块,专用于 CLA 与 CPU 之间的数据共享和通信。消息 RAM 始终同时映射至 CPU 和 CLA 的地址空间,且仅允许数据访问,不支持程序取指操作。
- CLA 至 CPU 消息 RAM:CLA 可通过该存储块向 CPU 传输数据,CLA 对其拥有读写权限;CPU 仅可对其执行读操作,对该存储块的写操作会被直接忽略。
- CPU 至 CLA 消息 RAM:CPU 可通过该存储块向 CLA 传输数据和消息,CPU 对其拥有读写权限;CLA 仅可对其执行读操作,对该存储块的写操作会被直接忽略。
6.2.2 CLA 存储器总线
CLA 拥有与 C28x CPU 架构相似的专用总线体系,分别配备独立的程序读总线、数据读总线和数据写总线。因此,CLA 可在单个时钟周期内同时完成指令取指、数据读取和数据写入 操作。与 C28x CPU 一致,CLA 要求存储器逻辑将所有 32 位读写操作按偶地址对齐;若地址生成逻辑输出奇数地址,CLA 会从其前一个偶地址开始执行读写操作,该地址对齐操作不会改变地址生成逻辑输出的原始地址值。
.CLA 程序总线
CLA 程序总线的访问范围为 32K 个 32 位指令。由于 CLA 的所有指令均为 32 位,该总线始终以 32 位为单位执行取指操作,且操作码必须按偶字地址对齐。CLA 可用的程序存储空间大小取决于芯片上可用的 LSxRAM 存储块数量,该数值与具体器件型号相关,可参考对应的数据手册。
.CLA 数据读总线
CLA 数据读总线的地址范围为 64K×16 位,可执行 16 位或 32 位的读操作;当发生存储器访问冲突时,该总线会自动进入等待状态。数据读总线可访问消息 RAM、CLA 数据存储器及共享外设。
.CLA 数据写总线
CLA 数据写总线的地址范围为 64K×16 位,可执行 16 位或 32 位的写操作;当发生存储器访问冲突时,该总线会自动进入等待状态。数据写总线可访问CLA 至 CPU 消息 RAM、CLA 数据存储器及共享外设。
6.2.3 共享外设与 EALLOW 保护机制
对于任一 CPU 子系统,CLA 与 DMA 共享部分外设的次级访问权 。总线的次级所有权由寄存器CpuSysRegs.SECMSEL[VBUS32_x]的位值决定:该位设为 0 时,CLA 为总线次级所有者;设为 1 时,DMA 为总线次级所有者。芯片复位后默认将总线次级所有权分配给 CLA,因此 CLA 可访问连接至该总线的所有外设。
**注:**CLA 对该总线的读访问为 2 个等待状态,写访问为 0 个等待状态。
可参考器件数据手册,获取连接至该总线的外设列表。
部分外设控制寄存器受 EALLOW 保护机制保护,可防止 C28x CPU 产生误写操作;上述寄存器同样受该机制保护,避免 CLA 的误写操作。CPU 状态寄存器 1(ST1)中的 EALLOW 位标识 CPU 端的寄存器保护状态,与之对应,CLA 状态寄存器(MSTF)中的 MEALLOW 位标识 CLA 端的寄存器写保护状态。CLA 指令MEALLOW 可使能 CLA 对 EALLOW 保护寄存器的写访问权限,而 CLA 指令MEDIS则会禁用该写访问权限。通过此方式,CLA 可独立于 CPU,自主使能或禁用对保护寄存器的写访问。
ADC 模块支持在采样转换开始时生成提前中断脉冲的功能。若使用该中断脉冲启动由 ADC 触发的 CLA 任务,可利用转换完成前的空闲时钟周期执行预处理计算或数据读写操作,待转换完成后再读取 ADC 的采样值。该场景下的 CLA 流水线工作时序详见本章 6.5 节。
6.2.4 CLA 任务与中断向量
CLA 程序代码被划分为多个任务(Task)或中断服务程序(Interrupt Service Routine)。任务无固定起始地址或长度,CLA 程序存储器可按需划分。CLA 会通过中断向量(MVECT1 至 MVECT8)的内容确定任务的起始位置;任务由 MSTOP 指令终止。
CLA 支持 8 个任务,其中任务 1 优先级最高,任务 8 优先级最低。
. 外设中断触发
每个任务均可由软件可选的中断源触发。需向 DmaClaSrcSelRegs.CLA1TASKSRCSELx [TASKx] 位段写入对应数值,以此定义每个任务的触发源。每个取值对应共享总线上某一特定外设的中断源,外设中断触发源详见表 6-1。
例如,向 DmaClaSrcSelRegs.CLA1TASKSRCSEL1.TASK1 写入数值 36,即可将任务 1(MVECT1)设置为由 EPWMINT1 触发。若要禁用外设对某一任务的触发功能,需将 DmaClaSrcSelRegs.CLA1TASKSRCSELx [TASKx] 位段置 0。请注意,CLA 任务仅在已配置中断源的电平发生跳变(边沿触发)时才会被触发。
. 软件触发
CPU 软件可通过向 MIFRC 寄存器写入数据或执行 IACK 指令来触发 CLA 任务。使用 IACK 指令的效率更高,因为该指令无需执行 EALLOW 操作即可设置 MIFR 寄存器的相关位。需先置位 MCTL [IACKE] 位以启用 IACK 功能。IACK 指令操作数中的每一位对应一个 CLA 任务。例如,执行 IACK #0x0001 会置位 MIFR 寄存器的第 0 位,从而启动任务 1;同理,执行 IACK #0x0003 会置位 MIFR 寄存器的第 0 位和第 1 位,进而启动任务 1 和任务 2。
CLA 具备指令取指机制,可独立于 CPU 运行并执行任务。同一时间仅能处理一个任务,不支持任务嵌套。当前正在运行的任务会在 MIRUN 寄存器中标识;已接收但尚未处理的中断会在标志寄存器(MIFR)中标识。若外设发送的某一任务中断请求被接收时,该任务的标志位已处于置位状态,则对应的溢出标志位会被置位。溢出标志位会保持置位状态,直至 CPU 将其清零。
若 CLA 处于空闲状态(当前无任务运行),则会启动同时满足 "标志位置位(MIFR)" 和 "使能位置位(MIER)" 的最高优先级中断请求。
CLA 任务执行流程如下:
- 置位对应的运行寄存器位(MIRUN),并清零标志位(MIFR);
- CLA 从对应中断向量(MVECTx)指向的地址开始执行指令。MVECT 寄存器存储该任务在低 64K 内存空间中的 16 位绝对地址;
- CLA 持续执行指令,直至遇到 MSTOP 指令(该指令标志着任务结束);
- 清零 MIRUN 寄存器中的对应位;
- 向 PIE 模块发送该任务专属的中断信号,告知主 CPU 该任务已完成;
- CLA 回到空闲状态。
当一个任务完成后,下一个优先级最高且处于挂起状态的任务会被自动处理,上述流程将重复执行。
6.2.5 CLA 至 CPU 的软件中断
CLA 可在代码执行的任意位置,通过配置 CLA1SOFTINTEN(CLA1 软件中断使能寄存器)和 CLA1INTFRC(CLA1 中断强制寄存器),向同子系统下的 C28x CPU 发起软件中断。有关这些寄存器的详细说明,请参见 6.8 节。若为某一 CLA 任务配置了软件中断触发方式,则当该任务执行完成时,不会向 C28x CPU 发送任务结束中断信号。
6.3 CLA 与 CPU 的仲裁机制
通常情况下,CLA 的运行独立于 CPU。当 CLA 与 CPU 试图同时访问同一接口内的存储器或外设寄存器时,会触发仲裁流程。本节将对该仲裁机制进行说明。
仲裁遵循固定的优先级仲裁规则,优先级从高到低依次为:
- CLA 写操作
- CLA 读操作
- CPU 写操作
- CPU 读操作
相关细节请参见《系统控制与中断》章节中存储器控制器模块的内容。
6.3.1 CLA 消息内存
消息内存由两个存储块组成:
- CLA 至 CPU 消息内存
- CPU 至 CLA 消息内存
这两个存储块用于实现 CLA 与 CPU 之间的数据交互,CLA 和 CPU 均不允许从消息内存中取指执行指令 。若 CLA 试图向CPU 至 CLA 消息内存 执行写操作,系统不会触发写保护违规报错,但该写操作会被直接忽略。消息内存的仲裁规则与共享存储器一致,具体说明见《系统控制与中断》章节中存储器控制器模块的内容。
消息内存具备以下访问特性:
CLA 至 CPU 消息内存
允许的访问操作:
- CPU 读操作
- CLA 数据读、写操作
- CPU 调试模式下的读、写操作
被忽略的访问操作:
- CPU 写操作
CPU 至 CLA 消息内存
允许的访问操作:
- CPU 读、写操作
- CLA 读操作
- CPU 调试模式下的读、写操作
被忽略的访问操作:
- CLA 写操作
6.3.2 CLA 程序存储器
程序存储器的工作特性由 MMEMCFG [PROGE] 位的状态决定,该位用于控制存储器映射至CLA 地址空间 还是CPU 地址空间。
当 MMEMCFG [PROGE] = 0 时
此状态下,存储器映射至 CPU 地址空间,CLA 会被暂停,且无法接收新的任务请求。
- 所有 CLA 取指操作均会触发非法操作码异常,相关说明详见 6.4.4 节;若按规范流程完成程序存储器的映射配置,该异常不会触发。
- 禁止 CLA 执行任何读、写操作。
- 该存储块的工作特性与映射至 CPU 地址空间的普通 RAM 块一致。
访问优先级(优先级从高到低):
- CPU 数据写、程序写、调试写操作
- CPU 数据读、程序读、调试读操作
- CPU 取指、程序读操作
当 MMEMCFG [PROGE] = 1 时
此状态下,存储块映射至 CLA 地址空间,CPU 仅能对其执行调试模式下的访问操作。
- 禁止 CLA 执行任何读、写操作。
- 允许 CLA 执行取指操作。
- CPU 取指操作会返回 0(0 为非法操作码),并触发 ITRAP 中断。
- CPU 数据读、程序读操作均返回 0。
- CPU 数据写、程序写操作会被直接忽略。
访问优先级(优先级从高到低):
- CLA 取指操作
- CPU 调试写操作
- CPU 调试读操作
注意事项
由于 CLA 取指操作的优先级高于 CPU 调试读操作,若 CLA 执行死循环代码,可能会导致 CPU 的调试访问被永久阻塞。该问题易出现在 CLA 代码的初期开发阶段,通常由程序漏洞引发。为规避此问题,当 CLA 处于运行状态时,程序存储器对 CPU 调试读操作会统一返回 0x0000(调试写操作则被忽略);当 CLA 处于暂停或空闲状态时,CPU 可对其执行正常的调试读、写操作。
6.3.3 CLA 数据存储器
存在独立的数存储块,数据存储器的工作特性由 MMEMCFG [RAM0E] 和 MMEMCFG [RAM1E] 位的状态共同决定,这两个位用于指定数据存储块映射至 CLA 地址空间还是 CPU 地址空间。
当 MMEMCFG [RAMxE] = 0 时
此状态下,数据存储块映射至 CPU 地址空间。
- 该存储块不支持 CLA 取指操作;
- CLA 对其执行读操作时返回 0;
- CLA 对其执行写操作会被直接忽略;
- 该存储块的工作特性与映射至 CPU 地址空间的普通 RAM 块一致。
访问优先级(优先级从高到低):
- CPU 数据写、程序写、调试写操作
- CPU 数据读、调试读操作
- CPU 取指、程序读操作
当 MMEMCFG [RAMxE] = 1 时
此状态下,数据存储块映射至 CLA 地址空间,CPU 仅能对其执行调试访问操作。
- 该存储块不支持 CLA 取指操作;
- 允许 CLA 对其执行读、写操作;
- CPU 对其执行取指操作时返回 0;
- CPU 对其执行数据读、程序读操作时均返回 0;
- CPU 对其执行数据写、程序写操作会被直接忽略。
访问优先级(优先级从高到低):
- CLA 数据写操作
- CPU 调试写操作
- CPU 调试读操作
- CLA 数据读操作
6.3.4 外设寄存器***(ePWM, HRPWM, Comparator)***
对上述寄存器的访问遵循以下规则:
- 若 CPU 与 CLA 同时请求访问该寄存器,CLA 拥有访问优先权,主 CPU 将进入等待状态;
- 若 CPU 的某一访问操作正在执行,且另有 CPU 访问操作处于挂起状态,CLA 的访问请求优先级高于挂起的 CPU 访问请求,此种情况下,CLA 的访问操作将在当前 CPU 访问操作完成后立即执行;
- 当 CPU 的访问操作正在执行时,所有新的 CLA 访问请求将进入等待状态;
- 当 CLA 的访问操作正在执行时,所有新的 CPU 访问请求将进入等待状态;
- 同属 CPU 的访问操作中,写操作优先级高于读操作;
- 同属 CLA 的访问操作中,写操作优先级高于读操作;
- 若 CPU 正在对某一地址执行读 - 改 - 写操作,而 CLA 同时对该地址执行写操作,若 CLA 的写操作发生在 CPU 的读、写操作之间,CLA 的写操作结果可能丢失。因此,禁止 CPU 与 CLA 同时访问同一寄存器地址 。
6.4 CLA 的配置与调试
本节介绍配置和调试 CLA 所需的相关步骤。
6.4.1 开发 CLA 应用程序
控制律加速器(CLA)的程序开发可采用两种方式:一是使用 6.7 节所述指令编写 CLA 汇编代码,二是使用 C 语言的精简子集编程。CLA 汇编代码可与 C28x 代码置于同一个项目中,唯一的限制是CLA 代码必须放在汇编段中 ,这一要求可通过汇编伪指令.sect轻松实现。该限制并不影响链接器命令文件中将 CLA 代码与 C28x 代码链接到同一内存区域。
系统和 CLA 的初始化由主 CPU 完成,这项操作通常可通过 C 或 C++ 语言实现,也可结合 C28x 汇编代码完成。主 CPU 还需将 CLA 代码拷贝至程序存储器中,若有需要,还需对 CLA 数据随机存取存储器(RAM)进行初始化。系统初始化完成且应用程序启动后,CLA 将通过自身汇编代码(或任务)响应中断请求,主 CPU 则可与 CLA 程序的执行过程并行处理其他任务。
CLA Type 1 要求使用代码生成器(Codegen)V6.2.4 及以上版本,并配置编译器开关:--cla_support=cla1。
6.4.2 典型的 CLA 初始化流程
主 CPU 执行的典型 CLA 初始化流程如下文所述。
- 将 CLA 代码拷贝至 CLA 程序 RAM:CLA 代码的源文件最初可存储在闪存(Flash)中、通信外设的数据流里,或主 CPU 可访问的任意存储位置。开发阶段,也可通过调试器将代码直接加载至 CLA 程序 RAM。
- 若有需要,初始化 CLA 数据 RAM:向 CLA 数据 RAM 中写入所需的各类数据系数与常量。
- 配置 CLA 相关寄存器 :对 CLA 寄存器进行配置,暂禁用中断功能(保持
MIER = 0),后续再启用:- 通过指定的 PCLKCRn 寄存器使能 CLA 外设时钟:外设时钟控制寄存器(PCLKCRn)的相关定义详见《系统控制与中断》章节。
- 配置 CLA 任务中断向量 :配置中断向量
MVECT1至MVECT8,为每个向量初始化对应任务的起始地址 ------ 该地址为 CLA 接收到相应中断后待执行任务的起始地址,是任务在内存低 64K 区域中的完整 16 位地址。 - 选择任务中断源 :在
CLA1TASKSRCSELx寄存器中为每个 CLA 任务配置对应的中断源;若某任务为软件触发模式,则无需为其选择中断源。 - 若有需要,使能 IACK 指令以实现软件触发任务 :置位
MCTL[IACKE]位,即可启用 IACK 指令的软件触发任务功能,使用该指令可避免频繁置位和清零 EALLOW 位的操作。 - 若有需要,将 CLA 数据 RAM 映射至 CLA 地址空间 :完成该映射需分两步操作,首先向存储块对应的
MemCfgRegs.LSxMSEL[MSEL_LSx]位写入 1,将该存储块的所有权分配给 CLA;随后向MemCfgRegs.LSxCLAPGM[CLAPGM_LSx]位写入 0,将该存储块指定为 CLA 数据块。当某一 LSx 内存被配置为 CLA 数据内存后,CLA 对其的读写访问将与 CPU 的访问操作进行仲裁。用户还可通过向MemCfgRegs.LSxACCPROTx寄存器的相应位写入配置值,为该内存开启 CPU 取指保护或写保护功能。 - 将 CLA 程序 RAM 映射至 CLA 地址空间 :完成该映射需分两步操作,首先向存储块对应的
MemCfgRegs.LSxMSEL[MSEL_LSx]位写入 1,将该存储块的所有权分配给 CLA;随后向MemCfgRegs.LSxCLAPGM[CLAPGM_LSx]位写入 1,将该存储块指定为 CLA 程序块。当某一 LSx 内存被配置为 CLA 程序内存后,仅在 CLA 未执行新指令取指的时钟周期内,允许对其进行调试访问。
- 初始化 PIE 向量表和相关寄存器:当 CLA 任务执行完成后,外设中断扩展模块(PIE)中对应的中断标志位会被置位;此外,CLA 的上溢标志位和下溢标志位在 PIE 中也配有对应的中断源。
- **使能 CLA 任务 / 中断:**置位中断使能寄存器(MIER)中的相应位,允许 CLA 响应中断请求。请注意,CLA 任务仅在已配置中断源的电平发生跳变(下降沿)时触发。若外设已使能且在 CLA 完成配置前产生中断,CLA 将无法识别该中断边沿,也不会做出响应。为避免此问题,需在配置外设前完成 CLA 配置,或在置位 MIER 寄存器相关位前清除所有挂起的外设中断。
- **初始化其他外设:**初始化所有会为已使能的 CLA 任务产生中断触发信号的外设(如增强型脉宽调制模块 ePWM、模数转换器 ADC 等)。此时 CLA 已准备好响应中断,且消息 RAM 可用于 CPU 与 CLA 之间的数据传输。CLA 程序 RAM 和数据 RAM 的映射操作通常仅在初始化阶段执行。若初始化后需修改 RAM 映射,必须先禁用 CLA 中断,并确认所有任务均已执行完成(通过检查 MIRUN 寄存器),再修改 RAM 的所有权配置。
6.4.3 调试 CLA 代码
调试 CLA 代码的流程简单,且可独立于主 CPU 执行。
6.4.3.1 断点支持(MDEBUGSTOP 指令)
1. 在 CLA 代码中插入断点
在需要 CLA 暂停执行的代码位置插入 CLA 断点(MDEBUGSTOP 指令),随后重新编译并加载代码。由于 CLA 在单步执行模式下不会刷新流水线,因此必须将 MDEBUGSTOP 指令作为代码的一部分提前插入,调试器无法按需动态插入该指令。
若 CLA 断点功能未使能,MDEBUGSTOP 指令会被忽略,视同空操作指令(MNOP)。MDEBUGSTOP 指令可放置在 CLA 代码的任意位置,但需注意:该指令不能出现在 MBCNDD、MCCNDD 或 MRCNDD 指令的前后三条指令范围内。若使用 C 语言编程,用户可改用__mdebugstop () 内置函数;编译器会自动确保生成的汇编代码中,MDEBUGSTOP 指令的放置位置符合流水线的所有限制条件。
2. 使能 CLA 断点
在调试器中启用 CLA 断点功能。在 Code Composer Studio™集成开发环境(IDE)中,需从调试视图连接至 CLA 核心(或调试端口 tap)以完成该操作;断开核心连接后,断点功能会自动禁用。
3. 启动任务
启动任务有三种方式:
a. 外设主动触发中断;
b. 主 CPU 执行 IACK 指令;
c. 用户在调试器窗口中手动向 MIFRC 寄存器写入数据。
任务启动后,CLA 会持续执行指令,直至 MDEBUGSTOP 指令进入流水线的 D2 阶段。此时 CLA 将暂停执行,流水线冻结,程序计数器(MPC)寄存器会显示 MDEBUGSTOP 指令的存储地址。
4. 单步执行 CLA 代码
CLA 暂停执行后,用户可对其代码进行单步调试。CLA 的单步执行行为与主 C28x 内核不同:触发 CLA 单步执行时,流水线仅运行一个时钟周期随即再次冻结;而 C28x CPU 的每次单步执行都会刷新整条流水线。
单步执行可运行至下一条 MDEBUGSTOP 指令处,或运行至当前任务结束。若有其他任务处于挂起状态,则在执行至当前任务结束时,该挂起任务会自动启动。
**注:**CLA 取指操作的优先级高于 CPU 调试读操作,因此若 CLA 陷入循环执行状态,有可能永久阻塞 CPU 对其的调试访问。该问题易出现在 CLA 代码开发初期,通常由导致死循环的程序漏洞引发。为避免主 CPU 卡死,当 CLA 处于运行状态时,程序存储器对 CPU 的调试读操作会统一返回 0x0000;当 CLA 处于暂停或空闲状态时,CPU 可对 CLA 程序存储器执行正常的调试读、写操作。
若 CLA 陷入死循环,可通过软复位或硬复位退出该状态,调试器复位也可实现此操作。
单步执行任务时可能出现特殊情况:程序计数器(MPC)指向任务末尾的 MSTOP 指令。
场景 1:MPC 停在 MSTOP 指令处 / 之后,且已有任务挂起
若在 "任务 A" 中执行单步调试或暂停操作,且程序计数器(MPC)尚未到达 MSTOP 指令前 "任务 B" 已进入挂起状态,则继续单步执行越过 MSTOP 指令时,"任务 B" 会启动。简言之,若 "任务 A" 的 MPC 到达 MSTOP 指令前 "任务 B" 已处于挂起状态,那么 "任务 B" 启动不会存在问题,无需执行任何特殊操作。
场景 2:MPC 停在 MSTOP 指令处 / 之后,且无任务挂起
此种情况下,若在 "任务 A" 中执行单步调试或暂停操作,且 MPC 已到达 MSTOP 指令、无任何任务处于挂起状态。此时若 "任务 B" 进入挂起状态,其标志位会在 MIFR 寄存器中置位,但继续单步执行 "任务 A" 的 MSTOP 指令时,"任务 B" 有可能启动,也有可能无法启动。
由于新任务进入挂起状态的时机直接影响执行结果,若需确保 "任务 B" 可靠启动,需执行软复位并重新配置 MIER 寄存器的对应位。完成上述操作后,再开始单步执行 "任务 B"。
若可控制 "任务 B" 的触发时机(例如通过 IACK 指令启动该任务),则可采用略有不同的处理方式:在 "任务 A" 中执行单步调试或暂停操作,且 MPC 已到达 MSTOP 指令、无任务挂起时,先执行一次自由运行操作使 CLA 退出调试状态;完成后,触发 "任务 B" 并继续调试。
5. 按需禁用 CLA 断点
在 Code Composer Studio™集成开发环境(IDE)中,可通过调试视图断开与 CLA 核心的连接,从而禁用 CLA 断点。操作前需先执行运行或复位指令,否则 CLA 会保持暂停状态,无法启动其他任务。
6.4.4 CLA 非法操作码行为
若 CLA 取指到与合法指令不匹配的操作码,会产生如下行为:
- CLA 暂停执行,非法操作码停留在流水线的 D2 阶段,效果等同于触发断点(无论 CLA 断点功能是否使能,此行为均会发生);
- CLA 向外设中断扩展模块(PIE)发送该任务专属的中断信号;
- 该任务对应的 MIRUN 寄存器位保持置位状态。
一旦因非法操作码导致 CLA 暂停执行,后续的单步执行指令会被忽略。需按 6.4.5 节所述方法,对 CLA 执行软复位或硬复位以退出该状态。
6.4.5 CLA 的复位操作
在部分场景下需对 CLA 执行复位操作,例如代码调试阶段,CLA 可能因程序漏洞陷入死循环。CLA 支持两种复位方式:硬复位和软复位,这两种复位操作均可通过调试器或主 CPU 执行。
- 硬复位:向 MCTL 寄存器的 HARDRESET 位写入 1,即可对 CLA 执行硬复位。硬复位的执行效果与系统复位(通过 XRS 信号或调试器触发)一致,执行后 CLA 的所有配置寄存器和运行寄存器均会恢复默认状态,且 CLA 的运行会立即中止。
- 软复位:向 MCTL 寄存器的 SOFTRESET 位写入 1,即可对 CLA 执行软复位。若此时有任务正在执行,该任务会被中止,对应的 MIRUN 寄存器位会被清零;中断使能寄存器(MIER)的所有位也会被清零,防止新任务启动。
6.5 流水线
本节介绍 CLA 的流水线阶段,并说明需要考虑流水线对齐的相关场景。
6.5.1 流水线概述
CLA 的流水线架构与 C28x 的流水线高度相似,共包含 8 个阶段,各阶段功能如下:
- 取指 1(F1):在 F1 阶段,将程序读地址送至 CLA 程序地址总线。
- 取指 2(F2):在 F2 阶段,通过 CLA 程序数据总线读取指令。
- 译码 1(D1):在 D1 阶段,对指令进行译码处理。
- 译码 2(D2):生成数据读地址;通过间接寻址实现的后增量操作,其对 MAR0 和 MAR1 寄存器的修改在 D2 阶段完成;同时会根据 MSTF 寄存器的标志位,做出条件分支的执行判断。
- 读数据 1(R1):将数据读地址送至 CLA 数据读地址总线;若发生存储器访问冲突,R1 阶段会进入等待状态。
- 读数据 2(R2):通过 CLA 数据读数据总线读取数据值。
- 执行(EXE):执行指令对应的操作;通过立即数或存储器加载数据对 MAR0 和 MAR1 寄存器的修改,在本阶段完成。
- 写数据(W):将写地址和写数据送至 CLA 写数据总线;若发生存储器访问冲突,W 阶段会进入等待状态。