历史上的今天
今天是:2025年08月20日(星期三)
2021年08月20日 | 怎么在S12X上使用XGATE协处理器
2021-08-20 来源:eefocus
介绍
HCS12X微控制器家族相比HCS12家族有许多的增强;其中最重要的增强是XGATE协处理器。XGATE是一个独立于主CPU运行的可编程内核,它可以访问S12X的所有外设,使用的是RISC命令集。这篇应用笔记描述了怎么配置和使用XGATE。
这篇文档先讨论了双核系统中的数据一致性问题以及怎么通过软件来解决这个问题。
接着,在下一个部分,描述了XGATE的多种节能模式并比较了它们的性能和差异。
最后,提供了关于怎么设置和初始化XGATE模块的常用信息和建议。
数据一致性
数据一致性是指一种状态,在这组状态下的数据集合,对于任何想要访问它的进程看来,是一致和完整的。在实践中指的是,如果数据当前正在被修改的话,对数据的访问会被拒绝,所以其实内部并不是一致的。
比如:一个进程往一块内存区域中存入数据并递增一个计数变量,同时另一个进程从这个内存区域中取走数据比递减那个计数变量。典型的代码序列如下。
将变量读入一个内部处理器寄存器
递增或递减变量
把变量写回内存
在一个多任务系统中,中断可能会导致在读取变量之后立刻发生任务切换。这时,变量可能被另一个任务读取,减一,然后写回,这就会导致这个变量处于不一致状态。在单处理器系统中,典型地我们会通过在进入关键的代码序列之前禁用中断,运行完后使能中断以避免不一致。
当使用双处理器架构时,这种方法就没用了。严格来说,几乎所有外设都有这种问题。比如,SCI接收器会在接收到新的字节时填入接收缓冲;同时,CPU可能会读接收缓冲并得到不正确的数据。对于外设,大部分情况下,会使用特殊的标志位来表明是否接收到了数据或者是否可以传输数据了。
简而言之,只要有资源可能被两个以上的进程同时访问,就需要考虑这个问题。
XGATE和HCS12X CPU使用时分复用的方式来访问RAM。在一个S12X CPU周期中(25ns),如果S12X CPU没有访问RAM,XGATE可以以12.5ns周期访问两次RAM;如果S12X CPU访问了RAM的话,那就是XGATE访问一次,S12X CPU访问一次。这个良好的特性同时提高了XGATE和CPU的吞吐量,但是数据一致性的问题也更突出了。
这篇应用笔记描述了许多可以用来解决数据一致性问题的应用相关技术。
简单缓冲区方案
在两个处理器间交换数据同时还能避免数据一致性问题的一种简单的方法是使用一个缓存。两个处理器必须遵守一个底层协议:只有当另一个处理器标识缓冲区为空时,当前处理器才能向缓冲区内写入;只有另一个处理器标识缓冲区满时,当前处理器才能读缓冲区。
传输缓冲区
可以使用这个简单方案的典型应用是LIN传输和SPI主机。使用一个传输缓冲区的流程会是这样的:
CPU填充缓冲区。
CPU通知XGATE模块:可以传输数据啦!(这可以通过,比如,在外设内使能传输请求来实现)
XGATE模块收到一条传输服务请求。
XGATE模块发送数据到外设。
一完成,XGATE就禁用外设的传输请求。
XGATE通知CPU(比如,通过中断)传输已经完成。
现在CPU又可以从步骤1开始了。

