MPC8533E网络处理器:L2缓存与内存管理架构深度解析
1. MPC8533E:一个网络处理器的“心脏”与“骨架”
在嵌入式网络设备的世界里,比如我们日常接触到的企业级路由器、防火墙或者网络存储设备,其核心处理能力往往取决于一颗高度集成的片上系统(SoC)。MPC8533E,作为飞思卡尔PowerQUICC III家族中的一员,就是这样一颗经典的网络处理器。它不像我们手机里的应用处理器那样追求极致的单核性能或图形渲染,它的设计哲学是“全能”与“均衡”——在有限的功耗和成本下,高效地处理海量的网络数据包、执行复杂的协议转换,并管理多种高速外设。
当你拆开一台老牌厂商的中端网络设备,有很大概率会发现它的主板上静静躺着一颗MPC8533E或其兄弟型号。这颗处理器之所以能胜任这些任务,关键在于其内部精密的“分工协作”体系。我们可以把它想象成一个微型城市:e500核心是城市的决策中心(CPU),L2缓存是紧邻决策中心的高速物流枢纽(Cache),DDR内存控制器是连接外部大型仓库(主内存)的主干道,而各种外设控制器(如以太网、PCIe)则是通往不同功能区域(网口、扩展卡)的专业高速公路。MPC8533E的卓越之处,在于它将这些组件通过一个名为OCeaN的非阻塞交叉开关互联起来,并配备了地址转换与映射单元(ATMU)这样的智能交通调度系统,使得数据能在“城市”内部高效、有序地流动,避免拥堵。
理解MPC8533E,特别是其L2缓存和内存管理机制,不仅仅是阅读一份技术手册。对于嵌入式工程师而言,这意味着你能在系统设计时做出更优的决策:如何配置缓存策略以提升报文转发性能?如何规划内存地址映射以减少访问冲突?如何让DMA引擎与处理器核心高效协同工作?这些问题的答案,都藏在这颗处理器的架构细节之中。接下来,我将结合手册内容和实际工程经验,为你深入解析这颗经典处理器的“心脏”与“骨架”。
2. L2缓存架构深度解析:不只是更大的一级缓存
在许多处理器设计中,L2缓存常常被简单地视为一个容量更大、速度稍慢的L1缓存备份。但在MPC8533E这类面向数据吞吐的处理器中,L2缓存被赋予了更多战略性的职责。它不仅是e500核心的“数据后援”,更是整个系统数据一致性的“协调中心”和I/O数据预取的“缓冲区”。
2.1 核心组织与访问机制
MPC8533E的L2缓存容量为256KB,这是一个在性能与芯片面积间取得平衡的经典尺寸。它的组织方式是8路组相联,共有1024个组。这意味着主内存中的一个地址,只能被映射到L2缓存中1024个特定位置(组)中的某一个,而在这个组内,它有8个可能的“车位”(路)可以存放。这种设计是直接映射和全相联之间的折衷,既能有效减少缓存冲突,又不会使查找电路过于复杂。
每个缓存行的大小是32字节。为什么是32字节?这通常与内存总线的突发传输长度以及典型的数据结构大小有关。在嵌入式网络处理中,一个以太网帧的头部、一个TCP/IP协议栈的常用数据结构,其大小往往与32字节或其倍数对齐,这样的行大小能提高数据装载的效率。缓存采用伪最近最少使用(Pseudo-LRU)算法进行替换。与精确的LRU相比,伪LRU通过维护一个简化的状态树来近似“最久未使用”的判断,硬件实现更简单,开销更小,在大多数访问模式下仍能保持很高的命中率,这是工程实践中的典型取舍。
注意:伪LRU算法在极端顺序访问模式下(如顺序扫描一个大数组)可能表现不如精确LRU,但对于网络处理常见的随机、跳跃式数据访问(如查找路由表、处理协议头),其性能差异微乎其微。在配置系统时,无需过度担心此点。
所有对L2缓存的访问都是全流水线化的。这意味着处理器可以像工厂流水线一样,在每个时钟周期都启动一次新的加载或存储操作,即使前一次操作尚未完成。这实现了单周期吞吐量,对于需要连续处理数据包的场景至关重要。手册中特别提到,在发生一次加载未命中(Load Miss)后,缓存可以继续服务其他命中请求,实现了“命中下未命中”(Hit Under Miss)的能力。这避免了处理器因一次缓存缺失而完全停滞,提升了整体效率。
2.2 灵活的数据分配与锁定策略
L2缓存的灵活性体现在其可配置的数据分配策略上。它不仅可以缓存来自核心的指令和数据,还能被配置为仅缓存指令、仅缓存数据或两者都缓存。这在实时性要求高的系统中非常有用。例如,在一个确定性要求极高的控制任务中,工程师可能会选择只缓存指令,而让所有数据访问直接穿透到内存,以确保数据访问延迟是恒定且可预测的,尽管这会牺牲一些性能。
更强大的特性是它对外部主设备(如DMA、网络控制器)的支持。这些I/O设备可以通过两种方式主动将数据“塞进”L2缓存:
- 通过可编程地址范围:工程师可以预先设置一段内存地址范围(例如,用于存放网络报文描述符或频繁访问的共享数据区)。任何对该地址范围的访问,都会被硬件自动分配并锁定(可选)在L2缓存中。
- 通过特殊事务类型(存储,Stashing):I/O设备在发起DMA传输时,可以通过总线事务携带一个特殊标志,指示本次传输的数据应直接存入L2缓存。
这个特性对于网络加速至关重要。例如,以太网控制器(eTSEC)接收到一个数据包后,其缓冲区描述符(Buffer Descriptor)和报文头可以通过这种方式被直接“推送”到L2缓存。当核心处理器需要处理这个包时,它第一次访问描述符和包头就能在L2中命中,极大地减少了处理延迟,提升了每秒可处理的包数量(PPS)。
缓存行的锁定机制是另一个亮点。锁定可以针对指令和数据分别进行。你可以通过核心指令、外部读写访问或对特定内存地址范围的访问来设置或清除单个缓存行的锁。甚至,可以通过写L2配置寄存器来一次性“闪清”所有指令锁或数据锁。为什么需要锁定?设想一个场景:一段关键的、决定性的中断服务程序(ISR)代码或一个实时任务最频繁访问的数据集。通过将它们锁定在L2中,可以确保无论缓存如何动荡,这些关键资源永远以最快的速度可用,避免了因被替换出缓存而引入的不可预测延迟。这对于网络设备保证低抖动、高确定性的报文转发性能意义重大。
2.3 可靠性设计:ECC与奇偶校验
在要求7x24小时不间断运行的网络设备中,内存子系统的可靠性不容有失。MPC8533E的L2缓存为此提供了双重保护:
- 数据阵列:采用错误校验与纠正(ECC)。ECC不仅能检测错误,还能自动纠正单比特错误,并检测双比特错误和整个半字节(4比特)内的错误。这有效防止了因宇宙射线、电磁干扰等引起的软错误导致系统静默数据损坏或崩溃。
- 标签阵列:采用奇偶校验(Parity)。标签存储的是地址信息,其损坏的后果比数据损坏更严重(可能导致访问到错误的内存位置)。奇偶校验成本较低,能检测单比特错误,通常配合错误发生时令缓存行失效的机制来保证安全。
当L2被配置为内存映射SRAM模式时(即不作为缓存使用),这片内存同样享受全字节访问能力和ECC保护。对��小于缓存行(32字节)的写入,控制器会执行“读-修改-写”事务来确保ECC校验位的正确更新。这种模式可用于存放对延迟极度敏感或需要绝对地址确定性的代码或数据。
3. 内存管理子系统:构建高效的数据通路
如果说L2缓存是处理器内部的“高速枢纽”,那么内存管理子系统就是连接处理器与外部世界、并规划内部数据流向的“交通总署”。MPC8533E在这方面的设计充分体现了其面向通信和嵌入式应用的基因。
3.1 DDR SDRAM控制器:主存的守门人
MPC8533E集成的DDR/DDR2 SDRAM控制器是系统主内存的接口。它支持高达16GB的内存容量,通过4个片选信号管理最多4个内存条(DIMM)或直接贴装的存储芯片。
关键特性与实战配置:
- 页模式(Page Mode)与预充电管理:控制器支持保持SDRAM页激活状态以进行流水线式突发访问。它最多可同时保持16个(DDR)或32个(DDR2)页为打开状态。这能显著降低页命中的访问延迟。在配置内存控制器时序参数(如
tRAS,tRCD,tRP)时,需要根据具体使用的内存芯片颗粒手册来设置。一个常见的优化是,对于顺序访问较多的应用,可以适当增加同时打开的页数;而对于随机访问,则可能需要更积极的预充电策略来避免冲突。 - ECC内存支持:与L2缓存类似,DDR控制器也支持ECC。这对于需要高可靠性的网络和存储应用是必选项。启用ECC后,系统会使用额外的内存颗粒来存储校验位(例如,64位数据位对应8位ECC位)。在硬件设计阶段,就必须在PCB上预留这些颗粒的位置和走线。
- 电源管理与数据保护:控制器支持通过断言
MCKE信号动态地将内存置于低功耗自刷新模式。更重要的是,它提供了两种机制来支持电池备份内存(在掉电时保持数据):- 硬件方式:连接一个外部电压检测芯片到处理器的中断引脚。当检测到掉电时,触发中断,中断服务程序会立即设置DDR控制器中的一个位,强制内存进入自刷新模式。这种方式响应最快。
- 软件方式:DDR控制器有一个可由软件直接置位的寄存器位,也能立即触发自刷新。这种方式更灵活,但依赖于软件能及时执行。 此外,初始化绕过功能允许系统在异常关机后重新上电时,跳过冗长的内存初始化过程,假设内存内容仍然有效,这可以加快系统恢复速度,但需要软件确保在异常关机时内存内容确实是完整的。
3.2 地址映射与转换(ATMU):灵活的虚拟化基石
MPC8533E拥有一个非常灵活的36位物理地址空间。其核心是地址转换与映射单元(ATMU)和本地访问窗口(Local Access Window)机制。
本地访问窗口定义了处理器本地36位地址空间到各个目标接口(如DDR控制器、本地总线、PCI控制器)的映射关系。你可以把它想象成一张静态的“内部地图”,告诉处理器:“地址0x0到0x80000000这片区域归DDR内存管;地址0xA0000000开始的256MB区域映射到PCI总线……” 每个窗口可以独立配置基地址、大小和目标。手册中的例子清晰地展示了如何将DDR、本地总线Flash、PCI空间等划分到不同的地址段。
ATMU则更加强大,它负责处理本地地址与外部更大地址空间(如PCI Express的64位地址空间)之间的转换。它分为出站(Outbound)和入站(Inbound)窗口:
- 出站ATMUs:当处理器或DMA引擎要访问PCIe设备上的内存时,ATMU将本地36位地址转换为PCIe总线认识的64位地址,并可以附加事务属性(如优先级、是否可缓存)。
- 入站ATMUs:当PCIe设备要发起DMA操作访问处理器的系统内存时,入站ATMU将PCIe地址转换成本地地址,并确定这个访问应该交给哪个目标(DDR还是本地总线),同时赋予其访问属性。
实战心得:规划地址映射是系统软件(特别是Bootloader和内核早期初始化)的关键任务。一个常见的陷阱是地址窗口重叠或留有“空洞”(未映射区域),这会导致访问时产生机器检查异常。建议在系统初始化代码中,以表格或数组的形式清晰定义所有地址窗口的配置,并添加严格的边界检查。例如,在U-Boot这类Bootloader中,这些配置通常体现在board/freescale/mpc8533ds/这类板级支持包的头文件或C文件中。
3.3 数据一致性模块(ECM):维护缓存与I/O的秩序
在多主设备系统中(处理器核心、DMA、网络控制器等都能发起内存访问),维护数据一致性是头等大事。e500一致性模块(ECM)就是MPC8533E中的“交通警察”和“调度中心”。
它的核心功能是监听(Snooping)。当I/O设备(通过PCIe、本地总线等)发起一个对可缓存DDR内存的访问时,这个事务会经过ECM。如果该事务被标记为全局(Global,GBL位被设置),ECM就会去“监听”e500核心和L2缓存之间的总线。如果发现缓存中有一份该地址数据的副本,并且是“脏”的(已被修改但未写回内存),ECM就会确保要么让I/O设备读取到最新的缓存数据,要么在I/O设备写入前先将缓存数据写回内存,从而保证所有主设备看到的数据是一致的。
重要提示:并非所有经过ECM的事务都是全局的。只有显式标记为全局的事务才会触发一致性监听。非全局事务将ECM仅仅当作一个通往目的地的简单通道。在编写DMA驱动或配置I/O控制器时,必须根据数据共享情况正确设置事务的全局属性。错误地设置可能导致数据损坏(缓存与内存不一致)或性能下降(不必要的监听开销)。
ECM本身也是一个非阻塞的交叉开关结构,它和OCeaN交换网络协同工作,确保了处理器核心、L2缓存、DDR控制器以及各种高速I/O端口之间的数据流能够高效、无阻塞地并行传输。
4. 关键外设集成与协同工作
MPC8533E的“全能”还体现在其丰富的外设集成上,这些外设不是孤立的,而是通过精密的架构与内存、缓存子系统紧密耦合。
4.1 增强型三速以太网控制器(eTSEC)
这是MPC8533E作为网络处理器的灵魂。两个eTSEC控制器支持10/100/1000 Mbps速率,并集成了硬件TCP/IP卸载引擎。
- 硬件加速:eTSEC可以在硬件层面解析以太网帧(L2)、IP包(L3)甚至TCP/UDP段(L4)。在接收方向,它能进行IP头部校验和验证、TCP/UDP载荷校验和验证;在发送方向,它能生成这些校验和。这能将CPU从繁重的校验和计算中解放出来,专注于路由、过滤等更高层的逻辑。
- 队列管理与流量整形:支持基于优先级的加权轮询队列调度。发送方向有8个队列,接收方向则通过查表策略,可以将数据包分发到64个虚拟接收队列上(覆盖在8个物理队列之上)。这为实现服务质量(QoS)和流量管理提供了硬件基础。例如,可以将VoIP流量映射到高优先级队列,确保其低延迟。
- 帧分类与过滤:可以根据多达16个帧头字段(如VLAN ID、IP源/目的地址、TCP端口号)进行灵活的帧分类和过滤,甚至支持帧丢弃。这在防火墙、入侵检测等安全应用中非常有用。
- 包FIFO模式:这是一个容易被忽略但强大的特性。eTSEC可以绕过以太网MAC层,直接使用其物理接口引脚作为高速、全双工的包FIFO接口。此时,它不再处理以太网帧,而是直接传输原始的IP包(可带32位CRC)。该接口同步工作,频率可达200MHz,提供���达3.2 Gbps的全双工吞吐量。这个模式可用于连接一个外部的网络处理器或FPGA,实现定制化的数据平面处理。
配置要点:在驱动中启用TCP/IP加速功能通常需要正确设置缓冲区描述符(Buffer Descriptor)中的相关控制位,并可能需要对控制器进行特定的模式配置。错误的配置可能导致校验和错误或性能不升反降。
4.2 集成安全引擎(SEC)
MPC8533E(注意,MPC8533型号没有此引擎)集成了一个可编程的安全加速引擎,专门用于处理IPSec、SSL/TLS、SRTP等安全协议中的加解密、认证算法。
- 流水线与并行处理:SEC内部有多个独立的加密执行单元(如AESU、DEU(DES/3DES)、MDEU(消息摘要)、PKEU(公钥运算)等),通过一个控制器和多个加密通道进行调度。它可以安排数据包在这些单元间流水线作业,甚至对单个数据包执行多算法操作(如3DES加密后再进行HMAC-SHA1认证)时,只需单次数据传递,极大提升了吞吐量。
- 与软件栈的集成:SEC的驱动通常集成在操作系统(如Linux)的加密框架(如Crypto API)中。应用程序通过标准的接口(如OpenSSL)调用加密函数时,内核会自动将任务卸载到SEC硬件上执行。在配置内核时,需要确保相关的驱动模块(如
cryptodev、talitos——这是飞思卡尔安全引擎的驱动名)被正确编译和加载。
4.3 PCI Express与本地总线控制器
- PCI Express:提供高带宽、点对点的串行连接。MPC8533E的PCIe接口可配置为根复合体(Root Complex)或端点(Endpoint),支持x4和x1链路宽度。它支持消息信号中断(MSI),这是一种比传统引脚中断更高效的中断方式。在作为根复合体连接外部网卡、存储控制器等设备时,需要正确配置RC的配置空间,并处理好地址映射(通过出站ATMU窗口)。
- 本地总线控制器(LBC):这是一个非常灵活的低速、并行总线接口,用于连接Flash、SRAM、FPGA或旧式外设。它支持三种操作模式:
- 通用片选机(GPCM):用于异步设备,如NOR Flash、SRAM。配置简单,主要是设置建立、保持、等待时间。
- 用户可编程机(UPM):通过向一个内存阵列写入模式字,可以生成几乎任何定制的时序,用于连接同步DRAM、定制ASIC或DSP接口。这是LBC最强大但也最复杂的功能,需要仔细计算时钟周期。
- SDRAM控制器:用于连接传统的同步DRAM芯片。
避坑指南:在调试LBC连接的Flash启动时,最常见的问题是时序配置不当。如果GPCM的CSn、WE、OE等信号时序与Flash芯片的数据手册不匹配,会导致读取错误,系统无法启动。务必根据Flash芯片的tACC(地址到数据输出延迟)、tOE(输出使能时间)等参数,结合系统时钟频率,精确计算并设置LBC相关寄存器的值。通常,在Bootloader的板级初始化代码中,这是最早需要正确配置的部分之一。
5. 系统级设计考量与实战问题排查
基于MPC8533E设计一个完整的系统,远不止是理解各个模块。如何让它们协同工作,并解决实际开发中遇到的问题,才是真正的挑战。
5.1 时钟与电源管理
MPC8533E的时钟树相对清晰:外部输入SYSCLK,经过平台PLL倍频后产生平台时钟(与DDR数据率同频,如666MHz),L2缓存也运行在此频率。e500核心则使用平台时钟作为其核心PLL的输入,进一步倍频得到更高的核心时钟。
电源管理支持四种模式:全速运行(Full On)、打盹(Doze)、小睡(Nap)和睡眠(Sleep)。在打盹模式下,核心暂停指令执行,但缓存监听和时基中断仍有效,外设全功能运行。这适用于等待外部事件的场景。小睡模式会关闭核心的大部分时钟,停止监听,外设仍运行。睡眠模式则关闭核心和几乎所有I/O接口的时钟,仅保留中断控制器和电源管理逻辑,功耗最低。
实战建议:在编写电源管理驱动时,需要仔细评估从低功耗模式唤醒的延迟是否满足应用需求。例如,一个处理实时网络包的系统可能只适合使用打盹模式,因为从小睡或睡眠模式唤醒并恢复上下文的时间可能过长,导致丢包。
5.2 启动流程与引导配置
MPC8533E的启动方式灵活。上电后,硬件复位信号释放时,会采样特定的配置引脚来决定是否启用引导序列器(Boot Sequencer)。如果启用,序列器会通过I2C接口从外部串行EEPROM中读取配置数据,并加载到处理器的配置寄存器中,在此期间核心保持复位。这允许在核心运行前就配置好一些关键的硬件参数(如DDR时序、地址映射)。如果不启用,核心将直接退出复位,并从默认的地址(通常是本地总线CS0片选的空间顶部)获取启动代码。
常见问题排查表:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 系统上电后无任何输出,核心似乎未启动。 | 1. 时钟未正确提供。 2. 电源轨电压不正常。 3. 复位电路有问题。 4. Boot ROM配置错误或无法访问。 | 1. 用示波器测量SYSCLK输入引脚是否有稳定时钟。2. 测量核心电压、DDR电压等所有电源引脚。 3. 检查复位引脚的电平时序。 4. 检查配置引脚(如 BOOT_SEL)的电平是否正确。用逻辑分析仪或示波器抓取本地总线在复位释放后的波形,看是否有读Flash的周期。检查Flash芯片的片选、读使能信号是否动作。 |
| DDR内存初始化失败,U-Boot卡在“DRAM:”信息处。 | 1. DDR控制器时序参数配置错误。 2. PCB布线导致信号完整性差。 3. 内存颗粒型号不兼容或损坏。 | 1. 仔细核对U-Boot中board/freescale/.../ddr.c文件里的时序参数(timing_cfg_1/2,sdram_cfg等),与内存颗粒数据手册逐项对比。2. 使用更保守的时序(增加 tRCD,tRP等)。检查PCB的DDR走线是否满足长度匹配、阻抗控制要求。3. 尝试更换内存条或颗粒。 |
| 网络接口(eTSEC)无法连接或性能极差。 | 1. RGMII/MII等接口时钟与数据相位不对齐。 2. 以太网PHY芯片未正确初始化或损坏。 3. 驱动中缓冲区描述符环配置错误。 4. 硬件加速未启用或配置错误。 | 1. 检查RGMII接口的RX_CLK/TX_CLK与数据线的时序关系,可能需要调整RGMII_TXID/RGMII_RXID寄存器中的延迟设置。2. 通过MDIO接口读取PHY芯片的寄存器,确认其链路状态、自协商结果。 3. 检查驱动中分配的DMA缓冲区地址是否在缓存一致性范围内(通常需要是非缓存或回写写通内存)。确保描述符环的“空”和“已用”状态管理正确,避免溢出。 4. 在驱动中确认 TSEC_ECNTRL等寄存器中的加速位(如TBILL_AC)已使能。 |
| PCIe设备枚举失败或无法访问。 | 1. PCIe链路训练失败。 2. ATMU出站/入站窗口未正确配置。 3. 设备BAR空间与处理器地址映射冲突。 | 1. 读取PCIe控制器的链路状态寄存器,确认链路宽度和速度是否达到预期。 2. 在U-Boot或内核早期,检查并打印ATMU窗口的配置寄存器,确保为PCIe设备分配的地址空间已正确映射,且属性(如可预取、类型)设置正确。 3. 确保内核为PCIe设备分配的BAR空间地址不与系统其他内存区域重叠。 |
| 启用SEC加速后,系统运行加密业务时出现卡死或数据错误。 | 1. SEC驱动(talitos)与内核版本或配置不兼容。 2. 描述符链构建错误。 3. 内存一致性处理不当。 | 1. 确认使用的内核包含了正确版本和配置的talitos驱动。检查dmesg日志中SEC初始化是否成功。 2. SEC操作依赖于描述符链。确保描述符的内存是缓存一致的(通常需要 dma_alloc_coherent分配),并且描述符中的指针、长度、指令字段设置正确。3. 确保输入和输出数据缓冲区也使用了DMA一致性内存。 |
5.3 性能优化经验谈
- L2缓存策略调优:对于网络转发应用,可以将报文描述符环和频繁访问的流表项所在的地址范围,通过L2缓存锁定或“存储”机制,强制保留在缓存中。对于指令,可以将关键的中断处理路径和转发函数锁定。
- DMA与缓存一致性:当使用DMA引擎或eTSEC的DMA进行数据传输时,务必处理好缓存一致性。对于DMA源/目标缓冲区,通常有两种选择:
- 使用非缓存(Cache Inhibit)内存区域。简单安全,但每次CPU访问数据都会直接访问内存,较慢。
- 使用回写写通(Write-Back/Write-Through)内存,并在DMA操作前后手动调用缓存维护指令(如
dcbf刷新,dcbst存储,icbi无效指令缓存)。性能更高,但编程更复杂,容易出错。Linux内核的dma_map_single/dma_unmap_single等API帮我们封装了这些细节。
- 中断平衡:MPC8533E的可编程中断控制器(PIC)支持多优先级。将高吞吐、低延迟的网络收发包中断分配到较高的优先级,而将管理性、周期性的任务(如统计信息更新)分配到较低优先级,可以改善系统响应性。
- OCeaN交换网络监控:虽然手册没有提供直接的性能计数器,但在设计高负载应用时,需要意识到OCeaN是共享资源。如果多个高速端口(如两个千兆以太网和PCIe)同时满负荷工作,可能会在交换网络内部产生竞争。合理的系统设计应避免所有高带宽数据流同时穿越交换网络的核心交叉点,可以通过调整数据流向或使用多个交换网络端口来分散负载。
回望MPC8533E,它诞生于一个多核处理器尚未普及、但网络数据洪流已初现端倪的时代。它的设计精髓在于“集成”与“均衡”,通过将CPU、缓存、内存控制器、网络加速、安全引擎、高速总线等关键组件深度整合,并辅以灵活的地址映射和一致性管理,为单核处理器赋予了处理复杂网络任务的能力。尽管如今更强大的多核ARM或Power架构处理器已成为主流,但理解MPC8533E这样的经典设计,其价值在于掌握那些跨越具体芯片型号的通用嵌入式系统设计思想:缓存与内存的权衡、总线与互联的设计、硬件加速的运用,以及软硬件协同的调试方法。这些经验,在面对任何一款嵌入式处理器时,都是相通的。
