尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows 10 IoT Core ARM技术预览版:树莓派实测与UWP开发

Windows 10 IoT Core ARM技术预览版:树莓派实测与UWP开发 前阵子把吃灰的树莓派3B从抽屉里翻出来把原来跑Linux的SD卡重新格式化准备折腾一下Windows 10 IoT Core on ARM Platform的Technical Preview。老实说一开始我并不看好这套组合Windows这种“重型系统”塞进ARM嵌入式板子怎么看都像硬凑。但微软既然专门放出了技术预览那就值得花一个周末实测一遍看看它到底只是刷个存在感还是已经能承担真正的物联网产品原型。这篇文章不是官方文档的复读而是一个偏底层的开发者实际部署、开发、调试后的记录。内容会覆盖Technical Preview版在ARM平台上的安装过程、开发环境配置、UWP应用部署、GPIO控制、性能表现和稳定性问题也包含我在几个不同板子上踩过的坑。无论你是想评估Windows 10 IoT Core适不适合做自己的项目还是单纯好奇ARM平台上的Windows是什么体验这篇文章都能帮你少绕弯路。1. Windows 10 IoT Core与ARM平台的结合点Technical Preview究竟在预览什么1.1 微软把Windows塞进ARM板子的真实目标很多人看到“Windows 10 IoT Core on ARM Platform”第一反应是桌面版的Windows能直接跑在树莓派上吗答案显然不是。IoT Core不是Win10桌面版的精简版它没有熟悉的桌面、没有资源管理器、没有开始菜单只有一层New App Model的壳用来承载UWP应用。微软做这个版本目标很明确让已经会写Windows应用的开发者可以用熟悉的C#、C、Visual Studio工具链直接开发嵌入式设备上的应用而不必去啃Linux、交叉编译、Makefile这套流程。在这个目标下面ARM平台的技术预览就特别重要。嵌入式设备里ARM架构占了绝大多数功耗、体积、外设接口都比x86更适合做物联网节点。但Windows以往的驱动模型、系统体积、实时性都不占优所以微软必须拿出一个组件化、小体积、可裁剪的核心系统才有可能跟嵌入式Linux掰手腕。Technical Preview的意义在于微软愿意提前把不够成熟的东西丢出来让硬件厂商和开发者验证驱动、性能、工具链再根据反馈调整正式版。我在实测后的感受是这套系统在树莓派这种低端ARM设备上确实跑得动但离“流畅”还有一段距离。技术预览版的价值更多在于“暴露问题”和“验证方向”而不是直接作为生产系统。如果把这个定位理解错了后面所有的体验都会带着预期落差。1.2 技术预览版相对正式版多给了什么、少给了什么技术预览版不是一个功能缩减的简化版很多细节反而比某些正式渠道版本更“前线”。在ARM平台的Technical Preview里我能明显感知到几个侧重点面向OEM和板卡厂商官方提供了针对树莓派2、树莓派3、MinnowBoard MAX等常见开发板的镜像能直接烧录而不是只给一个BSP让你自己编译。驱动不完整是常态树莓派的不少板载外设驱动已经能工作但有些只有基础功能。比如树莓派的板载音频在早期预览版里就经常没有声音输出WiFi模块在有些版本里只能靠外接USB网卡。开发者模式是后补的首次开机的“开发者模式”配置在Device Portal里才能完全打开命令行下的开发者模式开关在部分版本里不稳定。系统更新走独立通道预览版更新频率较高每次大更新都可能改变配置方式或默认行为。这在正式环境里是灾难但作为预览就是用来适应变化的。换句话说Technical Preview“多给”的是提前接触新硬件和工具链的机会“少给”的是稳定性和长期兼容性保障。如果你拿它当正式产品玩会被折腾得怀疑人生如果你拿它当技术验证平台反而能发现很多正式文档里根本不会写的细节。2. 在三块ARM板子上折腾部署从镜像选择到首次开机2.1 硬件选型和镜像获取不只是树莓派的选择题准备测试前我列了一个条件板子要便宜、资料多、ARM架构有代表性。最后选了树莓派3B、树莓派2B和一块MinnowBoard MAX。三块板子代表了ARM Cortex-A53和x86兼容平台两种路线其中树莓派是这次Technical Preview的主战场资料最多。硬件准备清单其实很简单一张8GB以上的SD卡建议Class 10或A1级别。技术预览版镜像虽然不大但SD卡速度直接影响启动和应用安装体验别再翻出古董卡。5V/2.5A电源。很多人一上来就遇到树莓派启动不稳定、掉盘、USB外设失效根源往往是供电不足。网线一条。技术预览版对WiFi的支持不是每个版本都稳有线网络可以减少前期变量。显示器、HDMI线、USB键盘。虽然IoT Core最终是Headless模式但首次排错时能看到启动屏幕能省很多猜测。镜像获取方面官方渠道就是Windows 10 IoT Core DashboardIoT Core仪表板。下载后选择设备类型它会自动拉取对应ARM平台的Technical Preview镜像。这里有个坑Dashboard默认下载的是稳定版镜像如果你已经加入了Windows Insider计划且设备处于Insider通道Dashboard上才会出现Technical Preview选项。找不到Technical Preview镜像时先检查Dashboard版本和登录的微软账号是否满足预览资格。2.2 烧录SD卡的两种姿势与格式化陷阱烧录分两种姿势一种是官方Dashboard的“一键烧录”另一种是手动把镜像写入SD卡。官方Dashboard的方式非常傻瓜化打开IoT Core Dashboard选择“Setup a new device”。设备类型选“Raspberry Pi 3”或“Raspberry Pi 2”。插入SD卡Dashboard识别到盘符。选择镜像源此时选Technical Preview通道填写设备名称和管理员密码。点击安装等待镜像写入。这个方法的问题是Dashboard有时会把镜像写到U盘设备序号而不是SD卡设备序号。我有一次插着读卡器又插着U盘Dashboard默认选错差点把U盘清空。所以手动烧录更可控尤其当你在做多板子验证时。手动烧录我推荐用Etcher跨平台、界面简单、能自动校验写入结果。如果你在Windows下用命令行需要先确认镜像是否是IMG格式然后用类似这样的方式写入# 以管理员身份运行把X替换为SD卡盘符 Write-DiskImage -ImagePath C:\iot\Win10_IoT_Core_RPi3.raw -DriveNumber 3写前务必打开“磁盘管理”确认DriveNumber别问我是怎么知道的——我第二次懒得确认把数据盘覆盖了一半。格式化陷阱更要单独说。Windows 10 IoT Core镜像写入后会生成EFI系统分区和数据分区树莓派固件能从FAT32分区引导。如果你要手动格式化SD卡千万不要把整个卡一次性格式化成NTFS或exFAT又取消分区这样会导致树莓派完全无法引导。正确做法是先让SD卡回到未分配状态再写入完整镜像。Windows自带diskpart可以清理diskpart list disk select disk 3 clean exit清理之后再写镜像。这一步看似多此一举却能避免旧分区残留引发的引导混乱。2.3 首次开机的引导流程从登录到进入Headless模式镜像烧好插电接HDMI屏幕点亮后等待一段时间会看到Windows Logo和齿轮转圈。第一次开机比后续启动慢很多需要做系统部署大概要5到10分钟取决于SD卡性能。别以为卡死了等出现“Initializing”之类的提示或者设备重启一次才算完成。技术预览版默认不带桌面UI最终会停在两种状态要么显示一个带设备IP和名称的彩色背景页面要么直接黑屏只有命令行窗口。不管哪种都已经进入Headless模式可以拔掉显示器了。这时候遇到的第一个拦路虎是密码。官方默认用户名是Administrator默认密码是pssw0rd如果你在Dashboard里设置了自定义密码就用自定义的。这里必须强调默认密码是公开的技术预览设备只要暴露在网络里几分钟之内就可能被人扫到并尝试登录。我每次烧好新镜像的第一件事就是立即登录并改密码这件事优先级高于一切。在首次开机时我习惯做三件事记录屏幕下方或开头的设备IP。用另一台电脑尝试ping通设备。打开浏览器访问http://设备IP:8080确认Windows Device Portal能打开。如果ping不通或网页打不开优先检查网线、路由器AP隔离、防火墙。树莓派有线网口默认是DHCP多数路由器会自动分配IP。如果看不到IP可以再接显示器看屏幕底部的网络信息或者干脆从路由器后台找主机名。3. 远程管理、驱动调试和第一个UWP应用部署3.1 Windows Device PortalIoT Core的管理入口Windows Device Portal是这套系统最值钱的部分没有它IoT Core的可用性会打对折。它本质上是一个跑在设备上的Web服务器打开http://设备IP:8080就能管理设备的大部分功能。页面左侧的菜单很直观Apps查看运行中的应用、关闭应用、启动应用。Process查看系统进程、CPU、内存占用。Performance实时曲线看资源调度情况。IoT Onboarding配置网络、连接WiFi、设置设备名称。Debug抓取实时日志、配置内核模式调试。我在技术预览版上最喜欢它的“Live Kernel Memory”视图可以快速看到内核池和提交内存判断是不是出现内存泄漏。不过这个页面后来在部分版本里被移到了“Process”下面位置不固定找的时候多留个心眼。第一次打开Device Portal会让你设置访问密码。这里有个安全细节访问密码和系统登录密码是两个维度的东西Device Portal走的是HTTPS方式有时候是HTTP加挑战设置完后会保存到设备注册表。如果忘记密码只能重新刷机没有带外恢复通道。所以在设置Device Portal密码时我会专门存在密码管理器里而不是随手输一个。Device Portal还提供了一种便捷的文件上传方式可以在“Apps”页面直接安装.appx和.appxbundle包不用每次都连Visual Studio。这对快速迭代一个安装包特别有用尤其是当你只想在设备上验证一个无关紧要的小改动时省去了Visual Studio远程部署的启动等待。3.2 从Visual Studio把UWP应用部署到ARM设备想要体验Windows 10 IoT Core的开发流首先得有Visual Studio。我用的是Visual Studio 2017/2019系列预览版当时需要装对应的“开发物联网”工作负载装上“Universal Windows Platform development”工作负载后还需要单独勾选Windows 10 IoT Core Templates模板扩展。没有这个模板新建项目时会找不到“Blank App (Windows IoT)”入口。部署步骤看起来简单但细节多新建一个Blank App (Universal Windows)项目。在项目属性里选择“Debug”目标设备选“远程机器”。输入设备IP地址身份验证方式选“无”或“Windows身份验证”具体取决于你当时Device Portal设置。F5部署。这里我踩过几个坑第一个是身份验证方式不匹配。当Device Portal设置了密码但Visual Studio里选了“无”部署会失败报一堆连接拒绝或认证失败的错误。解决办法是在项目属性里选“Windows身份验证”并输入和Device Portal一致的凭据如果设备是Home版或没加密也可以关闭Device Portal验证但我不推荐这种做法。第二个是项目目标架构不匹配。树莓派是ARM但Visual Studio解决方案默认可能是x86。如果你在x86配置下点击部署会报“无法部署到ARM设备”之类的错误。需要把解决方案平台切换到ARM并且项目属性里也选成ARM。第三个是网络发现不稳定。Visual Studio远程部署依赖设备上的“远程调试”组件这个组件如果是预览版且设备刚重启过端口可能起不来。解决办法是先访问一次Device Portal让它把后台进程拉起来再回Visual Studio重新F5。部署成功后应用会出现在Device Portal的“Apps”列表里。如果应用本身没有UI只是后台任务它不会在设备上弹任何窗口。想要验证应用是否运行可以在Device Portal的“Process”里看到对应的exe进程或者通过应用内的Debug日志输出到远程调试器。3.3 GPIO控制与Arduino Wiring模式物联网设备绕不开引脚控制。在Windows 10 IoT Core里GPIO操作主要通过Windows.Devices.Gpio命名空间完成。下面是我在树莓派上点亮LED的C#代码片段逻辑基本是拿到GPIO控制器打开5号引脚设置输出模式再拉高电平。using Windows.Devices.Gpio; var gpioController GpioController.GetDefault(); if (gpioController null) { // 当前设备不支持GPIO或驱动未加载 return; } var pin gpioController.OpenPin(5); pin.SetDriveMode(GpioPinDriveMode.Output); pin.Write(GpioPinValue.High);这段代码看起来简单但第一行就藏着一个常被忽略的问题GpioController.GetDefault()返回null后续所有调用都会崩。技术预览版在某些ARM板上没有自动加载GPIO驱动你需要先在Device Portal里检查“IoT Onboarding”页面是否显示了板卡型号和引脚映射。如果控制器为null大概率是缺少对应的更新包或驱动先把所有系统更新跑完再试。另一个要注意的是引脚编号。树莓派里OpenPin(5)用的是BCM编号不是物理引脚位置。物理引脚第29脚才对应BCM 5如果按照物理引脚顺序去连LED很容易连错。这个问题在Arduino Wiring模式下也一样存在别想当然。Arduino Wiring是IoT Core里另一个有意思的东西。简单说它把C的Arduino风格函数pinMode、digitalWrite、Serial.begin映射到底层驱动。对于从Arduino转过来的开发者来说上手门槛极低。但在技术预览版上Arduino Wiring和UWP的应用模型有冲突部分版本里你只能开发“Arduino Wiring Application”模板项目并且难以和UWP UI混合使用。如果只是纯传感器控制Arduino Wiring够用一旦要加入网络、UI、后台任务还是老实回到UWP C#。4. 技术预览版的真实底细性能、稳定性与兼容性观察4.1 启动时间、内存占用和进程管理跑技术预览版最关心的问题就是这块ARM板子到底扛不扛得住Windows。我拿树莓派3B做了简单测量测试条件是用同一张Class 10 SD卡系统是Technical Preview较新的一个迭代版本。开机到能ping通大概要20到35秒到Device Portal完全可用大约要1分钟左右。相比树莓派上优化好的嵌入式Linux镜像一般10到15秒能进入用户态应用Windows IoT Core的启动确实偏慢。但考虑到它内部还带着完整的UWP运行时、COM基础组件和一大堆系统服务这个速度可以接受但不是惊喜。内存占用方面比较“实诚”系统刚启动任务管理器通过Device Portal看显示已提交内存大约在300MB到400MB之间。树莓派3B只有1GB内存如果我们自己写的UWP应用再吃掉100MB留给其他进程的空间其实不多了。所以我建议如果计划跑复杂业务优先选2GB以上内存的ARM板树莓派3B这类设备只适合做单应用、轻量逻辑。进程管理也比我想象的Windows桌面版更“精简”。打开Device Portal的Process列表看到的是Shell、后台服务和应用进程没有桌面版那些挂着一堆无意义进程的情况。但偶尔会看到一两个处于“挂起”状态的系统服务这种服务在网络或存储空闲时会降低功耗但也有概率导致某些外设无响应比如USB转串口丢失。遇到外设失灵我的习惯是先检查这个挂起服务再考虑驱动问题。4.2 常见卡死、重启与日志排查链路技术预览版不稳定的地方主要集中在三种场景系统更新、SD卡I/O压力、WiFi切网。系统更新过程中如果中途断电或SD卡出现坏块系统很容易直接进入连续重启循环。这个循环的排查方式很烦人因为你看不到桌面蓝屏只有启动Logo反复出现。排查链路我建议这样走接上HDMI观察启动阶段是否卡在固定的“Windows Logo”或者“准备设备”页面。用另一台电脑打开Device Portal如果设备还能网络响应查看“Debug”页的实时事件日志。如果网络响应不了只能通过串口调试线连接树莓派的UART查看内核输出确认系统卡在哪个驱动加载阶段。如果确认是更新包损坏最省事的方案是重刷镜像而不是尝试修复。技术预览版里我还经常遇到“应用部署成功后立即启动秒退”的问题。这时候抓日志不能只看应用日志还要看系统事件频道里的.NET运行时异常。上Device Portal的Debug页选“Application”频道能看到挂掉的UWP进程的崩溃信息包括托管异常栈。很多秒退是应用里用了不支持的API导致的比如试图打开文件选择器IoT Core根本没有这个UI。另外SD卡写入频繁也可能造成系统卡死。IoT Core默认会把一些日志和应用数据写到SD卡如果SD卡本身掉速严重写入队列堆积整个系统会像冻住一样。我试过一块不知名杂牌卡开机30分钟后系统开始卡顿换成SanDisk Ultra后问题消失。所以不要忽视存储介质质量。4.3 与主流ARM嵌入式方案的差距对比为了更客观地评估我把树莓派上跑的Windows 10 IoT Core和一套常见的嵌入式Linux方案同样基于树莓派3B做了对比。核心差距并不是性能而是生态切入角度不同。对比维度Windows 10 IoT Core Technical Preview常见的Linux嵌入式方案开发语言C#/C UWP为主工具链一体化C/C/Python等皆可组合灵活驱动生态官方预置一部分长尾外设支持偏弱开源驱动覆盖广但需要自己配置图形界面需要自己绘制UWP界面或Headless无标准桌面可跑精简X11/Wayland可定制程度高远程管理Device Portal PowerShellSSH 各种Web管理面板系统体积约几GB占SD卡较多可以裁剪到几百MB甚至更小稳定性预览版偶发重启、更新循环选对映像后可以长时间稳定运行学习成本对Windows/.NET开发者友好需要熟悉Linux、交叉编译、服务管理这个表格不是为了分高下而是为了让选型更清晰。如果团队本来就是.NET技术栈希望设备端和云端用同一套语言Windows IoT Core可以显著缩短开发链路。如果项目需要精细控制内核、驱动、裁剪体积Linux依然是更优解。5. 现在入坑还是继续等我的取舍建议与后续动作5.1 什么场景适合用IoT Core ARM经过这段实测我给出的建议是并非所有ARM物联网项目都适合Windows IoT Core但有一个典型场景特别契合——就是“设备端的业务逻辑已经用C#写好了希望跑在一个受控的、能远程更新的平台上”。比如一个工业数据采集网关采集、解析、上传数据的逻辑都在UWP应用里系统只承载应用和通信服务不需要桌面。这种场景下IoT Core的组件化模式、UWP沙箱机制、Device Portal远程诊断能带来很大的维护便利。另一个适合的场景是快速产品原型。当你需要在树莓派上快速验证一个概念比如家庭自动化、智能终端、边缘数据处理而团队又熟悉Visual Studio和C#IoT Core可以比Linux方案更快打通“应用部署到硬件”这条链路。一旦原型验证完毕再根据性能和功耗要求决定是否换到更底层系统也不算亏。但如果你要做的产品对实时性要求很高比如控制电机、采集高频传感器数据Windows IoT Core目前的调优能力远不如专用RTOS或实时Linux不要为了省学习成本而硬上。技术预览版的ARM驱动模型还在演进一些需要确定性响应的场景暂时做不到。5.2 我最终保留的测试环境与下一步打算折腾完技术预览版之后我并没有彻底放弃这套系统。我保留了一张专门写有Windows 10 IoT Core ARM镜像的SD卡用于评估新版本和测试UWP应用。原因很朴素虽然技术预览版不稳定但它代表了一条有价值的技术路线尤其是当微软持续补全ARM平台驱动时未来完全有可能变成正式可用的嵌入式系统选项。下一步我打算做两件事一是把现有UWP数据采集应用移植到IoT Core上在高负载网络请求下跑一周记录内存和进程存活率二是继续跟踪新预览版中关于GPIO和PWM驱动能力的变化尤其是对树莓派4及后续板卡的支持。如果新版能解决我观察到的WiFi切网问题我会考虑在一批小型数据采集节点上做小规模试点否则继续用Linux方案。最后再分享一个经验不要在技术预览版上死磕任何一个“怪问题”。这类版本迭代快很多问题在下个版本自然消失。如果你花了两天还解决不了某个驱动或部署问题最好的办法是关闭预览通道、重新下载最新镜像从头烧录一次。这个“重刷大于修复”的思维可能才是体验Windows 10 IoT Core技术预览版最实用的经验。
返回列表