图 1.传输或接收缓冲区数据结构
接收缓冲区
从外设中接收数据并存储其到一个缓冲区中的流程也十分相似。然而,要注意的是,在读取缓冲区之前不会再收到新的数据。这对于比如一个LIN节点或者SPI协议并不是问题,因为发送数据实际上是由一个传输进程控制的,即CPU本身控制的。如果接收进程与CPU活动是异步的,就必须使用不同的方法了,如下所示。对于接收进程,可以使用与传输同样的结构。
XGATE为来自外设的一个 接收服务请求 服务。
XGATE模块不断填充缓冲区直到填满预定数量的字节或者接收到了结束标志。
XGATE通知CPU(比如,通过中断)传输已经完成。
CPU从缓冲区中获取数据以进一步处理。
Guard技术
另一种不使用信号量的技术能够实现数据的复写。读取方必须在读取数据前置位一个“guard”,并在完成读序列后验证guard仍然被置位。对比于基于信号量的技术(见后面),这个技术的优点是:读取数据的进程不会被停止,也不需要阻塞中断;而缺点则是数据读取可能会需要重复进行。在一个进程开始填充一个缓冲区之前,变量guard会被递增。 在数据被完整地写入缓冲区后,再次递增变量guard。在 读进程 开始读缓冲区之前,它会创建当前guard的拷贝(OldG)。假设变量guard被初始化为0x0000,则奇数意味着正在进行写操作,所以 读进程 会轮询变量guard直到其变为偶数,这时它也开始读数据。在读取结束后,就对比下新旧guard变量。如果不相等,那么说明在读的过程中发生了写,因此读取的数据有问题。这样,就必须重新读。图2展示了过程。
这个技术不管是XGATE到S12X CPU还是反过来的方向都可以使用。

图 2.Guarding技术 流程图
互斥量(互斥的RAM变量)或信号量
许多情况下,会通过使用互斥量(互斥的RAM变量)或者信号量来避免对同个资源的同时访问。然而,对于S12X CPU和XGATE模块,不可能使用RAM中的 读-修改-写 互斥量或信号量来宣称对任何资源的独占式访问,因为需要花费数个周期以读取一个RAM变量、测试其内容、将修改后的变量写回RAM。在读和写之间,变量是在CPU或者XGATE模块的内部寄存器内转变的。如果这期间另一个模块访问了变量,回写就会导致不一致。XGATE为解决这个问题专门提供了一个8个硬件信号量的集合。这信号量可以处于以下三种状态之一。
未使用,释放状态
赋值给S12X CPU进程
赋值给XGATE进程
在一般的多任务操作系统内使用信号量或类似的东西是可以保证任务能互斥地访问共享资源的。这是由于大部分CPU使用的是不可中断的“读-修改-写”指令,因此变量永远不会处于”转变中”这个状态。HCS12必须通过在 读-修改-写 序列间禁用和使能中断来模拟这个行为,但是HCS12X是有这个专用指令的(BTAS)。
在三种状态间的转换是这样进行的。
设置信号量。
XGATE提供了一个专用的名为SSEM的指令,其以一个3bit立即数或者一个寄存器作为操作数。如果XGATE成功的锁上信号量,就会置位进位标志;如果信号量已经上锁了,就会清零进位标志。
S12CPU经由XGSEM外设寄存器访问信号量,使用下面要说的C语言宏,按两步设置和检查信号量。释放信号量。
XGATE提供了一个专用的名为CSEM的指令,其以一个3bit立即数或者一个寄存器作为操作数以释放信号量。
而S12CPU同样经由XGSEM外设寄存器访问信号量。
这个硬件解决了当同时提交了两个“get”命令时的优先级问题。“release”命令只应该由与信号量相关的进程提交。
#define SET_SEM(x) (XGATE.XGSEM = 0x0101 << (x))
#define TST_SEM(x) (XGATE.XGSEM & 0x0001 << (x))
#define REL_SEM(x) (XGATE.XGSEM = 0x0100 << (x))
do {SET_SEM(2); /* 试着设置信号量2 */
} while (!TST_SEM(2)); /* 不在0..7之间 */
/* 受保护的软件区域开始 */
/* 现在尽快做完要做的事情 */
/* 受保护的软件区域结束 */
REL_SEM(2);
XGATE汇编器中等价的代码
LOOP1: SSEM #2 ; 试着设置信号量2
BCC LOOP1 ; 如果上锁了就重试
.... ; 受保护的软件区域开始
CSEM #2 ; 释放信号量

