1. 项目概述
在汽车电子这个对可靠性、实时性和成本都极为敏感的领域,找到一个既能快速启动开发,又能支撑复杂功能实现的平台,是每个嵌入式工程师都面临的挑战。十几年前,当我在一个车载信息娱乐系统(IVI)项目中第一次接触到Motorola的mobileGT标准开发平台(SDP)时,那种“开箱即用”的体验至今记忆犹新。它不仅仅是一套硬件板卡,更是一个完整的生态系统,将当时最顶尖的PowerPC处理器、QNX实时操作系统以及业界主流的开发工具链无缝整合在一起,为车载嵌入式开发提供了一个堪称“黄金标准”的起点。
mobileGT SDP的核心价值在于其“标准化”和“完整性”。它瞄准的是汽车座舱内的驾驶员信息系统(DIS),这类系统通常需要处理多媒体、导航、车辆状态显示等多种任务,对处理器的计算能力、I/O吞吐量以及操作系统的实时响应能力都有很高要求。Motorola联合了QNX、IBM(通过其子公司OTI提供Java虚拟机)、Metrowerks等领域的头部厂商,共同打造了这个联盟。这意味着,开发者拿到手的不是一个需要自己从头焊接、移植BSP(板级支持包)的评估板,而是一个软硬件深度集成、驱动完备、工具链就绪的“交钥匙”解决方案。你可以把精力完全集中在应用层逻辑和业务创新上,而不是耗费数月去调试一个不稳定的串口驱动。
这套平台的心脏是MPC823e PowerPC处理器。这是一颗专门为汽车电子“淬炼”过的32位微处理器,通过了严苛的汽车级认证。它的独特之处在于双核架构:一个主处理器核心(PowerPC核心)负责运行应用程序和操作系统,另一个独立的通信处理器(CPM)则专门管理集成的串口、以太网、LCD控制器等大量外设。这种设计在当时非常超前,它确保了即使在外设通信负载很重的情况下,主CPU的计算性能也不会受到明显拖累,这对于需要流畅UI响应和实时数据处理的汽车座舱系统至关重要。平台的基础软件是QNX Neutrino RTOS,这是一个以微内核、高可靠性和小巧内存占用著称的实时操作系统。其“动态升级”特性尤为亮眼——系统可以在运行时下载并启动新的应用程序和驱动程序,无需重启。想象一下,车主未来可以通过OTA(空中下载技术)为爱车增加新功能或修复漏洞,而完全不必开车回4S店,这在当时是极具前瞻性的设计。
2. 平台核心组件深度解析
2.1 硬件架构:为汽车电子量身定制
mobileGT SDP的硬件并非简单的堆砌,其设计处处体现了对汽车嵌入式开发场景的深刻理解。整个目标系统被封装在一个红色的亚克力盒子内,既提供了物理保护,也方便观察内部状态。
2.1.1 处理器:MPC823e的双核智慧MPC823e是Motorola(后为Freescale,现为NXP)PowerQUICC II家族中的明星产品。其“双核”并非指两个对称的通用CPU,而是一个主频可达80MHz的PowerPC 603e核心,搭配一个独立的RISC架构通信处理器(CPM)。CPM内部集成了多个串行通信控制器(SCC和SMC)、一个以太网控制器、一个LCD控制器,甚至还有I2C和SPI接口。在开发中,我经常将网络协议栈、串口数据打包/解包等通信密集型任务卸载到CPM上运行。这样,主CPU几乎可以“无视”底层通信的细节,专注于应用逻辑和图形渲染,极大地提升了系统整体效率和实时性。这种硬件分工的思想,在如今多核异构的汽车SoC(如NXP的i.MX系列)上依然能看到影子。
2.1.2 核心板与扩展板:RPX Lite与HIOX的协作硬件系统的核心是Embedded Planet设计的RPX Lite板。这块板卡集成了MPC823e、16MB的Flash(用于存放Bootloader和操作系统镜像)、16MB的SDRAM,以及基础的串口和以太网物理接口。它通过一个名为“RPX总线”的接口与HIOX扩展卡连接。这种模块化设计非常巧妙:RPX Lite作为标准的、稳定的处理器模块,而HIOX卡则可以根据不同车型或功能需求进行定制,提供额外的串口、音频输入输出、触摸屏控制器等。在项目原型阶段,我们可以快速在标准平台上开发;进入产品化时,只需根据需求定制HIOX卡,甚至设计自己的载板,而核心的软件和驱动可以高度复用,显著降低了开发风险和周期。
2.1.3 显示与交互:集成的TFT与触摸屏平台直接集成了一块TFT液晶屏和电阻式触摸屏,这对于需要开发图形化人机界面(HMI)的车载系统来说是刚需。MPC823e内置的LCD控制器可以直接驱动这块屏幕,无需额外的图形芯片,既节省了成本也简化了设计。在调试UI时,我们可以直接在目标板上看到像素级的渲染效果,避免了通过仿真器或网络远程查看图像可能带来的延迟和失真问题。
2.2 软件栈:从底层RTOS到上层开发环境
mobileGT的软件生态是其另一大杀手锏,它几乎囊括了当时嵌入式开发所需的所有环节。
2.2.1 操作系统基石:QNX Neutrino RTOSQNX Neutrino采用微内核架构,内核仅提供最基本的进程调度、进程间通信(IPC)和中断处理服务,其他如文件系统、网络协议栈、设备驱动等都作为独立的用户态进程运行。这种设计带来了极高的可靠性和容错能力——一个驱动进程崩溃不会导致整个系统宕机,内核可以将其重启。对于追求“零死机”的汽车电子而言,这是至关重要的特性。随SDP提供的QNX 6.1 Cross Development Kit包含了交叉编译器、调试工具和丰富的库,让我们可以在Windows主机上为PowerPC目标机编译程序。
2.2.2 开发工具链:Metrowerks CodeWarrior IDECodeWarrior是当时嵌入式C/C++开发的标杆IDE。它与mobileGT平台深度集成,提供了针对QNX Neutrino的专用项目模板。其强大之处在于一体化的编辑、编译、链接和调试体验。通过配置TCP/IP连接,我们可以直接从IDE发起对目标板上运行进程的源码级调试,设置断点、查看变量、单步执行,就像在本地调试桌面程序一样流畅。这彻底改变了以往依赖串口打印日志的原始调试方式,效率提升巨大。
2.2.3 Java运行时:IBM VisualAge Micro Edition与J9 VM为了支持日益流行的Java应用开发(当时在汽车领域,Java ME用于开发一些小程序和中间件),平台集成了IBM的VisualAge Micro Edition开发环境和OTI的J9 Java虚拟机。J9 VM针对嵌入式环境做了大量优化,特别是其与QNX在线程级的深度集成,保证了Java应用的实时性能。它还支持OSGi(动态模块系统)框架,允许在运行时动态下载和更新软件模块(Bundle),这与QNX的动态升级特性完美契合,为实现车载软件的终身可升级提供了技术基础。
3. 从开箱到运行:详细配置与实操指南
3.1 硬件连接与上电检查
拿到mobileGT SDP后,第一步是正确连接所有线缆。这个过程看似简单,但连接错误是新手最常遇到的“拦路虎”。
3.1.1 电源连接注意事项平台附带一个交流转直流电源适配器(非欧洲版本),输出为5V/2.8A。这里有一个关键细节:电源接口位于RPX Lite板的前端,通过机箱上的一个开孔露出,接口标识为P16。务必确认电源极性正确(通常接口有防呆设计),5V电压对于数字电路是安全的,但电流需求较大(峰值可能接近2A),务必使用原装或参数匹配的电源。劣质电源的电压纹波可能造成系统不稳定,表现为随机重启或Flash读写错误,这种问题排查起来非常耗时。
3.1.2 串口与网络连接配置
- 串口(调试口):最重要的串口是SMC1,它连接在RPX Lite板的RJ-45接口上(标识为“MON”)。随箱附带了RJ-45转DB9的串口线。你需要用这根线将开发板的MON口连接到主机电脑的串口(或USB转串口适配器)。一个常见的坑是“零调制解调器”(Null Modem)问题。大多数情况下,连接PC和开发板直连线即可,不需要交叉线。但如果无法通信,可以尝试使用一个Null Modem适配器或检查串口线序。
- 其他串口:SMC2、SCC2、SCC3三个串口通过HIOX扩展卡上的10针接头引出,需要用附带的排线连接到DB9接口。连接时务必注意排线的方向,HIOX卡上标有“Pin 1”,排线的红色线应对应Pin 1。接反可能会损坏接口芯片。
- 以太网:用于TFTP下载镜像和网络调试。使用一根标准的网线连接开发板的ETH口和主机电脑的网口,或者连接到你的局域网交换机。建议在初始配置阶段,将主机和目标板置于一个简单的点对点网络或隔离的子网中,避免复杂的公司网络设置(如DHCP、防火墙)带来干扰。
3.2 主机软件环境搭建
开发主机运行Windows系统,需要按顺序安装多个软件包。顺序很重要,因为后续安装可能会依赖前序安装设置的环境变量。
- 安装QNX 6.1 Windows SDK补丁:这是基础,为后续工具提供QNX Neutrino的头文件和库。
- 安装Metrowerks CodeWarrior for QNX:这是主要的C/C++开发环境。安装时注意选择正确的组件,并记住安装路径。
- 安装mobileGT Quick Start软件:运行配套CD中的
setup.exe。这个步骤非常关键,它会:- 复制示例镜像和构建文件到硬盘。
- 复制一些专用工具(如Flash烧录工具)到硬盘。
- 创建一个名为
MOBILEGT_ROOT的系统环境变量,指向安装目录。后续的脚本和工具都依赖这个变量。安装完成后,务必重启命令行窗口或整个系统,以使环境变量生效。
- 安装IBM VisualAge Micro Edition 1.4:如果你需要进行Java开发。
- 安装Java应用示例:提供一些Java范例程序。
实操心得:建议将所有开发工具安装在一个没有中文和空格的路径下,例如C:\mobilegt_sdk。很多基于Unix哲学的工具链(包括QNX的部分工具)对路径中的空格处理不佳,可能导致构建脚本执行失败。
3.3 目标板引导加载程序(PlanetCore)配置
目标板上电后,首先运行的不是QNX,而是Embedded Planet开发的PlanetCore Boot Loader。它类似于PC的BIOS,负责硬件初始化、设置启动参数,并加载操作系统镜像。
3.3.1 连接与中断引导打开主机上的终端模拟器软件(如Windows自带的超级终端或更现代的Tera Term、PuTTY),配置串口参数:9600波特率,8位数据位,无校验位,1位停止位,无流控。给目标板上电,终端上会在2秒内显示PlanetCore的启动横幅。必须在这2秒内按下ESC键,才能中断自动启动流程,进入PlanetCore的命令行提示符(>)。如果错过了,需要重启目标板重试。
3.3.2 关键网络参数设置进入PlanetCore后,输入set命令查看当前配置。最重要的两个参数是IP(目标板自身的IP地址)和TARGET(主机TFTP服务器的IP地址)。出厂默认设置通常是IP=100.0.0.2,TARGET=100.0.0.1。你需要根据你的主机网络配置修改它们,确保两者在同一网段且不冲突。
> set IP 192.168.1.100 IP equals 192.168.1.100. > set TARGET 192.168.1.50 TARGET equals 192.168.1.50. > storestore命令将设置保存到Flash中,下次启动依然有效。务必确保主机防火墙允许TFTP协议(UDP端口69),否则后续下载镜像会失败。
3.4 构建与烧录系统镜像
mobileGT Quick Start提供了多个预编译的系统镜像(.loadme文件),对应不同的硬件功能配置(例如,启用触摸屏和音频,或启用额外的串口)。但在实际项目中,你几乎肯定需要定制自己的镜像。
3.4.1 理解构建配置文件(.build文件)在%MOBILEGT_ROOT%\build目录下,你可以找到如config_a.build、config_b.build等文件。这些是QNX的镜像构建描述文件。它们本质上是文本文件,定义了:
- 包含哪些驱动程序(如串口驱动
devc-ser8250、触摸屏驱动devc-ts、音频驱动deva-ctrl-823)。 - 包含哪些可执行文件和库。
- 文件系统的布局。
- 系统启动后执行的脚本。
例如,config_b.build启用了触摸屏和音频,因此它禁用了SCC3和SMC2串口,因为MPC823e的引脚是复用的,触摸屏和音频功能占用了与这两个串口相同的硬件引脚。选择镜像前,必须根据你的硬件外设需求对照文档中的表格进行选择。
3.4.2 编译自定义镜像QNX提供了mkifs(制作镜像文件系统)工具来编译.build文件。mobileGT的构建目录下通常有对应的Makefile。打开命令行,进入该目录,执行:
make config_a这个过程会调用QNX的交叉编译器,将配置文件中指定的所有组件链接、打包成一个可下载的.loadme文件(一种S-Record格式的文件)。如果编译出错,通常是因为环境变量(如QNX_HOST,QNX_TARGET)未正确设置,或者路径中包含空格。
3.4.3 通过TFTP下载与烧录
- 将编译生成的
config_a.loadme文件复制到主机TFTP服务器的根目录(例如C:\tftp-root)。 - 在PlanetCore命令行中,使用
run命令下载并执行该文件:> run config_a.loadme - PlanetCore会启动内置的Flash烧录器。它会先擦除目标Flash的特定区域,然后编程新的镜像。这个过程需要几秒到几十秒,期间切勿断电或重启,否则会导致系统无法启动,需要用更复杂的方法(如通过BDM/JTAG接口)才能恢复。
4. 网络化开发与高级调试技巧
4.1 配置网络化开发环境
预装的“网络化开发系统”镜像是mobileGT SDP的精华所在。它启动后会自动运行一个netconfig脚本,引导你配置网络参数,并允许你将主机上的目录通过网络(NFS或SMB)挂载到目标板上。
4.1.1 运行netconfig目标板以网络镜像启动后,在串口终端或之后通过Telnet登录,运行netconfig。它会询问:
- 目标板的主机名和静态IP地址。
- 网关和子网掩码。
- 是否挂载主机目录(选择Windows主机)。
- 主机的IP地址、共享名(如
C:\mobilegt_share)、以及挂载到目标板上的本地路径(如/mnt/host)。
配置完成后,会在/etc目录下生成一个netstart脚本,每次启动自动执行。此后,你在主机C:\mobilegt_share下编译好的PowerPC可执行文件,就可以在目标板的/mnt/host目录下直接运行,无需反复烧录Flash,极大提升了调试效率。
4.1.2 在CodeWarrior中配置远程调试
- 在CodeWarrior中创建一个新的“QNX Neutrino PPC”项目,将项目路径设置在刚才共享的目录或其子目录下。
- 进入项目的调试设置(
Edit -> C++ Debug Settings...)。 - 在
Debugger树的Connection Settings中,将Connection Type改为TCP/IP Settings。 - 在
Host Name中填入目标板的IP地址和端口,格式为192.168.1.100:10000。这里的10000端口是QNX的pdebug守护进程默认监听的端口。 - 确保目标板上已经运行了
pdebug服务(网络镜像默认已启动)。
现在,你可以在CodeWarrior中设置断点,然后点击调试按钮。IDE会自动将可执行文件同步到目标板(通过挂载的目录),启动它,并建立调试连接。你可以看到代码在目标板真实硬件上逐行执行,同时观察变量、调用栈,体验与本地开发无异的调试过程。
4.2 多通信接口的协同与排错
mobileGT平台提供了丰富的通信接口,在实际车载网络中,可能同时需要用到CAN、LIN、以太网和多个串口。虽然SDP硬件主要提供了串口和以太网,但其配置思路是相通的。
4.2.1 串口设备驱动加载与测试在QNX下,串口设备以文件形式存在于/dev目录。例如,SMC1可能对应/dev/ser1。驱动通常在构建文件(.build)中通过devc-ser8250命令加载,并指定端口、中断和时钟等参数。在应用程序中,你可以使用标准的open(),read(),write()函数以及termios结构体来配置波特率、数据位等参数,就像在Linux下一样。
一个常见的坑是流控(Flow Control)。如果与某些严格的设备通信,可能需要启用硬件流控(RTS/CTS)。这需要在构建文件中为对应的串口驱动添加-c -F等选项,并在应用程序中正确设置termios标志。如果配置不当,会导致数据丢失。
4.2.2 网络服务配置QNX Neutrino提供了完整的TCP/IP栈。你可以轻松地运行FTP、Telnet服务器,甚至是一个小型的Web服务器。通过inetd(超级服务器)可以管理这些服务。例如,使能Telnet服务可以让多个开发者同时登录到目标板,而不必争抢唯一的串口控制台,这在团队协作时非常有用。
注意事项:在生产环境中,务必修改默认的root空密码,并关闭不必要的网络服务,以增强系统安全性。
5. 项目实战:构建一个简单的车载状态显示器
为了将上述知识串联起来,我们设想一个简单的实战项目:开发一个车载状态显示器,通过一个串口接收来自车辆CAN网关转换后的ASCII格式数据(如车速、转速、水温),并实时显示在LCD屏幕上。
5.1 软件架构设计
我们将采用多进程的架构,这是QNX推荐的、利于保持系统健壮性的方式:
- 数据采集进程(
data_collector):负责打开指定的串口设备(如/dev/ser2),循环读取数据,解析协议,将解析后的有效数据通过QNX的IPC(消息传递或共享内存)发送给显示进程。 - 显示渲染进程(
ui_renderer):使用QNX Photon微图形库或更低层的帧缓冲(Framebuffer)接口,在LCD上绘制图形界面。它接收来自数据采集进程的数据,并更新屏幕上的数字和仪表盘。 - 主控进程(可选):负责启动、监控其他进程,并处理系统事件(如触摸屏输入)。
5.2 关键代码片段与说明
数据采集进程(片段):
#include <fcntl.h> #include <termios.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <sys/neutrino.h> // 用于QNX IPC int main(int argc, char *argv[]) { int fd; struct termios config; char buffer[256]; int bytes_read; // 1. 打开串口设备 fd = open("/dev/ser2", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("无法打开串口"); return -1; } // 2. 获取当前串口配置 tcgetattr(fd, &config); // 3. 设置波特率、数据位、停止位、无校验 cfsetispeed(&config, B115200); // 假设CAN网关输出波特率为115200 cfsetospeed(&config, B115200); config.c_cflag &= ~PARENB; // 无校验 config.c_cflag &= ~CSTOPB; // 1位停止位 config.c_cflag &= ~CSIZE; config.c_cflag |= CS8; // 8位数据位 config.c_cflag &= ~CRTSCTS; // 无硬件流控 (根据实际情况调整) config.c_cflag |= CREAD | CLOCAL; // 启用接收,忽略调制解调器状态线 config.c_iflag &= ~(IXON | IXOFF | IXANY); // 无软件流控 config.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 非规范模式,原始数据 // 4. 应用配置 if (tcsetattr(fd, TCSANOW, &config) != 0) { perror("串口配置失败"); close(fd); return -1; } // 5. 循环读取数据 while (1) { bytes_read = read(fd, buffer, sizeof(buffer) - 1); if (bytes_read > 0) { buffer[bytes_read] = '\0'; // 简单解析:假设数据格式为 "SPD:120,RPM:3000\n" parse_and_send_data(buffer); // 解析并通过IPC发送给UI进程 } usleep(10000); // 休眠10ms,避免CPU空转 } close(fd); return 0; }要点解析:串口配置是嵌入式通信的基础。这里的关键是正确设置termios结构体。CLOCAL标志忽略调制解调器控制线,对于直接连接的线缆是必须的。我们使用了非规范模式(raw mode),这样read()调用会立即返回当前接收到的所有数据,适合处理不定长的数据帧。
5.3 系统构建与集成
- 修改构建文件:在
config_b.build(假设我们需要触摸屏)的基础上,添加我们编译好的data_collector和ui_renderer可执行文件到镜像的文件系统中。同时,确保串口驱动devc-ser8250针对SCC2(对应HIOX上的一个串口)的配置是正确的。 - 编写启动脚本:在构建文件中,可以添加一个
.startup脚本,在系统启动时自动运行我们的两个进程。# 在.build文件中 [+script] .startup = { # 启动数据采集进程,指定串口设备 data_collector -d /dev/ser2 & # 启动UI渲染进程 ui_renderer & } - 编译与烧录:使用
mkifs编译新的系统镜像,然后通过PlanetCore的TFTP功能烧录到目标板。 - 测试与调试:上电后,系统会自动运行我们的应用。我们可以通过串口终端查看进程的打印信息,或者通过CodeWarrior附加到进程上进行调试。同时,可以用一个USB转串口工具模拟CAN网关,向
/dev/ser2发送格式化的数据字符串,观察LCD屏幕上的显示是否相应更新。
6. 常见问题排查与经验总结
6.1 典型问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 串口终端无任何输出 | 1. 电源未接通或电压不足。 2. 串口线连接错误或损坏。 3. 终端软件参数设置错误(波特率、数据位等)。 4. PlanetCore串口输出被禁用。 | 1. 检查电源指示灯,用万用表测量板卡供电点电压。 2. 尝试更换串口线,确认是直连线而非交叉线。 3. 核对波特率是否为9600(初始状态),数据位8,无校验,停止位1,无流控。 4. 尝试在启动瞬间狂按ESC键,若仍无反应,可能需要通过硬件复位EEPROM恢复PlanetCore默认设置(参考手册)。 |
| TFTP下载镜像失败 | 1. 网络物理连接不通。 2. 主机与目标板IP地址不在同一网段。 3. 主机防火墙阻止了TFTP(UDP 69端口)。 4. PlanetCore中 TARGET地址设置错误。5. 文件未放入TFTP服务器根目录。 | 1. 检查网线、指示灯。 2. 在主机和目标板分别 ping对方IP。3. 临时关闭主机防火墙或添加TFTP例外规则。 4. 在PlanetCore中用 set命令检查并修正IP和TARGET。5. 确认文件已复制到TFTP服务指定的目录。 |
| QNX Neutrino镜像启动后无反应或很快停止 | 1. 镜像文件损坏或下载不完整。 2. 镜像配置与硬件不匹配(如驱动冲突)。 3. 系统启动脚本有错误导致崩溃。 4. 串口终端波特率与镜像启动后波特率不一致。 | 1. 重新下载或编译镜像,计算文件的MD5校验和。 2. 确认使用的 .build文件是否与你的硬件外设(如触摸屏、音频)需求一致。3. 在构建文件中简化 .startup脚本,仅启动一个简单的hello程序测试。4. PlanetCore和QNX的波特率是独立设置的。如果QNX镜像以115200启动,而终端仍为9600,会看到乱码。需要在PlanetCore中或QNX启动后调整终端波特率。 |
| CodeWarrior无法连接远程调试器 | 1. 目标板pdebug服务未运行。2. 主机与目标板网络不通。 3. CodeWarrior中调试连接IP:端口设置错误。 4. 目标板防火墙规则阻止了10000端口。 | 1. 通过串口或Telnet登录目标板,运行`pidin |
| 触摸屏或音频功能不正常 | 1. 当前运行的镜像未包含对应驱动。 2. 引脚复用冲突。 | 1. 使用支持该功能的镜像(如config_b.build支持触摸屏和音频)。2. 检查 .build文件,确保相关驱动(devc-ts,deva-ctrl-823)已正确加载,且没有与其他功能(如SCC3, SMC2串口)冲突。 |
6.2 资深开发者经验谈
关于系统稳定性:汽车电子对稳定性的要求是极致的。在mobileGT平台上进行开发,要充分利用QNX的“消息传递”IPC机制,而不是大量使用共享内存。消息传递是QNX微内核设计的核心,它天然提供了进程间的隔离和保护。一个进程的崩溃不会通过野指针污染其他进程的内存空间。在设计多进程应用时,将功能模块化,每个模块作为一个独立的进程,通过消息进行通信,可以极大地提高系统的容错能力。
关于性能优化:MPC823e的CPM是个宝藏。对于需要处理多个串口或网络数据包的应用,研究如何将协议解析等任务放到CPM上运行,能显著减轻主CPU负担。虽然编程模型比直接操作主CPU复杂,但带来的性能提升在资源紧张的车载环境中是值得的。可以查阅MPC823e的参考手册,了解CPM的RISC核心编程细节。
关于版本管理:整个mobileGT开发环境涉及多个厂商的工具链(QNX, CodeWarrior, VisualAge)。务必为你的项目建立一个清晰的目录结构,并备份好所有工具的安装程序和许可证文件。同时,将你自定义的.build文件、启动脚本、驱动配置参数等都纳入版本控制(如SVN或Git)。我曾遇到过因为硬盘损坏,导致整个团队无法重建一个稳定版本开发环境的情况,教训深刻。
关于从开发板到产品:mobileGT SDP是一个强大的开发平台,但直接将其硬件用于量产车是不现实的。它的价值在于提供了完整的软件参考设计和经过验证的驱动。当你们的产品硬件团队基于MPC823e或同类处理器设计出自己的车规级板卡时,mobileGT上的QNX BSP(板级支持包)、驱动代码和应用程序框架,绝大部分都可以移植过去。这时,你在SDP上积累的开发和调试经验,就成为了项目最宝贵的财富。