论文部分内容阅读
摘要:本文扼要介绍了飞思卡尔新一代SI2X 16位MCU的外设协处理器XGATE。着重讨论了XGATE的中断处理机制,以及XGATE与主内核CPUl2X的交互。最后给出了XGATE的典型配置及编程方法。
关键词:协处理器;XGATE;中断机制;微控制器
与经典的微处理器S12系列相比,飞思卡尔新一代的16位微处理器系列S12X(E)的性能有深化而全面的提升。最重要的是集成了外设协处理器XGATE。它是一个独立于主CPU(CPUl2X)的RISC内核,可作为一个高效的DMA控制器,自治地在外设与RAM之间进行高速的数据传送,和灵活的数据处理;可作为一个单独的算法单元完成某些运算,如通信协议的处理;作为虚拟的外设,用I/o口模拟串行通信口;或对简单的外设进行软件包装以生成功能强大的个性化外设。集成XGATE的目的就是在日益复杂的嵌入式系统中减轻内核CPUl2X的负担,以增强系统的数据吞吐能力。
XGATE基本特性
精简指令集内核
XGATE是一个16位的精简指令集内核,图1为XGATE编程模式。内核拥有8个16位通用寄存器R0~R7,1个程序计数器PC,一个4位的条件码寄存器CCR。其中R0恒为0,可用于对变量的快速清零或置位。R1和R7有额外用途:XGATE响应中断时,硬件将中断向量表中对应通道的1个16位字装载到R1(通常用作数据指针),将暂存指针装载到R7。内核没有完全功能的栈指针,这里的暂存指针只在调用函数时用于局部变量的空间分配。
XGATE指令集
XGATE共有72条独立的指令。指令时钟最高可达100MHz。XGATE的时钟速度总是CPUl2X总线速度的2倍。XGATE的大部分指令是对通用寄存器的操作,为单周期指令。访问存储器的指令为双周期指令。跳转指令视条件而定可能为1或2个周期。XGATE有一些特殊的位提取及插入的单周期指令,很适合串行通信协议的处理。
XGATE访问空间
S12X的全局存储空间共有8MB,XGATE可以访问其中片内的64KB。这64KB包括2KB的片上外设寄存器,30KB的片上闪存和最大32KB的片内RAM,如图2的XGATE全局地址映射所示。注意XGATE不能访问EEPROM空间或片外资源。XGATE的访问空间完全包含在CPUl2X的访问空间中。地址仲裁的规则使CPUl2X的优先级总高于XGATE。
嵌入式处理器的代码通常在闪存或ROM中运行,但对于XGATE建议代码放在RAM中运行。原因有二:1)CPUl2X的代码,在闪存中,若XGATE的代码也在闪存中,则增加了总线冲突的概率;2)CPUl2X访问片内RAM时只占用总线带宽的一半,在每个CPU12X的RAM访问周期中,总能让出一个XGATE的RAM访问周期。
事件驱动XGATE线程
XGATE的代码执行是由事件驱动的,这里的事件就是中断,由中断来触发XGATE的运行。没有中断,XGATE不执行任何指令,从而也没有功耗。XGATE的代码就是一组中断服务程序,没有主程序或空闲时的循环程序。XGATE的中断服务程序也称作线程。
互斥信号量
CPU12X与XGATE之间常用的通信方式是共享资源。由于这两个内核可以独立异步地访问内存及片上外设,就产生了数据完整性的问题。为了保证共享数据的完整性,XGATE集成了8个硬件互斥信号量(Semaphore),用户可以通过硬件信号量来同步两个内核对共享数据的访问。
信号量有3种状态:释放、CPUl2X锁定和XGATE锁定。每个内核在访问共享资源前,应当首先锁定相应的信号量;在访问结束后应当释放相应的信号量。信号量在三种状态之间的转换如下:
·信号量锁定
XGATE以专用的指令SSEM加上一个3位立即数来锁定某个信号量。若锁定成功则XGATE的进位标志C置位,否则C被清零。CPUl2X通过专门的信号量寄存器来锁定信号量。CPUl2X锁定并检查某个信号量的方法可参见下面的C宏定义。
·信号量释放
XGATE以专用的指令CSEM加上一个3位立即数来释放某个信号量。CPUl2X通过专门的信号量寄存器来释放信号量。同样见下面的C宏定义。
值得强调的是,信号量与对应资源之间没有任何硬件上的联系,信号量对资源的保护完全体现在用户的代码中。
XGATE的中断
所有MCU中断缺省由CPU12X响应。其中绝大多数中断也可提交XGATE处理。每个中断都有相应的配置寄存器INT_CFGDATAx来配置相应的处理内核及中断优先级。图3是典型的S12X的中断配置及中断响应。其中ILVL[2:0]域定义了中断优先级,优先级对两个内核都有效;RQST域选择中断处理内核。一种典型的应用是置RQST=1,首先将中断提交给XGATE处理。xGATE的中断服务程序处理之后通知CPUl2X,并将处理的结果提交CPUl2X。这样CPUl2X就只需关注于上层的应用控制算法,而与底层硬件密切相关的驱动由XGATE处理,极大地提高了系统的性能。
中断向量表
图4是XGATE的中断矢量表结构。XGATE的每个中断矢量由2个16位字组成。编程时可用一个指针结构数组来描述整个中断矢量表。数组的每个元素由ISR入口地址和ISR数据指针组成。若某中断配置由XGATE处理,则当该中断发生时硬件将ISR入口地址装载入XGATE的程序计数器PC,将ISR数据指针装载入XGATE的R1。这样XGATE的中断服务程序可以带一个数据指针作为参数。这样,一个显著的好处是,可以只用同一段ISR代码来处理同类的若干个中断。XGATE可以通过这个数据指针来区分及处理不同的对象。
XGATE与CPUl2X的相互中断
XGATE与CPUl2X之间可相互中断以便同步运行。XGATE有一个特殊的指令SIF,用于向CPUl2X提交中断。通常SIF为XGATE线程的最后一条指令,用以触发CPUl2X中断。缺省情况下XGATE的中断矢量就对应于XGATE所处理的前一中断。故由SIF所触发的CPUl2X的中断服务程序通常不必查询中断源。
XGATE有8个软件中断源。CPUl2X通过置位或清除XGATE软件触发寄存器(XGSWT)中相应的位来触发或清除这8个中断。值得指出的是:由于XGSWT属于片上外设寄存器,所以XGATE也可以通过XGSWT给自己发出中断。
中断嵌套
最早推出的XGATE不支持中断嵌套,即只在当前XGATE的线程完成后才能处理别的中断。新的XGATE支持1级中断嵌套,而且,新的XGATE有2套内核寄存器,1套在前台运行,另1套在后台保持被占先前的现场。所以中断过程中没有内核寄存器入栈或出栈。这样2套内核切换的速度很快,仅为2个XGATE的指令周期。
另外,对应于4到7级中断和1到3级中断分别有XGATE初始暂存指针寄存器XGISP74和XGISP31。与优先级的中断相应时,硬件会将对应的暂存指针寄存器内容装载到XGATE的R7中。
XGATE的启动及初始化
XGATE的启动及初始化并不复杂,典型过程如下:
·XGATE代码下载到RAM中。系统复位后,需要将XGATE的代码从闪存下载到RAM中以提高系统运行性能。
·将XGATE的中断矢量表起始地址写到XGATE的矢量基地址寄存器XGVBR中。
·初始化XGATE的暂存指针。将优先级4到7的中断程序的局部变量起始地址写入寄存器XGISP74将优先级1到3的中断程序的局部变量起始地址写入寄存器XGISP31。
·配置中断源。欲将某中断提交给XGATE处理,则将中断配置寄存器的RQST置位;同时可以设置中断配置寄存器ILVL[2:0]域为其配置适当的优先级。
·启动XGATE。置XGATE控制寄存器XGMCTL中的XGE位为1以启动XGATE。通常也将XGIE位置1以使能XGATE对CPUl2X的中断。
结语
外设协处理器XGATE显著增强了S12XMCU系统的整体性能。S12X MCU片上几乎所有的外设中断均可交给XGATE处理。XGATE的编程实际就是为XGATE写一组中断服务程序。XGATE的配置和启动也比较方便,主要是恰当地设置几个核心的XGATE寄存器。
关键词:协处理器;XGATE;中断机制;微控制器
与经典的微处理器S12系列相比,飞思卡尔新一代的16位微处理器系列S12X(E)的性能有深化而全面的提升。最重要的是集成了外设协处理器XGATE。它是一个独立于主CPU(CPUl2X)的RISC内核,可作为一个高效的DMA控制器,自治地在外设与RAM之间进行高速的数据传送,和灵活的数据处理;可作为一个单独的算法单元完成某些运算,如通信协议的处理;作为虚拟的外设,用I/o口模拟串行通信口;或对简单的外设进行软件包装以生成功能强大的个性化外设。集成XGATE的目的就是在日益复杂的嵌入式系统中减轻内核CPUl2X的负担,以增强系统的数据吞吐能力。
XGATE基本特性
精简指令集内核
XGATE是一个16位的精简指令集内核,图1为XGATE编程模式。内核拥有8个16位通用寄存器R0~R7,1个程序计数器PC,一个4位的条件码寄存器CCR。其中R0恒为0,可用于对变量的快速清零或置位。R1和R7有额外用途:XGATE响应中断时,硬件将中断向量表中对应通道的1个16位字装载到R1(通常用作数据指针),将暂存指针装载到R7。内核没有完全功能的栈指针,这里的暂存指针只在调用函数时用于局部变量的空间分配。
XGATE指令集
XGATE共有72条独立的指令。指令时钟最高可达100MHz。XGATE的时钟速度总是CPUl2X总线速度的2倍。XGATE的大部分指令是对通用寄存器的操作,为单周期指令。访问存储器的指令为双周期指令。跳转指令视条件而定可能为1或2个周期。XGATE有一些特殊的位提取及插入的单周期指令,很适合串行通信协议的处理。
XGATE访问空间
S12X的全局存储空间共有8MB,XGATE可以访问其中片内的64KB。这64KB包括2KB的片上外设寄存器,30KB的片上闪存和最大32KB的片内RAM,如图2的XGATE全局地址映射所示。注意XGATE不能访问EEPROM空间或片外资源。XGATE的访问空间完全包含在CPUl2X的访问空间中。地址仲裁的规则使CPUl2X的优先级总高于XGATE。
嵌入式处理器的代码通常在闪存或ROM中运行,但对于XGATE建议代码放在RAM中运行。原因有二:1)CPUl2X的代码,在闪存中,若XGATE的代码也在闪存中,则增加了总线冲突的概率;2)CPUl2X访问片内RAM时只占用总线带宽的一半,在每个CPU12X的RAM访问周期中,总能让出一个XGATE的RAM访问周期。
事件驱动XGATE线程
XGATE的代码执行是由事件驱动的,这里的事件就是中断,由中断来触发XGATE的运行。没有中断,XGATE不执行任何指令,从而也没有功耗。XGATE的代码就是一组中断服务程序,没有主程序或空闲时的循环程序。XGATE的中断服务程序也称作线程。
互斥信号量
CPU12X与XGATE之间常用的通信方式是共享资源。由于这两个内核可以独立异步地访问内存及片上外设,就产生了数据完整性的问题。为了保证共享数据的完整性,XGATE集成了8个硬件互斥信号量(Semaphore),用户可以通过硬件信号量来同步两个内核对共享数据的访问。
信号量有3种状态:释放、CPUl2X锁定和XGATE锁定。每个内核在访问共享资源前,应当首先锁定相应的信号量;在访问结束后应当释放相应的信号量。信号量在三种状态之间的转换如下:
·信号量锁定
XGATE以专用的指令SSEM加上一个3位立即数来锁定某个信号量。若锁定成功则XGATE的进位标志C置位,否则C被清零。CPUl2X通过专门的信号量寄存器来锁定信号量。CPUl2X锁定并检查某个信号量的方法可参见下面的C宏定义。
·信号量释放
XGATE以专用的指令CSEM加上一个3位立即数来释放某个信号量。CPUl2X通过专门的信号量寄存器来释放信号量。同样见下面的C宏定义。
值得强调的是,信号量与对应资源之间没有任何硬件上的联系,信号量对资源的保护完全体现在用户的代码中。
XGATE的中断
所有MCU中断缺省由CPU12X响应。其中绝大多数中断也可提交XGATE处理。每个中断都有相应的配置寄存器INT_CFGDATAx来配置相应的处理内核及中断优先级。图3是典型的S12X的中断配置及中断响应。其中ILVL[2:0]域定义了中断优先级,优先级对两个内核都有效;RQST域选择中断处理内核。一种典型的应用是置RQST=1,首先将中断提交给XGATE处理。xGATE的中断服务程序处理之后通知CPUl2X,并将处理的结果提交CPUl2X。这样CPUl2X就只需关注于上层的应用控制算法,而与底层硬件密切相关的驱动由XGATE处理,极大地提高了系统的性能。
中断向量表
图4是XGATE的中断矢量表结构。XGATE的每个中断矢量由2个16位字组成。编程时可用一个指针结构数组来描述整个中断矢量表。数组的每个元素由ISR入口地址和ISR数据指针组成。若某中断配置由XGATE处理,则当该中断发生时硬件将ISR入口地址装载入XGATE的程序计数器PC,将ISR数据指针装载入XGATE的R1。这样XGATE的中断服务程序可以带一个数据指针作为参数。这样,一个显著的好处是,可以只用同一段ISR代码来处理同类的若干个中断。XGATE可以通过这个数据指针来区分及处理不同的对象。
XGATE与CPUl2X的相互中断
XGATE与CPUl2X之间可相互中断以便同步运行。XGATE有一个特殊的指令SIF,用于向CPUl2X提交中断。通常SIF为XGATE线程的最后一条指令,用以触发CPUl2X中断。缺省情况下XGATE的中断矢量就对应于XGATE所处理的前一中断。故由SIF所触发的CPUl2X的中断服务程序通常不必查询中断源。
XGATE有8个软件中断源。CPUl2X通过置位或清除XGATE软件触发寄存器(XGSWT)中相应的位来触发或清除这8个中断。值得指出的是:由于XGSWT属于片上外设寄存器,所以XGATE也可以通过XGSWT给自己发出中断。
中断嵌套
最早推出的XGATE不支持中断嵌套,即只在当前XGATE的线程完成后才能处理别的中断。新的XGATE支持1级中断嵌套,而且,新的XGATE有2套内核寄存器,1套在前台运行,另1套在后台保持被占先前的现场。所以中断过程中没有内核寄存器入栈或出栈。这样2套内核切换的速度很快,仅为2个XGATE的指令周期。
另外,对应于4到7级中断和1到3级中断分别有XGATE初始暂存指针寄存器XGISP74和XGISP31。与优先级的中断相应时,硬件会将对应的暂存指针寄存器内容装载到XGATE的R7中。
XGATE的启动及初始化
XGATE的启动及初始化并不复杂,典型过程如下:
·XGATE代码下载到RAM中。系统复位后,需要将XGATE的代码从闪存下载到RAM中以提高系统运行性能。
·将XGATE的中断矢量表起始地址写到XGATE的矢量基地址寄存器XGVBR中。
·初始化XGATE的暂存指针。将优先级4到7的中断程序的局部变量起始地址写入寄存器XGISP74将优先级1到3的中断程序的局部变量起始地址写入寄存器XGISP31。
·配置中断源。欲将某中断提交给XGATE处理,则将中断配置寄存器的RQST置位;同时可以设置中断配置寄存器ILVL[2:0]域为其配置适当的优先级。
·启动XGATE。置XGATE控制寄存器XGMCTL中的XGE位为1以启动XGATE。通常也将XGIE位置1以使能XGATE对CPUl2X的中断。
结语
外设协处理器XGATE显著增强了S12XMCU系统的整体性能。S12X MCU片上几乎所有的外设中断均可交给XGATE处理。XGATE的编程实际就是为XGATE写一组中断服务程序。XGATE的配置和启动也比较方便,主要是恰当地设置几个核心的XGATE寄存器。