图 3.信号量的状态转换
FIFO
一个用于解耦两个异步数据流的知名技术是先入先出(FIFO)数据结构。FIFO在有数据流需要接收的时候最为有用,因为字节(或整个消息)可能会被爆发式地传送,比CPU的处理速度都快,尽管全局来看,CPU的性能绝对可以来的及处理平均数据率了。通过使用FIFO,可以大大缓解CPU的压力。典型的例子是在几乎所有个人电脑上都可以找到的16550 UART,它使用16字节FIFO来缓存进入和出去的数据。
任何FIFO的主要问题是,起码需要使用一个bit来给填充FIFO的进程以及提取FIFO的进程使用。这个部分展示了实现一个FIFO的一种方式。基础的数据结构如图4所示。系数putidx展示的是新的对象要放入数据缓冲区的位置。系数getidx展示的是下一个要被读取的对象的位置。在这个例子中,使用了变量num,其代表了FIFO中的实体个数。当然,putidx与getidx的差别也可以用于计算FIFO中实体的个数,专门使用一个变量来存储FIFO中实体的个数是为了简化软件实现。变量num会由填充FIFO的进程递增,由提取FIFO的进程递减,因此它是由两个进程共享的资源。这个示例使用了互斥量来保护关键代码区域,如“互斥量(互斥的RAM变量)或信号量”中所述。

