1. 项目概述:为什么我们需要i.MX 8ULP这样的异构处理器?
在嵌入式系统设计领域,尤其是面向物联网边缘节点、可穿戴设备、智能家居中控以及工业HMI(人机界面)等场景时,工程师们长期面临着一个经典的两难困境:性能与功耗的取舍。传统的单核或同构多核处理器,往往在运行富功能操作系统(如Linux)以提供丰富的用户界面和网络服务时,功耗居高不下;而在切换到低功耗模式处理传感器数据或维持基础通信时,又可能因为核心过于“笨重”而无法实现极致的能效比。这就好比让一台重型卡车去送快递,或者让一辆电动自行车去拉货,总有一方不匹配。
i.MX 8ULP处理器的出现,正是为了解决这个核心矛盾。它不是一个简单的性能叠加,而是一套深思熟虑的异构计算架构。简单来说,它把不同的“专业工种”集成在了一颗芯片里。双核的Arm Cortex-A35就像公司的“管理层”,负责处理复杂的、非确定性的任务,比如运行Linux系统、解析网络协议、驱动图形界面。而单核的Arm Cortex-M33则像是“一线操作员”,专精于确定性的实时任务,比如精确控制电机、毫秒级响应传感器中断、运行FreeRTOS这类实时操作系统。两者各司其职,通过高效的消息传递机制(如MU, Messaging Unit)协同工作。
但这还不是全部。为了在特定领域实现极致的能效,i.MX 8ULP还引入了两位“特种兵”:Fusion DSP和HiFi4 DSP。Fusion DSP专为超低功耗的音频前端处理(比如语音唤醒、噪声抑制)优化,可以在主处理器休眠时保持工作,仅消耗微瓦级功耗。HiFi4 DSP则是一个高性能音频和机器学习加速器,能够高效处理语音识别、音频编解码等计算密集型任务,其能效比远高于用通用CPU核心来处理。此外,PowerQuad(数学与DSP加速)和Casper(加密协处理器)这两位“协处理器”进一步卸载了Cortex-M33的负担,让它在处理控制任务的同时,还能高效完成信号处理和安全加密,而无需唤醒功耗更高的A35核心。
这种架构的技术价值在于动态能效管理。系统可以根据任务负载,智能地分配计算资源,甚至关闭暂时不用的核心或整个电源域。例如,在设备待机监听语音指令时,可能只有Fusion DSP和Cortex-M33在运行;当需要图形界面交互时,再快速唤醒Cortex-A35和GPU。这种精细化的功耗控制,使得i.MX 8ULP在提供相当计算能力的同时,能够将功耗控制在传统方案难以企及的水平,特别适合电池供电或对能耗敏感的应用。
2. 架构深度解析:i.MX 8ULP的“五脏六腑”
要真正用好一颗芯片,不能只看广告词,必须深入其内部架构。i.MX 8ULP的框图看起来复杂,但我们可以将其分解为几个关键的功能域来理解,这有助于我们在后续的软硬件设计中做出正确决策。
2.1 核心计算单元:分工明确的“三驾马车”
i.MX 8ULP的计算核心可以清晰地划分为三个域,每个域都有其明确的职责和电源管理策略。
应用处理器域(APD):这是系统的“大脑”,由双核Arm Cortex-A35组成。每个核心配备32KB指令缓存和32KB数据缓存,并共享一个512KB的二级缓存。Cortex-A35是Armv8-A架构中能效比极高的应用处理器,支持Arm Neon SIMD引擎和FPU,擅长处理操作系统、应用软件和复杂算法。该域通常运行Linux或Android这类非实时操作系统,管理文件系统、网络协议栈和图形用户界面。
实时处理器域(RTD):这是系统的“小脑”和“反射弧”,由单核Arm Cortex-M33F核心构成。Cortex-M33是基于Armv8-M架构的实时处理器,同样配备FPU和内存保护单元(MPU)。它的关键特性是低中断延迟和确定的执行时间,专为实时任务设计。该域通常运行FreeRTOS、Zephyr或裸机程序,直接控制外设、处理传感器数据流和执行关键的时间控制循环。两个域之间通过768KB的共享内存(Shared RAM)和多个消息单元(MU)进行高速数据交换与通信。
低功耗音频视频域(LPAV Domain):这是一个相对独立的多媒体子系统。其核心是Cadence Tensilica HiFi 4 DSP,这是一款业界顶尖的音频/语音DSP,主频高达600MHz,集成双路SIMD矢量浮点单元,专门为音频编解码(如MP3, AAC)、语音前端处理(降噪、回声消除)和轻量级机器学习推理(如关键词识别)进行了指令集优化。该域还包含了2D/3D GPU、显示控制器(DCNano)和MIPI DSI/CSI接口,可以独立处理图形渲染和摄像头数据,在不需要A35介入的情况下完成简单的显示刷新或图像处理,进一步节省整体功耗。
2.2 内存与存储子系统:高效的数据高速公路
内存架构是异构计算性能的关键。i.MX 8ULP提供了灵活的内存配置。
内部存储器:
- 768KB共享RAM:这是连接A35、M33和Fusion DSP的“枢纽”。它支持零等待状态访问,是核心间进行大数据块交换(如音频缓冲区、图像帧)的理想场所。在软件设计时,需要精心规划这片内存的分区,避免访问冲突。
- 各核心私有缓存:A35的L1/L2缓存和M33的缓存用于加速各自核心的本地数据访问。
- 安全RAM:位于EdgeLock安全区域内的32KB安全RAM,用于存放密钥、证书等敏感信息,免受非安全世界的访问。
外部存储器接口:
- 32位 LPDDR4/LPDDR4X控制器:支持最高速率的低功耗DDR内存,为运行Linux和应用提供充足的内存空间。这是APD和LPAV域的主要内存池。
- 多个FlexSPI接口:支持Octal/Quad SPI Flash,用于存储启动代码、系统固件和文件系统。其中一个FlexSPI控制器支持OTFAD(实时AES解密)功能,可以对存储在外部Flash中的加密代码进行透明解密,增强系统安全性而不影响启动速度。
2.3 外设与连接性:丰富的“感官”与“神经”
i.MX 8ULP的外设资源极其丰富,且巧妙地分布在各个域,以优化功耗和实时性。
通信接口:
- 高速连接:APD域提供了双USB 2.0 OTG(带PHY)、10/100M以太网,用于主机连接和网络接入。
- 通用连接:大量的LPUART、LPSPI、LPI2C和FlexIO接口遍布APD和RTD域。FlexIO是一个高度可编程的接口,可以模拟UART、I2S、摄像头接口等多种协议,提供了极大的灵活性。特别注意:I3C接口的出现值得关注,它兼容I2C且速度更快、功耗更低、支持带内中断,是连接传感器的未来趋势。
- 实时控制:RTD域独有的FlexCAN总线,是汽车和工业控制领域的标配,用于高可靠性的现场网络通信。
音频子系统:这是i.MX 8ULP的强项。多达8个I2S/SAI接口,结合Fusion DSP和HiFi4 DSP,可以构建复杂的多声道音频系统,支持数字麦克风阵列(PDM接口)、高性能DAC/ADC,非常适合智能音箱、语音助手和音频处理设备。
图形与显示:LPAV域集成了GPU和显示控制器,支持MIPI DSI输出和MIPI CSI输入,可以驱动显示屏并处理摄像头数据。EPDC(电子纸显示控制器)的集成,使其成为电子书阅读器、零售电子价签等设备的绝佳选择。
2.4 安全与加密:内置的“保险柜”
安全是现代嵌入式系统的基石。i.MX 8ULP的安全架构是硬件级、系统级的。
- EdgeLock安全 enclave:这是一个基于RISC-V的独立安全子系统,作为系统的信任根(RoT)。它负责安全的启动过程(Advanced HAB),确保只有经过签名的固件才能被加载。它还管理着加密加速器、真随机数生成器和一次性可编程熔丝(OTP),用于密钥存储。
- 加密加速器:CAAM模块提供通用的对称/非对称加密、哈希算法加速。Casper协处理器专门加速椭圆曲线加密等公钥运算。PowerQuad除了DSP功能,也能加速FFT等数学运算。这些硬件加速器使得实现TLS/SSL、数据加密、设备认证等功能时,既能保证性能,又不会显著增加CPU负载和功耗。
- 资源域控制器(XRDC/TRDC):这些硬件模块允许软件将内存和外设划分为不同的“域”,并严格规定哪个核心可以访问哪些资源。这能有效防止恶意或存在缺陷的软件组件越权访问,是实现功能安全和高可靠性系统的关键硬件支持。
注意:在启动和安全配置阶段,必须正确理解并配置AHAB、EdgeLock enclave以及密钥烧写流程。错误的安全配置可能导致芯片无法启动或留下安全漏洞。建议在项目早期就参考NXP提供的《Secure Boot on i.MX 8ULP》应用笔记进行规划。
3. 低功耗设计精要:不仅仅是休眠
i.MX 8ULP的“ULP”即“Ultra-Low Power”,其低功耗特性体现在从晶体管级到系统级的各个层面。
3.1 多电源域与功耗状态机
芯片被划分为多个独立的电源域,例如A35域、M33域、LPAV域等。每个域可以独立地进行上电、下电、时钟门控。这意味着当设备仅需监听语音唤醒词时,可以仅保持M33域和Fusion DSP上电,而将A35域、GPU、高速外设等完全断电,此时系统整体功耗可以降至微安级别。
芯片支持多种低功耗模式,如:
- RUN模式:全功能运行。
- WAIT模式:CPU核心时钟停止,但外设和中断控制器仍运行,可快速唤醒。
- STOP模式:进一步关闭大部分模块的时钟,仅保留少数低功耗振荡器和唤醒源(如RTC、GPIO中断)工作。
- SUSPEND模式:更深度的休眠,将芯片内部状态保存到特定存储器后,关闭核心电源域。
uPower子系统是这个功耗管理架构的“智能管家”。它是一个基于RISC-V的独立功耗管理单元,能够监控各域的电压、电流、温度和工作频率,并实施动态电压频率调整(DVFS)。例如,当A35核心负载较低时,uPower可以自动降低其工作电压和频率,从而显著降低动态功耗。
3.2 低功耗外设与唤醒源
为了实现“低功耗常开”功能,许多外设被设计为在STOP等低功耗模式下仍能工作。
- 低功耗定时器(LPTMR):可用于周期性的唤醒,实现定时采样。
- 低功耗UART(LPUART):在休眠模式下仍可接收数据,在收到特定字符后唤醒主系统。
- GPIO中断:任何配置为中断模式的GPIO引脚都可以作为唤醒源。
- 模拟比较器(CMP):可以在无CPU干预的情况下,监控模拟输入电压,在超过阈值时产生中断唤醒系统。
在硬件设计时,需要仔细阅读数据手册中关于各外设在低功耗模式下的行为描述。例如,某些外设可能需要特定的时钟源(如1MHz LPO)才能在低功耗模式下工作,这需要在时钟树配置中提前规划。
3.3 低功耗音频流水线实战
一个典型的低功耗语音唤醒应用流程如下:
- 深度休眠:系统主要处于M33域的低功耗状态,A35和LPAV域关闭。Fusion DSP由独立的超低功耗时钟驱动,持续监听麦克风输入。
- 关键词检测:Fusion DSP运行轻量级的神经网络或信号处理算法,对音频流进行实时分析。此过程完全由硬件加速,功耗极低。
- 触发唤醒:当DSP检测到预设的关键词后,通过中断信号触发M33核心。
- 初步处理:M33核心被唤醒,运行FreeRTOS,通过I2C/SPI收集其他传感器数据,进行初步的上下文判断。同时,它可以控制PowerQuad进行更复杂的音频特征提取。
- 富系统唤醒:如果M33判断需要更复杂的处理(如联网进行自然语言理解),它会通过MU发送消息,并触发A35域的电源序列上电。
- 高性能处理:A35域上电,Linux系统恢复,HiFi4 DSP进行高精度的语音识别,GPU更新UI,并通过Wi-Fi将结果上传云端。
- 任务完成,再次休眠:任务完成后,A35和LPAV域下电,系统回到步骤1的监听状态。
这个流程充分体现了异构计算和精细功耗管理的价值:让合适的核心在合适的时间做合适的事。
4. 系统设计与实战要点
4.1 电源管理与时钟树设计
电源设计是硬件成功的第一步。i.MX 8ULP需要多路电源轨,包括核心电压、DDR电压、模拟电压等。必须严格按照数据手册中第4.3节的电源时序要求进行设计。错误的上下电顺序可能会损坏芯片或导致启动失败。通常需要使用配套的电源管理芯片(PMIC),如NXP的PF系列PMIC,它们与处理器有预定义的时序逻辑,可以简化设计。
时钟树是系统的“心跳”。i.MX 8ULP有多个振荡器和PLL:
- 24MHz系统晶振:主时钟源。
- 32.768kHz RTC晶振:用于实时时钟和低功耗定时。
- 内部RC振荡器:如192MHz FRO和1MHz LPO,用于初始启动或低功耗模式。 软件需要正确配置SCG(系统时钟生成器)和PCC(外设时钟控制器)模块,为每个域和外设分配合适的时钟源和频率。例如,为达到最佳能效,在M33域处理常规任务时,可能使用FRO作为时钟源;而当需要高性能计算时,再切换到由PLL产生的更高频率时钟。
4.2 启动流程与系统初始化
i.MX 8ULP的启动流程是一个多阶段、可配置的过程,理解它对于调试和定制化至关重要。
- ROM Boot:芯片上电后,首先运行固化在Boot ROM中的代码。ROM代码会从预设的启动设备(如FlexSPI NOR Flash, eMMC, SD卡)的固定位置加载第一阶段引导加载程序。这个过程会使用EdgeLock enclave进行安全验证(如果使能了安全启动)。
- SPL/U-Boot:第一阶段的引导加载程序(通常是U-Boot SPL)会初始化关键外设,如DDR内存,然后加载更完整的第二段U-Boot。
- U-Boot:完整的U-Boot会进一步初始化更多硬件,从存储设备(如eMMC、网络)加载操作系统镜像(如Linux内核的FIT Image),并将控制权交给内核。
- Linux内核启动:内核启动后,会解析设备树(Device Tree)来动态识别和配置硬件。设备树的编写是软件移植的核心工作,它需要准确描述芯片的所有外设、内存映射、时钟和引脚复用情况。
在异构系统中,还需要考虑多核的启动顺序。通常,A35核心先启动并完成主要系统初始化,然后再通过MU或共享内存中的标志位,去启动M33核心并加载其固件(如FreeRTOS的二进制文件)。
4.3 核心间通信与数据共享
异构核心协同工作的基础是高效的通信机制。i.MX 8ULP提供了多种方式:
- 消息单元:这是最常用、最直接的硬件机制。MU提供了共享的邮箱寄存器和中断线,核心A可以向核心B的邮箱写数据并触发中断,反之亦然。它适合传输小的控制命令和状态信息。
- 共享内存:768KB的共享RAM是传输大量数据的首选。双方需要事先约定好内存区域的划分和数据结构(例如环形缓冲区)。为了避免数据竞争,通常需要配合使用硬件信号量模块。
- 外设虚拟化与透传:在某些架构中,可以将某个外设(如一个SPI控制器)完全分配给某个核心独占访问。在更复杂的场景下,也可以使用XRDC配置,让一个核心作为主控,另一个核心通过消息请求来间接访问该外设。
一个典型的音频应用数据流可能是:Linux端的音频应用通过MU通知M33“开始录音”,M33控制I2S和DMA将数据存入共享内存的某个环形缓冲区,然后通过MU通知Linux端数据就绪,Linux端的驱动程序再从共享内存中读取数据并进行后续处理。
4.4 开发环境与工具链搭建
开发i.MX 8ULP需要准备两套甚至三套开发环境:
- A35侧(Linux):
- 工具链:Arm GNU Toolchain(aarch64-none-linux-gnu)。
- SDK:NXP官方提供的Yocto ProjectBSP层是构建定制Linux系统的标准方式。它包含了U-Boot、Linux内核和根文件系统的所有源码和配方。
- 开发流程:在主机上使用Yocto构建完整的系统镜像,然后通过MFGTool或U-Boot烧写到目标板。
- M33侧(FreeRTOS):
- 工具链:Arm GNU Toolchain(arm-none-eabi)。
- SDK:NXP提供基于MCUXpresso SDK或Azure RTOS的软件包,其中包含了M33核心的所有外设驱动、RTOS移植和示例代码。
- IDE:可以使用Keil MDK、IAR Embedded Workbench或开源的VSCode + CMake + Arm GCC组合。
- 调试:需要通过JTAG/SWD接口连接M33核心的调试端口。由于是异构多核,建议使用支持多核调试的仿真器,如Lauterbach TRACE32或Segger J-Link配合Ozone。
关键点:两套固件(Linux的FIT Image和M33的.bin文件)的链接地址和加载位置不能冲突,需要在链接脚本和U-Boot的启动脚本中仔细规划。通常,M33的固件会被打包进Linux的根文件系统或作为一个独立的分区,由A35侧的引导程序或Linux驱动在启动后期加载到共享内存并启动M33核心。
5. 典型应用场景与方案选型
i.MX 8ULP的灵活性使其能覆盖广泛的市场,但针对不同场景,资源配置和软件架构的侧重点不同。
5.1 智能语音终端与音箱
- 核心需求:远场语音拾取、本地关键词识别、高质量音频播放、云连接、可选触摸屏UI。
- i.MX 8ULP方案:
- M33 + Fusion DSP:常驻供电,负责7x24小时低功耗语音唤醒。Fusion DSP运行波束成形、噪声抑制算法,M33运行简单的本地关键词识别引擎。
- A35 + HiFi4 DSP:唤醒后启动。A35运行Linux,负责网络连接、音乐流媒体、复杂的自然语言处理(可结合云端)。HiFi4 DSP负责高保真音频解码(如FLAC, MP3)和后期音效处理。
- 外设:8通道PDM数字麦克风阵列、高性能音频编解码器、Wi-Fi/蓝牙模块、触摸屏或LED阵列。
- 功耗优势:99%的时间处于M33+Fusion DSP的微瓦级监听状态,仅在被唤醒时短暂启用高性能域,整体平均功耗极低。
5.2 工业HMI与网关
- 核心需求:彩色图形显示、实时设备控制、多协议通信(Ethernet, CAN, RS485)、数据采集与边缘计算、高可靠性。
- i.MX 8ULP方案:
- A35域:运行Linux with Qt或LVGL,驱动800x480或更高分辨率的RGB或MIPI显示屏,处理TCP/IP协议栈,运行数据库和Web服务。
- M33域:运行FreeRTOS,直接管理CAN总线、多个ADC/DAC通道,实现精确的PID控制循环,处理来自PLC或传感器的实时数据包。
- 协同:M33将采集到的实时数据通过共享内存或MU发送给A35,用于界面更新和数据分析;A35将控制指令下发给M33执行。
- 可靠性设计:利用XRDC进行内存和外设隔离,确保实时控制任务不被Linux上的非实时任务干扰。M33域可以独立运行“看门狗”,即使A35域崩溃,也能保证关键控制功能安全。
5.3 电池供电的便携式医疗设备
- 核心需求:低功耗、实时生物信号处理(ECG, PPG)、蓝牙数据传输、简单的黑白或电子纸显示、高安全性。
- i.MX 8ULP方案:
- M33域:持续运行,以固定频率采样高精度ADC(连接传感器),利用PowerQuad协处理器实时进行数字滤波(如IIR/FIR)、FFT变换提取特征值。
- A35域:间歇性工作。当M33检测到异常波形或用户操作时,唤醒A35。A35启动,利用GPU在电子纸屏上绘制更复杂的波形图或菜单,并通过蓝牙将数据同步到手机App。
- 安全:使用EdgeLock enclave和安全启动,确保设备固件不被篡改。使用Casper协处理器对传输的医疗数据进行加密。
- 电池寿命:得益于精细的功耗域管理,设备在大部分监测时间仅M33和少数模拟前端工作,可能实现数周甚至数月的续航。
6. 常见问题与调试经验实录
在实际项目开发中,以下几个问题是高频出现的“坑点”。
6.1 启动失败问题排查清单
无任何输出:
- 检查电源时序:这是首要怀疑对象。用示波器测量所有电源轨的上电顺序和电压值,确保符合数据手册要求。特别注意复位信号(POR_B)的时序。
- 检查启动模式引脚:BOOT_MODE[1:0]引脚的上电状态决定了芯片从何处启动(Serial Downloader, Internal Boot等)。确保其被正确电阻上拉/下拉。
- 检查时钟:测量24MHz主晶振是否起振,幅度是否正常。
卡在ROM Boot:
- 检查启动设备:确认FlexSPI Flash或eMMC中在指定偏移地址处存在有效的启动镜像(IVT, Boot Data, DCD等)。
- 检查DCD(Device Configuration Data):如果使能了DCD,ROM会按照DCD配置DDR等外设。DCD配置错误(如DDR参数不匹配)会导致后续代码加载失败。建议初期先禁用DCD,在U-Boot SPL中再初始化DDR。
- 安全启动失败:如果使能了HAB但镜像签名错误或密钥不匹配,ROM会静默失败。可以通过JTAG连接,读取SRC(System Reset Controller)模块的寄存器来获取启动状态码(Boot Status Word),这是诊断启动阶段问题的关键。
U-Boot启动后卡住:
- 检查串口输出:通常U-Boot会有打印。如果停在某个外设初始化,可能是该外设的引脚复用(IOMUX)配置冲突或时钟未开启。
- 检查DDR初始化:如果U-Boot在“DRAM:”后卡住,肯定是DDR初始化失败。需仔细核对DDR类型(LPDDR4/LPDDR4X)、速率、时序参数在代码中的配置是否与板上使用的DDR颗粒数据手册一致。
6.2 多核通信与同步难题
共享内存数据损坏:
- 原因:无锁访问导致的数据竞争。
- 解决:务必使用硬件信号量(SEMA4)或软件互斥锁(在RTOS中)来保护共享内存的临界区。设计清晰的生产者-消费者模型,使用环形缓冲区并维护好头尾指针。
MU中断无法触发:
- 检查GIC配置:在A35侧(Linux),需要确保MU对应的中断号在GIC(通用中断控制器)中已正确配置并启用,并且中断处理程序已注册。
- 检查M33侧NVIC配置:在M33侧(FreeRTOS),需要正确配置NVIC,使能MU中断并设置优先级。
- 检查时钟与电源域:确认MU模块所在的电源域和时钟域在两个核心侧都已使能。在低功耗模式下,如果MU的时钟被关闭,则无法产生中断。
6.3 低功耗目标无法达成
休眠电流依然很高:
- 排查外设漏电:使用芯片的IOMUXC配置工具,将所有未使用的GPIO引脚设置为下拉或上拉,避免浮空。浮空的引脚会产生漏电流。
- 检查外设模块状态:在进入低功耗模式前,确保所有不用的外设模块(如UART, SPI, I2C)的时钟已被关闭(通过PCC寄存器),并且其电源域可能的话也被关闭。
- 测量电源轨:断开外部负载,仅测量芯片核心电源的电流。如果依然高,可能是内部某个默认使能的模块(如某些内部LDO、未使用的PLL)在休眠时未关闭。需要仔细检查参考手册中低功耗模式的进入序列,确保所有必要步骤都已执行。
唤醒失败或唤醒后系统异常:
- 唤醒源配置错误:确认用于唤醒的GPIO或外设(如LPTMR, LPUART)在低功耗模式下仍有时钟供应(例如来自1MHz LPO),并且其对应的中断已在唤醒控制器(WUU)中正确使能。
- 上下文保存/恢复不完整:在进入深度休眠(如SUSPEND)前,如果由软件负责保存CPU上下文,必须确保所有通用寄存器、系统寄存器的值被正确保存到非易失性存储(如TCM或保留内存),并在唤醒后恢复。使用芯片提供的低功耗驱动库(如NXP的Power Manager)可以大大降低此风险。
6.4 性能调优建议
优化DDR访问:对于图形或大数据处理应用,DDR带宽可能是瓶颈。确保DDR控制器配置为最优时序,并启用所有可用的性能优化特性,如内存调度器优化、读写交错等。将频繁访问的数据(如帧缓冲区)放在芯片内部共享RAM中,可以显著减少延迟和功耗。
合理使用缓存与内存属性:正确配置MMU/MPU,将频繁访问的代码和数据区域标记为缓存使能。对于DMA缓冲区或核心间共享内存,应标记为非缓存或写回写分配,并在访问前后执行必要的缓存维护操作(clean/invalidate),以避免数据一致性问题。
协处理器卸载:性能瓶颈往往出现在加密、音频处理或数学运算上。务必使用PowerQuad进行FFT、滤波、矩阵运算;使用Casper进行RSA/ECC加解密;使用HiFi4 DSP进行音频编解码。这些硬件加速器的能效比是通用CPU的数十倍甚至上百倍。NXP的SDK中通常提供了这些加速器的驱动和示例,应优先集成使用。
我个人在多个基于i.MX 8ULP的项目中最大的体会是,前期架构设计的重要性远大于后期代码优化。在项目开始时就明确:哪些任务必须在M33上实时完成?A35和M33之间传输什么数据、频率多高、延迟要求如何?哪些外设分配给哪个核心?低功耗场景如何划分?把这些问题的答案画成一个系统架构与数据流图,并以此为指导去配置设备树、划分内存、设计通信协议,往往能事半功倍,避免后期重大的返工。这颗芯片的潜力巨大,但需要开发者以“系统架构师”的思维,而不仅仅是“程序员”的思维,去充分驾驭它。