基于NXP Harpoon与TSN的嵌入式混合关键性系统开发实战
1. 项目概述
如果你正在为工业自动化、汽车网络或者专业音视频系统寻找一个既能跑Linux做复杂管理,又能跑实时系统(RTOS)处理硬实时任务的嵌入式平台,NXP的Harpoon方案绝对值得你花时间深入研究。它不是一个简单的软件包,而是一套基于Jailhouse Type-1 Hypervisor的混合关键性系统解决方案。简单来说,它能让一颗i.MX 8M Plus或者i.MX 93这样的多核处理器,同时、隔离地运行一个功能丰富的Linux系统和一个或多个硬实时操作系统(如FreeRTOS、Zephyr)。Linux负责网络管理、用户界面、文件系统等通用任务,而RTOS则专精于那些对时间要求极其苛刻的工业控制、音视频流传输或网络协议处理。
在这个框架下,时间敏感网络(TSN)应用的开发成为了一个核心亮点。传统以太网的“尽力而为”特性在工业场景中是个致命伤,一个数据包的延迟或丢失可能导致整条生产线停机。TSN技术通过对标准以太网进行一系列增强(时间同步、流量整形、帧抢占等),使其具备了确定性的低延迟通信能力。Harpoon平台巧妙地将TSN协议栈(如GenAVB/TSN Stack)运行在RTOS侧,确保了时间关键型报文处理的实时性和可靠性,而Linux侧则负责配置、监控等非实时任务。本文将以Harpoon用户指南为蓝本,结合我实际在i.MX 8M Plus EVK和LS1028A TSN网桥上的调试经验,为你拆解从环境搭建、TSN端点配置、实时性能测试到Virtio虚拟网络应用的完整开发流程,并分享那些官方文档里不会写的“踩坑”心得和操作细节。
2. Harpoon平台与TSN基础架构解析
2.1 Harpoon混合架构的核心价值
Harpoon的核心思想是“隔离”与“专核专用”。它利用ARM处理器的虚拟化扩展,通过Jailhouse Hypervisor将物理硬件资源(如CPU核、内存区域、外设)静态分区,分配给不同的“Cell”(单元)。Root Cell通常运行Linux,拥有大部分资源;一个或多个Non-root Cell(也称为Inmate Cell)则运行RTOS,被分配专用的CPU核和内存,以及关键的实时外设(如特定的ENET MAC、SAI音频接口、GPT定时器等)。
这种架构带来了几个关键优势:首先是实时性保障,RTOS任务运行在专属核上,不受Linux内核调度、中断或内存管理活动的干扰,能够实现微秒级甚至更低的确定性响应。其次是功能安全隔离,一个Cell的故障不会直接影响另一个Cell,提高了系统整体可靠性。最后是开发灵活性,你可以用熟悉的Linux工具链开发上层应用,同时用RTOS满足底层硬实时需求。
在Harpoon的参考应用中,industrial(工业应用)和audio(音频应用)是两个典型代表。industrial应用主要展示了TSN网络端点的功能,而audio应用则侧重于AVB/TSN音视频桥接。它们都遵循相同的架构模式:RTOS Cell处理实时数据流,Linux Cell通过RPMsg(Remote Processor Messaging)通道对其进行控制和管理。
2.2 TSN在嵌入式实时系统中的角色
时间敏感网络(TSN)并非单一协议,而是IEEE 802.1工作组制定的一系列标准集合,旨在为以太网增加确定性传输能力。在Harpoon的工业应用场景中,主要涉及以下几个关键机制:
- 时间同步(IEEE 802.1AS-Rev/gPTP):这是TSN的基石。所有网络设备(端点、交换机)必须共享一个高精度的全局时间。gPTP(广义精确时间协议)负责在主从时钟之间同步时间,精度可达亚微秒级。只有时间同步了,后续的调度和门控才有意义。
- 流量调度(IEEE 802.1Qbv):也称为时间感知整形器(TAS)。它像是一个按照严格时间表开闭的“交通信号灯”。网络交换机为不同优先级的流量预设了发送时间窗口。例如,最高优先级的TSN流量只能在特定的、周期性的时间窗口内被发送,其他流量(如背景的TCP流量)则被阻挡,从而保证了TSN流量的延迟上界和零拥塞丢失。
- 帧抢占(IEEE 802.1Qbu & 802.3br):允许高优先级帧中断正在传输的低优先级长帧。当一个TSN关键帧到达时,如果端口正在发送一个普通以太网帧(如一个1500字节的TCP数据包),交换机会立即暂停该帧的发送,插入TSN帧,发送完毕后再恢复被中断帧的剩余部分。这极大地减少了高优先级流的等待延迟。
- 流预留协议(IEEE 802.1Qat/SRP):类似于“资源预约”。TSN Talker(发言者)会在网络中声明其数据流的带宽、延迟等需求,Listener(侦听者)和沿途的网桥会检查自身资源是否满足,并进行预留,确保端到端的服务质量。
在Harpoon的industrial应用中,RTOS Cell内运行的正是集成了上述TSN功能的GenAVB/TSN协议栈。Linux Cell则通过harpoon_ctrl工具向RTOS发送命令,启动或停止TSN通信测试。这种分工使得时间关键的协议处理完全在实时的、可预测的RTOS环境中完成。
3. TSN端点应用实战:从硬件连接到测试验证
3.1 硬件环境搭建与选型考量
根据指南,一个基础的TSN测试环境通常需要以下硬件:
- 控制器(Controller):一块运行Harpoon的i.MX 8M Plus或i.MX 93 EVK。它将作为TSN网络中的主时钟(Grandmaster)或从时钟,并运行控制逻辑。
- TSN网桥(Bridge):一块LS1028A RDB开发板。这是一款集成了多个TSN感知以太网端口的处理器,能够执行Qbv、Qbu等关键的TSN交换和调度功能。它是构建确定性网络的关键,普通交换机无法替代。
- IO设备(IO Device):另一块i.MX 8M Plus/i.MX 93 EVK,或i.MX RT1170 EVK。它作为另一个TSN端点,模拟受控的设备。
硬件连接拓扑通常如下:PC通过USB/UART连接控制器用于调试。控制器、IO设备1、IO设备2(可选)均通过以太网线连接到TSN网桥(LS1028ARDB)的不同端口上。网桥本身构成了一个简单的TSN网络骨干。
注意:硬件兼容性。务必确认你使用的EVK板载以太网PHY支持TSN特性。例如,i.MX 8M Plus EVK上的RTL8211F PHY在某些早期版本固件中可能对802.1AS支持不完善,需要更新PHY固件或使用官方推荐的版本。在项目初期,我曾因PHY驱动问题导致gPTP始终无法同步,排查了整整两天。
3.2 TSN网桥(LS1028A)的配置详解
LS1028ARDB默认系统可能未启用桥接功能。你需要登录其Linux系统进行手动配置。以下命令序列至关重要:
# 1. 查看网络接口,确认交换芯片的端口命名,通常是swp0, swp1等。 ls /sys/bus/pci/devices/0000:00:00.5/net/ # 2. 启用物理端口并创建网桥。假设管理口是eno2,四个交换口是swp0-3。 ip link set dev eno2 up ip link add name br0 type bridge ip link set br0 up ip link set master br0 swp0 up ip link set master br0 swp1 up ip link set master br0 swp2 up ip link set master br0 swp3 up # 3. 启动TSN协议栈(通常由供应商提供的脚本完成)。 tsn.sh start关键点解析:
ip link add name br0 type bridge:创建了一个名为br0的Linux桥接设备。在TSN语境下,这个桥接设备是软件层面的抽象,底层的硬件交换和TSN调度由LS1028A的交换硬件和驱动负责。tsn.sh start:这个脚本会启动关键的TSN守护进程,特别是ptp4l(用于gPTP)和可能的phc2sys(用于将系统时钟与硬件时钟同步)。务必检查脚本内容,确认其正确配置了TSN端口和gPTP域。
验证网桥状态:使用tail -f /var/log/tsn-br查看日志。健康的输出应显示各端口的角色(Master/Slave)、链路状态���Up/Down)和asCapable状态(Yes/No)。
asCapable: Yes表示该端口具备与对端进行时间同步的能力,这是gPTP成功协商的前提。Propagation delay显示了测量到的链路传播延迟,这个值应该相对稳定。如果某个已连接端口显示Link: Down或asCapable: No,需要检查网线、对端设备状态或PHY配置。
3.3 端点设备配置与应用程序启动
在Harpoon环境中,你需要将其中一个i.MX设备配置为Controller,另一个(或多个)配置为IO Device。这通过向RTOS Cell发送不同的RPMsg命令来实现。
1. 启动RTOS Cell(运行TSN协议栈)首先,确保Harpoon服务已启动,并且industrial应用正在RTOS Cell中运行。这通常通过预置的配置文件完成:
# 设置配置并启动服务(以FreeRTOS为例) harpoon_set_configuration.sh freertos industrial systemctl start harpoon此时,连接到RTOS Cell的串口终端会显示GenAVB/TSN协议栈初始化的日志。
2. 配置并启动TSN端点在Linux Root Cell的控制台进行操作:
- 启动Controller:
参数harpoon_ctrl ethernet -r 0-r 0表示运行(run)模式0,通常对应Controller角色。 - 启动IO Device:
参数harpoon_ctrl ethernet -r 0 -i 0-i 0表示将其标识为ID为0的IO设备。
深入日志分析:启动命令后,RTOS串口会输出大量信息,需要关注几个关键点:
INFO: ethernet_avb_tsn_run : role : 0 # 角色,0通常是Controller,1是IO Device INFO: ethernet_avb_tsn_run : num_io_devices : 1 # 预期的IO设备数量 INFO: ethernet_avb_tsn_run : app period : 100000 # 应用周期,单位纳秒(ns),这里是100us)最重要的是gPTP同步成功的标志:
Port(0): domain(0, 0): Role: Slave Link: Up asCapable: Yes Port(0): Propagation delay (ns): 340.13 min 331 avg 339 max 347这表示端口0已成功作为Slave与网络中的Grandmaster(可能是网桥或另一个端点)同步,链路正常,且传播延迟约340纳秒。
3. 验证数据交换成功同步后,应用会开始周期性地发送和接收测试帧。在日志中寻找类似以下的行:
socket_stats_print : cyclic rx socket(...) peer id: 1 socket_stats_print : valid frames : XXXXXXXXXX代表接收到的有效帧数。在稳定状态下,这个数字应该以固定的速率递增。根据配置的app period(100000 ns,即10 kHz),理论发包速率是每秒10000个帧。你可以观察两次打印间隔(比如5秒)内,valid frames的增量是否接近10000 pps * 5s = 50000帧,以此来验证通信是否按预期确定性进行。
实操心得:故障排查顺序。当TSN通信不成功时,建议按以下顺序排查:1)物理层:网线、指示灯。2)链路层:
ip link查看端口是否UP。3)gPTP同步:检查asCapable和Role,这是TSN工作的前提。4)应用层:检查RTOS应用日志,确认角色配置、周期设置是否正确,以及是否有资源分配失败的错误。很多时候问题出在gPTP同步阶段,检查网桥和端点的gPTP配置(域号、时钟类型等)是否一致。
4. 实时性能基准测试:rt_latency应用深度解读
在实时系统中,仅仅功能正确是不够的,必须量化其“实时”程度。Harpoon提供的rt_latency应用就是一个精密的“探针”,用于测量从硬件中断发生到软件任务响应的延迟。
4.1 rt_latency的工作原理与指标
该应用使用一个高精度硬件定时器(如i.MX 8M的GPT或i.MX 93的TPM)周期性(例如每100微秒)产生中断。它测量两个关键指标:
- IRQ延迟(irq delay):从硬件定时器中断信号生效,到CPU开始执行该中断的服务例程(ISR)第一条指令所经历的时间。这个时间包含了硬件中断响应、Hypervisor(Jailhouse)的中断虚拟化开销以及RTOS的中断向量查找时间。
- 调度延迟(irq to sched):从硬件中断发生,到由该ISR所唤醒或触发的特定实时任务真正开始执行所经历的时间。它包含了上述IRQ延迟,再加上RTOS调度器进行任务切换、上下文保存与恢复的时间。
测量意义:irq delay反映了系统底层的中断响应能力,而irq to sched则更贴近实际应用场景——你的实时任务究竟能在中断发生后多快被调度执行。这两个指标直接决定了系统能否满足苛刻的实时控制周期。
4.2 测试用例执行与结果分析
启动rt_latency应用后,通过harpoon_ctrl latency -r <TC_ID>来执行不同的测试用例。每个用例通过施加不同的系统负载,来评估其对实时延迟的影响。
| 测试用例ID (TC_ID) | 负载描述 | 测试目的 |
|---|---|---|
| 1 | 无额外负载 | 测量系统在空闲状态下的基准延迟。 |
| 2 | 额外CPU负载(低优先级忙循环任务) | 评估CPU被低优先级任务占满时,对高优先级中断/任务的影响。 |
| 3 | 额外IRQ负载 | 评估高频外部中断对目标定时器中断响应的影响。 |
| 4 | 额外CPU负载 + 信号量操作 | 评估在CPU繁忙且存在内核对象(信号量)竞争时的延迟。 |
| 5 | 额外CPU负载 + Linux负载 | 评估同芯片上Linux Cell的负载(如内存拷贝、计算)对RTOS Cell的干扰。 |
| 6 | 额外CPU负载 + 缓存刷新 | 评估指令缓存失效对任务执行时间的影响。 |
执行命令后,应用会每10秒打印一次统计信息。以下是一段示例输出解读:
INFO: stats_print : stats(C0601B30) irq delay (ns) min 625 mean 792 max 3625 ... INFO: hist_print : n_slot 21 slot_size 1000 INFO: hist_print : 99890 76 22 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0min/mean/max:过去10秒内测量到的最小、平均、最大延迟。absmin/absmax:自测试开始以来的历史最小和最大延迟。- 直方图(Histogram):这是分析延迟分布的神器。
n_slot 21 slot_size 1000表示将延迟范围分成了21个桶,每个桶宽1000纳秒。下面的数字序列99890 76 22 12 0...表示落在每个桶中的事件数量。在这个例子中,99.89%的中断延迟都在第一个桶(0-999 ns)内,只有极少部分延迟在1-2微秒、2-3微秒、3-4微秒的范围内,没有超过4微秒的。这表系统的中断响应非常稳定和集中。
对比官方指南中i.MX 93/FreeRTOS的基准数据(无负载时irq to sched平均约1889 ns,最大3291 ns),如果你的测试结果远高于此,就需要警惕了。可能的原因包括:后台有未知的中断风暴、内存带宽竞争、或者Cache配置不当。
4.3 影响实时性的关键因素与调优思路
根据我的经验,以下几个因素对Harpoon环境下的实时延迟影响最大:
- CPU隔离与关联性:确保RTOS Cell被分配了专用的CPU核,并且Linux进程(包括内核线程)通过
isolcpus内核参数或CGroup被排除在这些核之外。同时,将RTOS任务和中断(包括那个定时器中断)都绑定到同一个CPU核上,可以避免核间迁移带来的Cache失效和同步开销。 - 中断管理:
- 中断屏蔽:在RTOS的关键任务或临界区,需要短暂屏蔽非关键中断。但需谨慎,长时间屏蔽中断会导致系统无响应。
- 中断亲和性:像DMA、以太网等可能产生大量中断���外设,其中断号应被分配到Linux管理的核上,避免对RTOS核造成“中断轰炸”。
- 内存与Cache:
- 内存区域:为RTOS Cell分配的内存必须是非缓存(Non-cacheable)或写通过(Write-Through)的吗?不一定。对于频繁访问的代码和数据,使用缓存能极大提升性能。关键在于隔离。Harpoon通过MMU为不同Cell配置独立的内存映射和Cache策略。确保RTOS的关键代码和数据所在内存区域被正确映射,并且Cache策略(如Write-Back)与访问模式匹配。
- Cache一致性:如果RTOS和Linux需要共享内存(如通过RPMsg通信),这片共享区域必须配置为非缓存或使用硬件维护的Cache一致性(如果SoC支持,如CCI)。否则,一方写入的数据另一方可能看不到,导致诡异的数据一致性问题。
- Hypervisor开销:Jailhouse是Type-1 Hypervisor,运行在最高特权级。当中断发生时,需要先由Hypervisor接管,再派发给对应的RTOS Cell。这个“陷入-模拟”的过程会引入额外的延迟。Harpoon和Jailhouse的优化目标就是最小化这个路径。选择经过充分验证的Harpoon和Jailhouse版本很重要。
避坑指南:如何解读“最大延迟”尖峰。在长期稳定性测试中,偶尔出现一个远高于平均值的“最大延迟”尖峰(比如从2微秒跳到几十微秒),这往往是“延迟源”存在的标志。需要结合直方图分析其发生频率。如果频率极低(如24小时出现一次),可能是由Linux内核的周期性活动(如调度器滴答、内存管理)或外部事件(如网络风暴)引起。如果频率较高,则需要使用更精细的性能分析工具(如ARM CoreSight ETM)进行追踪,定位具体是哪个硬件事件或软件路径导致了这次延迟。
5. Virtio网络应用:虚实结合的通信桥梁
5.1 Virtio-net的设计原理与应用场景
virtio_net应用展示了Harpoon另一种强大的能力:在RTOS和Linux之间共享一个物理网络设备。其架构如下图所示:
物理以太网口 (ENET) <---> RTOS Cell (Virtio后端驱动) ^ | (Virtio队列,基于共享内存) v Linux Root Cell (Virtio前端驱动) <---> 虚拟网络接口 (eth1)- 后端(Backend):运行在RTOS Cell中,直接操作物理ENET硬件。它负责真实的报文收发。
- 前端(Frontend):运行在Linux内核中,表现为一个标准的
virtio_net网络设备驱动,向上层提供一个名为eth1(或类似)的虚拟网络接口。 - 通信机制:前后端通过Virtio规范定义的队列(virtqueue)进行通信,这些队列建立在由Hypervisor管理的共享内存之上。当Linux有数据包要发送时,前端驱动将数据包描述符放入发送队列,后端驱动轮询到后,从共享内存中取出数据,通过物理网卡发出。接收过程反之。
这个设计的价值在于:它将网络数据平面的处理(特别是实时性要求高的部分)卸载到了RTOS,而Linux保留了完整的TCP/IP协议栈和丰富的网络工具(ifconfig,ping,iperf3,tcpdump等)。这对于需要Linux进行复杂网络配置和管理,同时又要求部分网络流量具有低延迟、确定性的场景非常有用。
5.2 配置、启用与故障排查
启用Virtio网络相对直接:
# 1. 配置Harpoon使用virtio_net应用 harpoon_set_configuration.sh freertos virtio_net # 2. 启动Harpoon服务 systemctl start harpoon启动后,在RTOS串口会看到后端初始化成功的日志。在Linux终端,使用ifconfig或ip addr查看,应该会多出一个新的网络接口(例如eth1),使用ethtool -i eth1查看其驱动,确认是virtio_net。
常见问题与解决:
- 接口未出现:首先检查RTOS串口日志,确认
virtio_net后端是否成功初始化并找到了物理ENET设备。其次,检查Linux内核是否编译了VIRTIO_NET驱动以及相关的VIRTIO_MMIO或VIRTIO_PCI支持。 - 接口出现但无链路:虚拟接口的链路状态(
LOWER_UP)通常由后端驱动控制。如果后端检测到物理网线已连接并UP,它应该通知前端。检查物理网线是否插好,以及RTOS侧的网络PHY初始化是否成功。 - 无法ping通:
- IP地址配置:虚拟接口
eth1需要手动配置IP地址,或通过DHCP获取。确保其与对端设备在同一子网。 - 防火墙:检查Linux的防火墙(如
iptables,firewalld)是否丢弃了eth1接口的ICMP报文。 - 后端转发:确认RTOS后端是否正确地桥接了前端的数据包和物理网络。可以尝试在RTOS侧启用简单的调试输出,查看它是否收到并转发了来自Linux的ping请求报文。
- IP地址配置:虚拟接口
性能考量:Virtio网络的性能取决于共享内存的访问效率、前后端通知机制(中断或轮询)以及物理网卡本身的性能。对于大量小包转发,开销可能比Linux直接驱动网卡要高。但对于需要RTOS介入处理的特定流量(如TSN帧的定时发送),这种架构提供了必要的控制能力。
6. 从零构建与定制Harpoon应用
6.1 开发环境搭建与源码构建
官方指南提供了手动构建的方法,这对于定制化开发是必须掌握的。整个过程可以概括为:获取代码 -> 配置工具链 -> 分别构建RTOS应用和Linux控制程序。
1. 获取源码:
west init -m https://github.com/NXP/harpoon-apps --mr harpoon_3.0.0 hww cd hww west updatewest是Zephyr项目推出的多仓库管理工具,这里用它来拉取harpoon-apps主仓库以及其依赖的所有子模块(如MCUXpresso SDK、FreeRTOS内核、Zephyr、GenAVB/TSN栈等)。这是一个比较耗时的过程。
2. 构建RTOS应用(以FreeRTOS音频应用为例):
# 设置交叉编译工具链路径 export ARMGCC_DIR=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/ # 进入对应板卡和应用的构建目录 cd harpoon-apps/audio/freertos/boards/evkmimx8mp/armgcc_aarch64 # 执行构建脚本(DDR Release版本) ./build_ddr_release.sh构建成功后,在ddr_release/目录下会生成audio.bin,这就是需要加载到RTOS Cell的二进制文件。
3. 构建Linux控制程序: 这需要在Yocto SDK环境中进行。
# 进入Yocto SDK环境(路径根据你的安装位置调整) source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux # 构建控制程序 cd harpoon-apps/ctrl ./build_ctrl.sh生成的可执行文件harpoon_ctrl需要拷贝到目标板的Linux文件系统中。
工具链版本陷阱:务必使用官方指定的工具链版本。例如,指南中明确提到FreeRTOS应用需使用GCC 10.3-2021.07,而Zephyr应用也可能有特定要求。使用不兼容的编译器版本可能导致链接错误、运行时崩溃或难以调试的ABI问题。我曾因使用较新的GCC 12版本编译FreeRTOS应用,导致任务栈异常而花费大量时间排查。
6.2 应用框架剖析与定制入门
harpoon-apps仓库的结构清晰地展示了如何组织一个混合关键性应用。以audio应用为例,其目录结构是学习的范本:
audio/ ├── common/ # 与RTOS和板卡无关的通用代码(音频流水线、缓冲区管理、AVTP协议处理) ├── freertos/ # FreeRTOS相关的入口和适配代码(main.c, 任务创建等) │ └── boards/ │ └── evkmimx8mp/ │ └── armgcc_aarch64/ # 板卡特定的构建配置(CMakeLists.txt, 链接脚本) ├── zephyr/ # Zephyr相关的入口和配置(main.c, prj.conf, Kconfig等) └── boards/ # 板卡特定的硬件抽象代码(时钟配置、引脚复用、编解码器驱动��� └── evkmimx8mp/ ├── app_board.h # 硬件定义(SAI实例、I2C地址) ├── clock_config.c # 音频PLL和SAI时钟树配置 ├── pin_mux.c # IOMUX配置,将芯片引脚功能设置为SAI TX/RX、I2C等 └── codec_config.c # DAC/ADC芯片的初始化与控制函数如何开始定制一个新应用?
- 复制模板:在
harpoon-apps根目录下复制一份hello_world或rt_latency应用,重命名为你的应用名(如my_motor_ctrl)。 - 修改核心逻辑:在
common/目录下替换或增加你的业务逻辑源文件。例如,实现一个电机控制环算法。 - 适配硬件:在
boards/<your_board>/目录下,修改app_board.h和pin_mux.c,将用到的外设(如PWM、QEI、ADC)的硬件实例和引脚配置正确。 - 修改构建系统:更新
freertos/boards/<your_board>/armgcc_aarch64/CMakeLists.txt,将你的新源文件添加到编译列表中。 - 添加控制接口:在
common/的某个初始化函数中,仿照audio_control_init(),创建一个RPMsg端点。在应用主循环中,添加对控制命令的解析和处理逻辑。同时,需要在Linux侧的harpoon-apps/ctrl项目中添加对应的命令解析代码。
关键点:内存映射(MMU)配置。这是Harpoon开发中最容易出错的地方之一。在freertos/boards/<board>/app_mmu.h文件中,你需要明确告诉系统,你的应用需要访问哪些物理内存区域(外设寄存器地址空间)。必须将用到的所有外设(如I2C3、SAI5、GPT1等)的基地址和大小,添加到platform_mmap数组中。如果遗漏,RTOS应用在访问该外设时会产生内存访问错误并崩溃。一个实用的技巧是,在NXP的MCUXpresso SDK或参考手册中找到该外设的“Memory Map”章节,获取其绝对基地址。