图 4.FIFO数据结构
接收FIFO
下例代码展示了实体大小为一个字节、最多256个实体的FIFO。简单地修改下就能存放更多或者更复杂的实体了。XGATE存储一个字节到FIFO中,同时CPU从里头读取它。
使用XGATE把实体放入FIFO中
; Entry Conditions for this code sequence
; R1 points to data structure
; R2 to hardware (not shown here)
; R3 points to FIFOs data space
; R4 contains the byte to be stored in to the FIFO (also not shown how its loaded)
LDL R5,(R1,#num) ; get number of entries in the FIFO
LDL R7,(R1,#size)
CMP R7,R5 ; check if there is space left
BHI SPACEOK ; at least one item space left
; overflow error can be raised here
; further checks can be made here for high watermarks typically for XON/XOFF protocols
SPACEOK LDL R6,(R1,#putidx) ; get the index where to put this in the buffer
STB R4,(R3,R6+) ; Store byte to buffer an increment put index
CMP R6,R7 ; check on overflow
BLO LBL1
CLR R5 ; cyclical increment
LBL1 EQU *
STB R6,(R1,#putidx) ; bump the next store index
; since the variable items is also updated by the reading side precautions must be
; taken to avoid a clash
; try to set a semaphore
SEMLOP SSEM #FIFOSEM ; try to lock it
BCC SEMLOP
LDB R5,(R1,#num) ; get value again in protected region
INC R5 ; since it might got changed in the mean time
STB R5,(R1,#num) ; update length byte
SIF ; signal to the HCS12 at least one byte is available
CSEM #FIFOSEM ; unlock semaphore, leave protection
; further activities like clearing request flag,...
使用S12 CPU从FIFO中提取字节
; Entry:
; Typically the FIFO might be drained in an interrupt handler
; X register points to the FIFO control structure
; Y points to FIFO Data space
LDAA num,X ; get number of entries
BNE ONEPLUS ; at least one item in FIFO
; underrun error, should never occur
; further comparisons can be made here for a low watermark if e.g. the transmission has
; been blocked using e.g. XON/XOFF protocol
ONEPLUS LDAB getidx,X ; where to pick data from
LDAA B,Y ; get the byte item
; Content of Accumulator A must now be stored into the next level data structure
INCB
CMPB size,X ; check length
BLO LBL1
CLRB ; cyclical increment
LBL1 STAB getidx,X
; now we need to updated the number of items left in the FIFO
; since this can clash with the filling side it must be locked using the
; same semaphore as above
SEMLOP MOVW #$0101< BNE LEFTOVERS ; leave the interrupt asserted MOVB #CLAERIF,XGIF ; clear interrupt in case last entry removed MOVW #$0100< RTS 节能模式 S12X的特点是有许多结合XGATE I/O处理器的节能方式。 为了减少能耗,当XGATE等待新线程启动的时候,XGATE的所有时钟都被关闭。因此,并不需要,如S12 CPU上的,STOP指令。 从整个系统的角度来看,表1中所示的四种节能模式可以被分为两大类:STOP 和 PSEUDO-STOP一类;WAIT 和 RUN一类。 STOP模式和PSEUDO-STOP模式会尽可能的降低能耗,它们会关闭除了少数支持模块外的所有内部时钟。 而在WAIT模式和RUN模式下,大部分的内部时钟分配网(时钟树)依然活跃。 表 1.节能模式 STOP模块 STOP PSEUDO-STOP WAIT RUN 电压调节器 降能耗 降能耗 全性能 全性能 晶体振荡器 停止 降振幅 全驱动 全驱动 VCO 停止 如果时钟监控器探测到故障并且使能了内部时钟模式的话就会运行 如果PLLON和PLLWAI=0或者时钟监控器探测到了故障并且使能了内部时钟模式的话就会运行 如果PLLON或者时钟监控器探测到了故障并且使能了内部时钟模式的话就会运行 PLL 停止 停止 如果PLLON并且PLLWAI=0的话就会运行 如果PLLON的话就会运行 API (内部RC振荡器) 如果APIFE=1就会运行 如果APIFE=1就会运行 如果APIFE=1就会运行 如果APIFE=1就会运行 S12CPU 无时钟 无时钟 无时钟 时钟控制 XGATE 无时钟 无时钟 时钟控制的激活 如果激活的话由时钟控制 RTI 停止 如果PRE=1的话就会运行 如果RTIWAI=0的话就会运行 COP 停止 如果PCE=1的话就会运行 如果COPWAI=0的话就会运行 其他外设模块 停止 停止 大部分模块有个lock Module_Stops_In_Wait 标志位 时钟控制(如果确定使能的话)
史海拾趣
|
SIwave是一个精确的整板级电磁场全波分析工具,它采用三维电磁场全波方法分析整板或整个封装的全波效应。对于真实复杂的PCB板或IC封装,包括多层、任意形状的电源和信号线,SIwave可仿真整个电源和地结构的谐振频率; 为了避免在完成整个设计时产 ...… 查看全部问答> |
|
我是学计算机的,现在主要做的是手机功能测试这一块 虽说比较热门,但是感觉没啥技术含量,而且工资也不高 平时比较闲的话,我就学习C语言,而且基础还不错 其他像数据结构的基础也还可以 我想请教一下,如果做嵌入式开发的话(主要是基于unix ...… 查看全部问答> |
|
求证实MTK将下季度发售TD芯片“武松”,展讯的TD叫“Tiger” 本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 “聯發科明年首季將推出雙核心TD-ASCDMA智慧型手機晶片MT6572TD,名稱就為武松(Wu Song),很明顯是用來與展訊的「Tiger」晶片相抗衡. ,由於武松的四大優勢,包括:處理整合和成本優勢、武松為 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 12:41 编辑 楼主现在遇到了很棘手的一个问题。用AFE5801这个芯片调试的时候,读不出SPI的信号。。。可以读出通用寄存器设置的值,但是读不出TVG寄存器的值。有谁用过这个芯片啊,不吝赐教啊。。。。。谢谢各位啦 ...… 查看全部问答> |
|
看图说话哦 夜以继日地搞着编程!姑且不说累与不累,烦都烦死了。说着简单,但是这个东西慢工出细活的。 有哪位高手用过LINE-SCAN CAMERA? 能否经验指导 [ 本帖最后由 54chenjq 于 2013-7-27 15:26 编辑 ]… 查看全部问答> |
|
读实例程序如下:interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++;// Acknowledge this interrupt to receive more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }请问中断标志位TIF为什么没有清空呢 ...… 查看全部问答> |




