1. 项目概述与核心价值
在80年代末到90年代初的嵌入式与桌面计算领域,Motorola的MC680x0系列处理器凭借其强大的性能和清晰的架构,成为了工作站和高端嵌入式系统的核心。然而,随着图形处理、科学计算和CAD/CAM等应用对浮点运算能力的需求激增,单一的整数处理单元(MPU)已显得力不从心。正是在这样的背景下,MC68881和其升级版MC68882浮点协处理器(FPCP)应运而生,它们并非简单的“外设”,而是通过一种精巧的硬件接口协议,无缝地扩展了主处理器的指令集,使其能够直接执行高精度的浮点运算。
这个接口设计的核心价值,在于它实现了“透明加速”。对于软件开发者而言,他们无需关心底层硬件是单核还是多核,只需使用标准的MC680x0浮点指令,系统便会自动将任务分派给FPCP执行。这种设计哲学,与现代的GPU加速或AI协处理器有着异曲同工之妙——将专用、复杂的计算任务卸载给更擅长的硬件单元,从而释放主处理器的资源,专注于流程控制和逻辑处理。对于硬件工程师来说,理解FPCP的接口逻辑,是构建一个高性能、高可靠性MC680x0系统的关键一步。它不仅仅是一堆引脚和信号的连接,更是一套关于总线仲裁、数据对齐、握手协议和时序控制的完整工程实践。
本文将深入拆解MC68881/MC68882 FPCP与MC68020/MC68030(作为协处理器)以及MC68000/68008/68010(作为外设处理器)的接口设计。我们将从最根本的总线连接原理讲起,剖析不同数据总线宽度(32位、16位、8位)下的硬件配置差异,解读关键控制信号(如CS、AS、DS、DSACKx)的时序要求,并最终探讨如何通过软件模拟协议,让不支持原生协处理器接口的MC68000系列也能调用FPCP的强大算力。无论你是正在维护一个经典系统的工程师,还是对早期计算机体系结构充满兴趣的爱好者,这篇文章都将为你提供一份从原理到实操的详尽指南。
2. 接口设计的核心思路与方案选型
2.1 协处理器与外设处理器:两种模式的本质区别
在深入接线图之前,必须首先理解FPCP与主处理器交互的两种根本模式:协处理器(Coprocessor)模式和外设处理器(Peripheral Processor)模式。这两种模式决定了硬件连接和软件驱动方式的根本不同。
协处理器模式(用于MC68020/MC68030):这是最高效、最“原生”的连接方式。MC68020/30的指令集中预留了“协处理器接口”的空间。当主处理器遇到一条以“F”开头的浮点指令(如FMUL,FADD)时,它不会尝试自己执行或触发异常,而是通过一组专用的CPU空间周期(Cp=4)与FPCP通信。在这个模式下,FPCP被映射到主处理器的地址空间中一个特定的“窗口”,主处理器通过读写这个窗口内的特定寄存器(称为协处理器接口寄存器,CIR)来向FPCP发送命令、传递操作数并获取结果。整个过程由硬件自动管理,对软件完全透明,效率极高。
外设处理器模式(用于MC68000/68008/68010):早期的MC68000系列处理器没有内置协处理器接口。因此,FPCP不能以“伙伴”的身份被直接寻址,而只能像一块内存或一个I/O设备一样,被挂接在系统的数据地址空间上。当主处理器执行一条浮点指令时,会触发一个“F-line仿真器陷阱”(异常向量号11)。陷阱处理程序(一段软件)必须完全模拟MC68020的协处理器接口协议:它需要手动生成正确的总线周期,向FPCP的“外设”地址写入命令字和操作数,并读取状态和结果。显然,这种模式的软件开销大,性能低于原生协处理器模式。
选择哪种模式,不取决于FPCP本身,而取决于你使用的主处理器型号。如果你的系统基于MC68020或MC68030,那么毫无悬念应该采用协处理器模式以获得最佳性能。如果基于MC68000/08/10,则只能采用外设处理器模式,并需要编写相应的陷阱处理程序。
2.2 数据总线宽度配置:SIZE与A0引脚的关键作用
FPCP是一个内部拥有80位浮点寄存器的强大计算单元,但它与外部世界通信的数据通路宽度是可配置的,以适应不同系统总线的需求。这个配置通过两个引脚完成:SIZE和A0。这是一个非常关键且容易出错的硬件设置点。
- 32位总线模式:这是性能最高的模式。配置方法是将SIZE引脚接高电平(VCC),同时将A0引脚也接高电平(VCC)。在此模式下,FPCP的32位数据总线(D31-D0)与主处理器的32位数据总线直接对应连接。每个长字(32位)的传输在一个总线周期内完成,效率最高。
- 16位总线模式:当系统数据总线为16位时(例如某些MC68000系统),需要将SIZE引脚接VCC,而A0引脚接低电平(GND)。此时,FPCP内部仍按32位处理数据,但对外部表现为16位端口。为了实现32位数据的传输,必须将FPCP的低16位数据线(D15-D0)与高16位数据线(D31-D16)对应短接(即D0连D16,D1连D17,…,D15连D31)。这样,当主处理器进行一个32位访问时,FPCP会将其拆分成两个连续的16位访问,通过同一组物理数据线完成传输。
- 8位总线模式:对于MC68008这类只有8位数据总线的系统,需要将SIZE引脚接GND。A0引脚在此模式下未使用(可接固定电平)。此时,需要将FPCP的最低8位数据线(D7-D0)与D15-D8、D23-D16、D31-D24全部短接(即D0连D8、D16、D24;D1连D9、D17、D25;…)。一个32位数据的传输需要四个连续的8位总线周期。
注意事项:总线匹配是硬件稳定的基石错误的总线宽度配置是导致系统无法识别FPCP或数据读写错误的常见原因。务必根据你的主处理器和系统主板的数据总线宽度,准确设置SIZE和A0引脚的电平,并完成对应的数据线“折叠”连接。在16位和8位模式下,数据线的短接必须在FPCP的引脚附近完成,确保信号完整性。
2.3 芯片选择(CS)逻辑:地址空间的映射艺术
无论是协处理器模式还是外设模式,FPCP都需要一个芯片选择(CS)信号来激活。这个信号由地址解码逻辑产生,决定了FPCP在系统地址空间中的“位置”。
- 在协处理器模式(MC68020/30)下:FPCP通过CPU空间周期(FC2-FC0=100b或101b)访问,它不占用常规的内存或I/O地址空间。因此,CS信号应由主处理器的功能码(FC2-FC0)和地址线的高位(A19-A16)共同解码产生,具体地址值由主处理器在CPU空间周期内给出。这意味着,系统中可以同时存在多个不同类型的协处理器(如MMU、FPCP),它们通过不同的CPU空间类型码区分。
- 在外设处理器模式(MC68000/10)下:FPCP被当作一个内存映射设备。CS信号应由常规的地址线(如A23-A1,具体范围由设计者决定)解码产生,将其映射到 Supervisor 或 User 数据空间。对于MC68010,由于其支持
MOVES指令,可以模拟CPU空间访问,因此其CS解码逻辑可以与MC68020系统类似,但这增加了软件复杂性。更常见的做法是将其映射到数据空间的一个特定地址区域。
实操心得:CS信号的时序要求数据手册中的AC电气特性对CS信号的建立和保持时间有严格要求。特别是在高速系统(如25MHz、33MHz)中,地址解码逻辑的延迟必须足够小,以确保在AS或DS信号有效之前,CS信号已经稳定有效。一个常见的做法是使用高速的PAL或GAL器件进行解���,并仔细计算信号在PCB上的传播延迟。如果CS信号到来太晚,可能导致FPCP错过整个总线周期,造成访问失败。
3. 核心信号解析与硬件连接实操
3.1 关键控制信号引脚定义与功能
要成功连接FPCP,必须理解其每一个关键引脚的角色。下面我们抛开电源和时钟(CLK)等常规引脚,聚焦于接口控制的核心信号。
| 引脚组 | 引脚名称 | 方向 | 功能描述 |
|---|---|---|---|
| 地址/数据 | A1-A4 | 输入 | 在协处理器周期内,用于选择内部8个协处理器接口寄存器(CIR)。这相当于FPCP内部的“寄存器地址线”。 |
| D31-D0 | 双向 | 32位数据总线。在16/8位模式下需要按前述规则进行短接。 | |
| 总线控制 | AS | 输入 | 地址选通。主处理器发出,指示地址总线上的地址有效。FPCP在协处理器模式下会锁存A1-A4和功能码。 |
| DS | 输入 | 数据选通。主处理器发出,指示数据总线上的数据有效(写周期)或主处理器已准备好读取数据(读周期)。是总线周期进行的核心信号。 | |
| R/W | 输入 | 读/写指示。高电平表示主处理器要从FPCP读取数据;低电平表示主处理器要向FPCP写入数据。 | |
| 应答与配置 | DSACK0/DSACK1 | 输出 | 数据与尺寸应答。这是FPCP通知主处理器总线周期状态的关键握手信号。它们编码了当前数据端口的大小和传输是否完成: • DSACK1=0, DSACK0=0: 端口为32位,周期结束。 • DSACK1=0, DSACK0=1: 端口为16位,周期结束。 • DSACK1=1, DSACK0=0: 端口为8位,周期结束。 • DSACK1=1, DSACK0=1: 总线周期未结束,插入等待状态。 |
| SIZE | 输入 | 总线宽度配置。接VCC为32/16位模式,接GND为8位模式。与A0共同决定实际宽度。 | |
| A0 | 输入 | 辅助配置。在32位模式接VCC,16位模式接GND,8位模式未用。 | |
| 芯片选择 | CS | 输入 | 芯片选择。低电平有效。当CS为低时,FPCP才会响应总线上的AS、DS等信号。 |
| 特殊功能 | RESET | 输入 | 复位信号。有效时初始化FPCP内部状态寄存器。 |
| SENSE | 输出 | 感应输出。可用于外部电路检测FPCP的存在或型号,通常可悬空或作为额外GND。 |
3.2 32位协处理器模式连接详解
这是最标准的连接方式,适用于拥有32位数据总线的MC68020或MC68030系统。连接关系清晰直接:
总线连接:
- 数据总线:将MPU的D31-D0与FPCP的D31-D0一一对应直连。
- 地址/控制线:将MPU的A1-A4、AS、R/W与FPCP的对应引脚直连。
- 应答线:将MPU的DSACK0和DSACK1与FPCP的DSACK0和DSACK1直连。
- 功能码:将MPU的FC0-FC2连接到FPCP(通常也连接到CS解码逻辑),用于识别CPU空间周期。
- 高位地址线:A16-A31用于CS解码逻辑,以在正确的CPU空间周期选中FPCP。
配置引脚:将FPCP的SIZE引脚和A0引脚都上拉至VCC,将其设置为32位数据总线模式。
CS解码逻辑:这是设计的核心。逻辑电路需要监控FC2-FC0=100b(或101b,表示CPU空间周期),并且当地址线A19-A16上的值为
$2(对于MC68881/2,其协处理器ID为$2)时,产生低有效的CS信号给FPCP。同时,这个CS信号也用于控制其他三态缓冲器。时钟:至关重要!MPU和FPCP的CLK输入必须由同一个时钟源驱动,以确保两者同步。时钟信号的质量(上升/下降时间、占空比)必须满足数据手册(第12.5节)的严格要求,否则会导致间歇性故障。
在这种配置下,当MC68020执行一条浮点指令时,它会自动发起一个CPU空间读写周期,FPCP通过DSACKx信号响应,整个过程无需软件干预。
3.3 16位与8位模式连接的特殊处理
当数据总线宽度小于32位时,连接上需要特殊处理,核心在于数据总线的“折叠”和DSACKx信号的连接。
对于16位模式(连接MC68020/30或作为MC68000的外设):
- 配置:SIZE接VCC,A0接GND。
- 数据线折叠:必须将FPCP的D15-D0与D31-D16在PCB上物理短接。即:D0--D16, D1--D17, ..., D15--D31。然后,将这组短接后的16根线连接到主处理器的16位数据总线(D15-D0)上。
- DSACKx连接:将FPCP的DSACK1与主处理器的DSACK1相连。FPCP的DSACK0在此模式下永不生效,可以悬空或不连。主处理器通过DSACK1=0, DSACK0=1(来自FPCP)来识别这是一个16位端口。
对于8位模式(通常用于MC68008或作为8位外设):
- 配置:SIZE接GND。A0未使用,可接固定电平。
- 数据线折叠:这是最复杂的部分。需要将FPCP的D7-D0分别与D15-D8、D23-D16、D31-D24短接。即:D0连D8、D16、D24;D1连D9、D17、D25;...;D7连D15、D23、D31。最终,这8根线连接到主处理器的8位数据总线(D7-D0)上。
- DSACKx连接:将FPCP的DSACK0与主处理器的DTACK(或DSACK等效信号)相连。FPCP的DSACK1在此模式下永不生效,可以悬空。主处理器通过DSACK0=0, DSACK1=1(来自FPCP)来识别这是一个8位端口。
避坑指南:总线折叠的布局要点数据总线的折叠点应尽可能靠近FPCP的引脚,使用星型连接或小电阻(如22欧姆)进行连接,以避免信号反射和时序问题。切勿简单地让多条PCB走线在远处汇聚到一点,这会导致阻抗不匹配。对于8位模式,建议使用一个小的排阻网络来实现D0-D7到多组引脚的分支连接。
3.4 作为外设处理器连接MC68000系列
当FPCP与MC68000、68008或68010连接时,它不再响应CPU空间周期,而是像一个内存设备一样被访问。硬件连接上,除了上述的总线宽度配置和折叠外,关键区别在于:
- CS解码逻辑:CS信号不再由功能码解码产生,而是由地址线直接解码,将FPCP映射到一段特定的内存地址(例如,
$F00000 - $F0003F)。这个地址区域必须在软件陷阱处理程序中知晓。 - 应答信号连接:
- 对于16位MC68000/68010:将FPCP的DSACK1连接到主处理器的DTACK引脚。DSACK0悬空。
- 对于8位MC68008:将FPCP的DSACK0连接到主处理器的DTACK引脚。DSACK1悬空。
- MC68000系列没有原生的DSACK0/1引脚,它们使用DTACK(数据传送应答)来结束总线周期。FPCP的DSACKx信号在这里起到了产生正确DTACK信号的作用。
- 软件负担:系统需要安装一个F-line异常(向量号
$2C)处理程序。该程序必须解析引起异常的浮点指令,模拟MC68020协处理器协议,通过向FPCP的“内存地址”读写数据来执行操作,最后返回结果。这个过程复杂且耗时,是外设模式性能较低的主要原因。
4. 时序分析与设计要点
4.1 读/写周期时序参数解读
FPCP数据手册第12.6节的AC电气特性表是硬件设计的圣经。我们以20MHz时钟的系统为例,解读几个最关键的时间参数(编号参照手册):
- 6. 地址有效到DS有效(写周期):
t6A最小10ns。这意味着在DS信号变低(有效)之前,地址线(A1-A4等)和R/W(低电平)必须已经稳定了至少10ns。这要求CS和地址解码逻辑的延迟必须足够小。 - 7. AS无效到地址无效:
t7最大50ns。在AS变高后,地���信号至少还要保持50ns的有效时间。这个时间通常由MPU保证,但设计时需要确认。 - 17. DS有效到数据输出有效(读周期):
t17最大45ns。这是FPCP从DS有效到将数据放到总线上的最长时间。主处理器必须等待这段时间后才能锁存数据���这个参数决定了系统在不插入等待状态下的最高访问速度。 - 19. 数据输入有效到DS有效(写周期):
t19最小15ns。在DS变低之前,主处理器必须提前至少15ns将待写入FPCP的数据放到总线上并保持稳定。 - 20. START有效到DSACKx有效:
t20最大70ns。START是一个内部逻辑条件(START = CS • AS • R/W • DS),可以近似理解为总线周期开始的时刻。FPCP必须在70ns内使能DSACKx信号来响应周期。如果FPCP内部忙(例如正在计算),它会通过保持DSACKx为高来插入等待状态,直到操作完成。
设计要点:等待状态的插入参数
t20(DSACKx响应时间)是动态的。如果FPCP正在执行一个长运算(如FDIV),当主处理器试图读取结果时,FPCP会通过不拉低DSACKx来让主处理器等待。硬件设计必须允许这种异步等待。MC68020/30会不断采样DSACKx,直到其有效才结束周期。这意味着你的总线控制器设计必须能处理这种潜在的、不定长的延迟。
4.2 同步与异步周期的区别
FPCP支持两种读周期:异步周期和同步周期。
- 异步周期:用于读写操作数CIR(Command、Condition、Operand等寄存器)。这是最常见的情况。FPCP在DS信号有效后,经过一段延迟(
t17)驱动数据,并同时使能DSACKx信号。 - 同步周期:仅用于读取保存/恢复CIR(Save和Response寄存器)。在此类周期中,FPCP的数据输出和DSACKx信号的产生都与系统时钟(CLK)的下降沿同步。具体来说,DSACKx在CLK下降沿后最多
t26时间(20MHz下55ns)内有效,数据在CLK下降沿后最多t24时间(80ns)内有效。这为高速系统提供了更精确的时序控制。
在硬件设计时,通常按最慢的异步周期来保证时序裕量。但在编写底层驱动(特别是外设模式下的陷阱处理程序)时,了解这两种周期的区别有助于优化代码。
4.3 复位与初始化序列
FPCP的RESET引脚是低电平有效。一个有效的复位脉冲(宽度需满足规范)将初始化FPCP的内部状态:
- 所有浮点数据寄存器(FP0-FP7)变为未定义值。
- 浮点控制寄存器(FPCR)被清零(默认舍入模式为“就近舍入”,所有异常禁用)。
- 浮点状态寄存器(FPSR)被清零。
- 协处理器接口状态被重置。
上电复位流程建议:
- 确保电源稳定。
- 产生一个满足最小脉宽要求的低电平RESET信号(通常需要数个时钟周期)。
- 释放RESET后,等待至少100个时钟周期,再进行第一次协处理器访问,以确保内部逻辑完全稳定。
- 软件上,初始化后应通过
FMOVE指令设置所需的FPCR(如启用某些异常、设置舍入模式)。
5. 软件视角:协议交互与异常处理
5.1 协处理器接口寄存器(CIR)通信协议
即使作为硬件工程师,理解软件如何与FPCP通信也至关重要,这有助于调试硬件问题。所有通信都通过8个内部的32位CIR完成,由A1-A4编码选择:
| A4-A1 | 寄存器名称 | 读写 | 描述 |
|---|---|---|---|
| 0000 | 响应(Response) | 读 | MPU读取FPCP的状态和命令。包含主处理器需要采取的动作(如“取操作数”、“写结果”)。 |
| 0001 | 保存(Save) | 读 | 在上下文切换时,MPU读取FPCP的内部状态(寄存器值)。 |
| 0010 | 恢复(Restore) | 写 | 在上下文切换后,MPU将之前保存的状态写回FPCP。 |
| 0011 | 操作(Operand) | 读写 | 传输指令操作数(源或目的)。 |
| 0100 | 指令地址(FPIAR) | 读写 | 浮点指令地址寄存器。发生异常时,保存引起异常的指令地址。 |
| 0101 | 命令(Command) | 写 | MPU向FPCP写入要执行的浮点指令码。 |
| 0110 | 条件(Condition) | 写 | 对于条件指令(如FDBcc),MPU写入条件信息。 |
| 0111 | 保留 | - | 未使用。 |
一次典型的浮点指令执行(以FMUL为例)流程如下:
- MPU将指令字写入FPCP的命令CIR(A4-A1=0101)。
- MPU从响应CIR(A4-A1=0000)读取一个“响应原语”。假设响应是“取源操作数”。
- MPU根据响应,从内存中读取源操作数,并将其写入FPCP的操作数CIR(A4-A1=0011)。
- MPU再次读取响应CIR。响应可能是“取目的操作数”或“开始计算”。
- 重复步骤3-4,直到所有操作数就绪。
- FPCP开始内部计算。在此期间,如果MPU读取响应CIR,会得到“忙”的响应。
- 计算完成后,MPU读取响应CIR,得到“写结果”的响应。
- MPU从操作数CIR读取结果,并写回内存或寄存器。
- MPU最后读取响应CIR,得到“空操作”响应,表示指令完全结束。
5.2 外设模式下的软件仿真实现要点
对于MC68000系统,上述所有CIR访问都需要软件模拟。F-line陷阱处理程序的大致框架如下:
; 假设FPCP被映射到地址 $F00000 FPCP_BASE EQU $F00000 CIR_OFFSET EQU $00 ; A1-A4通过地址线A5-A2传递,这里假设基地址对齐到16字节边界 FLine_Emulator: ; 1. 保存所有寄存器 MOVEM.L D0-D7/A0-A6, -(SP) ; 2. 获取引起异常的指令地址(从异常堆栈帧中) MOVE.L 2(SP), A0 ; PC地址 MOVE.W (A0)+, D0 ; 读取指令字 ; 3. 解析指令字,判断是哪种浮点指令(FMOVE, FMUL等) ; 4. 根据指令,模拟协处理器协议: ; a. 将指令字写入 FPCP_BASE + (5<<2) (命令CIR) MOVE.W D0, FPCP_BASE+(5<<2) ; b. 循环读取 FPCP_BASE (响应CIR),根据响应原语进行相应操作 ; c. 从内存取操作数 -> 写入操作数CIR ; d. 从操作数CIR读结果 -> 写回内存 ; (这是一个简化的示意,实际协议非常复杂) ; 5. 更新异常返回地址,跳过已处理的指令 ADDQ.L #2, 2(SP) ; 假设是字指令 ; 6. 恢复寄存器并返回 MOVEM.L (SP)+, D0-D7/A0-A6 RTE实操心得:仿真性能优化外设模式性能瓶颈在于频繁的CIR访问(每次访问都是一个慢速的内存读写周期)。优化方法包括:
- 将FPCP映射到快速内存区域:如果系统有零等待状态的静态RAM(SRAM)区域,将FPCP的CS解码到该区域可以显著提升访问速度。
- 编写高效的汇编处理程序:用汇编语言精心编写陷阱处理程序,减少不必要的指令。
- 缓存常用操作:对于某些频繁使用的常数(如0.0, 1.0),可以将其预加载到FPCP的寄存器中。
5.3 异常处理与状态管理
FPCP有丰富的异常处理能力(上溢、下溢、除零、无效操作等)。异常由浮点状态寄存器(FPSR)中的异常状态位和浮点控制寄存器(FPCR)中的使能位共同控制。
异常处理流程:
- 指令执行中发生异常(如除零)。
- FPSR中对应的异常标志位被置位。
- 如果FPCR中对应的异常使能位为1,则FPCP会在响应CIR中返回一个“发生异常”的响应原语。
- 主处理器(或陷阱处理程序)读取此响应,然后通过读取保存CIR来获取FPCP的完整状态帧(包括FPIAR、所有浮点寄存器等),进行异常处理。
- 处理完毕后,通过恢复CIR将状态写回,FPCP可从异常点恢复或终止。
关键寄存器:
- FPCR (浮点控制寄存器):控制舍入模式(就近、向零、正向、负向)和各种异常的使能。
- FPSR (浮点状态寄存器):包含条件码(N, Z, I, NaN)、异常状态标志、商字节(用于余数操作)和累计异常字节。
- FPIAR (浮点指令地址寄存器):当异常使能且发生时,保存引起异常的指令地址,对于调试至关重要。
在系统初��化时,软件通常需要配置FPCR,例如禁用所有异常(用于追求最大速度的应用程序)或启用无效操作和除零异常(用于调试和健壮性要求高的系统)。
6. 调试技巧与常见问题排查
6.1 硬件连接故障排查清单
当FPCP无法正常工作时,可以按照以下清单进行排查:
电源与时钟:
- 测量VCC和GND引脚电压是否稳定在5V±5%。
- 用示波器检查CLK引脚波形,频率、幅值、上升/下降时间(应<5ns)和占空比(40%-60%)是否满足手册要求。
- 检查RESET信号,上电后是否为稳定的高电平。
配置引脚:
- 确认SIZE和A0引脚的电平设置与你的总线宽度完全一致。用万用表测量,不要凭感觉。
- 在16/8位模式下,用万用表通断档仔细检查数据总线的“折叠”连接是否牢固、正确,有无短路或虚焊。
芯片选择(CS):
- 用逻辑分析仪或示波器,在MPU访问FPCP的预期地址(或CPU空间周期)时,检查CS引脚是否有清晰的低电平脉冲。
- 确认CS信号在AS或DS有效前已经建立(满足
t6A等参数)。
总线活动:
- 连接逻辑分析仪,抓取一个完整的浮点指令访问周期。检查AS、DS、R/W、A1-A4、D0-D31(或折叠后的线)的时序关系。
- 重点观察DSACKx信号:在MPU发起读/写后,FPCP是否在合理时间内(参考
t20)拉低了DSACK0或DSACK1?如果DSACKx一直为高,说明FPCP没有响应,检查CS、配置或FPCP是否损坏。
数据线:
- 在写周期,检查MPU驱动到数据总线上的值是否正确。
- 在读周期,检查FPCP是否驱动了数据总线(数据线波形应从高阻态变为确定电平)。
6.2 软件/协议层问题诊断
如果硬件连接无误,但浮点运算结果错误或系统挂起,问题可能出在软件协议层:
初始化检查:确保软件在首次使用FPCP前,已经对其进行了正确的访问(例如,通过读取其CIR来确认存在)。可以尝试写一个简单的测试值到操作数CIR,再读回来验证通信是否正常。
协议顺序错误:严格按照“写命令 -> 读响应 -> 根据响应操作 -> 再读响应...”的顺序进行。在调试时,可以在每个CIR访问后打印出响应原语的值,与手册第7章的描述进行比对。
上下文保存/恢复错误:在多任务系统中,任务切换时必须保存和恢复FPCP的状态(使用FSAVE/FRESTORE指令或模拟它们)。忘记保存FPCP状态是导致任务间浮点计算相互干扰的常见原因。确保保存的状态帧大小正确(MC68881和MC68882的状态帧大小不同!)。
异常处理不完整:如果启用了浮点异常,必须提供完整的异常处理程序。处理程序需要读取FPSR和FPIAR来诊断问题,并妥善清理现场。一个缺失的异常处理程序会导致程序崩溃。
6.3 MC68881与MC68882的细微差异
MC68882是MC68881的工艺改进和性能增强版,引脚和指令集完全兼容,但有以下重要区别:
- 性能:MC68882的流水线更深,多数浮点指令执行速度显著快于MC68881,尤其是在连续指令流中。
- 并发性:MC68882具有更强的指令并发执行能力。例如,它可以在执行一条浮点运算指令的同时,处理另一条浮点数据传送指令(FMOVE)。而MC68881的并发能力较弱。
- 状态帧大小:在执行
FSAVE指令时,MC68882产生的状态帧比MC68881多4个字节。这在进行上下文切换的软件中必须特别注意,分配缓冲区时要按MC68882的大小(96字节)来分配,以保证兼容性。 - 优化代码:为MC68882编写的代码可以通过精心安排指令顺序(例如,将FMOVE指令与计算指令交错),以充分利用其并发特性,从而获得比MC68881更高的性能。
因此,在编写系统软件(尤其是操作系统内核)时,最好能动态检测FPCP型号(可以通过读取未定义寄存器或测试特定指令的时序),并据此选择最优的驱动代码和状态帧大小。