当前位置: 首页 > article >正文

从虚拟机到开发板:手把手教你用NFS在Ubuntu 20.04和ARM板间联调C程序

从虚拟机到开发板构建嵌入式C程序的NFS联调工作流当你在Ubuntu虚拟机里完成了ARM架构的交叉编译看着那个新鲜出炉的Hello World可执行文件接下来要面对的就是嵌入式开发中最磨人的环节——如何把这个程序快速部署到物理开发板上运行测试。传统的方法是用U盘反复拷贝或者通过scp命令传输但这些方式在频繁修改代码的调试阶段简直是一场噩梦。本文将带你搭建一个更优雅的解决方案通过NFS网络文件系统实现虚拟机与ARM开发板的无缝联调。1. 为什么需要NFS联调环境嵌入式开发中最耗时的往往不是写代码本身而是编译-部署-测试这个循环的周转效率。想象一下这样的场景你在Ubuntu上修改了一个变量名需要验证改动效果于是交叉编译生成ARM可执行文件用scp命令将文件传输到开发板SSH登录开发板设置执行权限运行程序发现输出不符合预期重复上述步骤...这种工作流的问题在于每次代码微调都要完整走一遍部署流程严重拖慢开发节奏。而NFS联调方案的核心价值在于它让开发板能够直接访问虚拟机中的文件系统实现即时生效在虚拟机中编译后开发板立即可以运行最新版本零传输延迟省去文件拷贝步骤修改保存后直接测试完整工具链在虚拟机中使用熟悉的IDE编辑代码开发板专注执行调试友好配合gdb-server可以实现源码级远程调试2. 环境准备与网络配置2.1 硬件连接拓扑要实现NFS共享首先需要确保开发板与虚拟机处于同一局域网。推荐以下两种连接方式方案A开发板直连PC推荐[开发板] ←交叉网线→ [PC物理网卡] ←虚拟网桥→ [Ubuntu虚拟机]优势不依赖路由器适合移动办公场景方案B通过路由器组网[开发板] ←网线→ [路由器] ←WiFi/网线→ [PC] ←虚拟NAT→ [Ubuntu虚拟机]优势可同时接入互联网方便软件安装2.2 Ubuntu虚拟机网络配置在VMware/VirtualBox中需要将虚拟机的网络适配器设置为桥接模式Bridged这样虚拟机会获得一个与开发板同网段的独立IP。关键配置步骤# 查看当前网络接口 ifconfig -a # 设置静态IP示例 sudo nano /etc/netplan/00-installer-config.yaml添加以下内容根据实际网络环境调整network: ethernets: ens33: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114]应用配置sudo netplan apply2.3 开发板网络设置通过串口或SSH登录开发板配置网络参数# 临时设置IP重启失效 ifconfig eth0 192.168.1.200 netmask 255.255.255.0 up route add default gw 192.168.1.1 # 永久生效的配置方法取决于开发板系统 # 常见嵌入式Linux系统可修改 vi /etc/network/interfaces添加auto eth0 iface eth0 inet static address 192.168.1.200 netmask 255.255.255.0 gateway 192.168.1.1测试连通性ping 192.168.1.100 # 应该能收到Ubuntu虚拟机的回复3. NFS服务端配置Ubuntu端3.1 安装NFS服务组件sudo apt update sudo apt install nfs-kernel-server3.2 创建共享目录并设置权限建议专门为嵌入式项目创建共享目录而非使用系统目录mkdir -p ~/embedded_share sudo chown -R $USER:$USER ~/embedded_share chmod 755 ~/embedded_share3.3 配置NFS导出规则编辑/etc/exports文件sudo nano /etc/exports添加以下内容根据开发板IP调整/home/yourname/embedded_share 192.168.1.200(rw,sync,no_subtree_check,no_root_squash)参数说明rw读写权限sync同步写入no_subtree_check提高性能no_root_squash允许root用户访问应用配置sudo exportfs -a sudo systemctl restart nfs-kernel-server3.4 防火墙设置如有必要sudo ufw allow from 192.168.1.0/24 to any port nfs4. 开发板挂载NFS共享4.1 安装NFS客户端工具在开发板上执行opkg update # OpenWRT系 或 apt-get install nfs-common # Debian系4.2 创建本地挂载点mkdir -p /mnt/nfs_share4.3 手动挂载测试mount -t nfs -o nolock 192.168.1.100:/home/yourname/embedded_share /mnt/nfs_share参数说明nolock禁用文件锁避免兼容性问题tcp强制使用TCP协议更可靠验证挂载df -h # 应能看到NFS共享 touch /mnt/nfs_share/test_file # 测试写权限4.4 配置开机自动挂载编辑/etc/fstabvi /etc/fstab添加192.168.1.100:/home/yourname/embedded_share /mnt/nfs_share nfs nolock,tcp,hard,intr 0 0关键参数hard保持持久连接intr允许中断挂起操作5. 实战C程序开发调试工作流5.1 项目目录结构建议在共享目录中创建清晰的项目结构embedded_share/ ├── src/ # 存放源代码 ├── build/ # 编译输出目录 ├── scripts/ # 实用脚本 └── tools/ # 开发工具5.2 编写示例Makefile在项目根目录创建Makefile实现自动化编译CROSS_COMPILE arm-linux-gnueabihf- CC $(CROSS_COMPILE)gcc CFLAGS -Wall -g TARGET hello_world SRCS src/main.c src/utils.c OBJS $(SRCS:.c.o) all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o build/$ $^ %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f src/*.o build/$(TARGET) deploy: all echo 编译完成直接运行 echo cd /mnt/nfs_share/build ./$(TARGET)5.3 开发板上的调试技巧实时日志监控tail -f /mnt/nfs_share/build/debug.logGDB远程调试在开发板启动gdbservergdbserver :2345 /mnt/nfs_share/build/hello_world在Ubuntu端使用交叉编译的gdb连接arm-linux-gnueabihf-gdb build/hello_world (gdb) target remote 192.168.1.200:2345性能分析# 在开发板上运行 perf stat -e cycles,instructions,cache-misses /mnt/nfs_share/build/hello_world6. 常见问题排查指南6.1 连接问题诊断流程1. 检查物理连接 ├─ 网线是否插好 └─ 开发板网口指示灯状态 2. 验证IP配置 ├─ Ubuntu ifconfig └─ 开发板 ifconfig 3. 测试基础连通性 ├─ 互相ping测试 └─ telnet测试NFS端口2049 4. 检查NFS服务状态 ├─ sudo systemctl status nfs-kernel-server └─ showmount -e localhost 5. 验证挂载命令 ├─ 手动挂载测试 └─ dmesg | tail 查看内核日志6.2 典型错误与解决方案错误1RPC超时mount.nfs: Connection timed out解决方法确认防火墙已放行NFS端口2049,111检查/etc/hosts.allow和hosts.deny配置错误2权限拒绝mount.nfs: access denied by server解决方法检查/etc/exports中的IP范围和权限设置确认共享目录权限建议755错误3协议不匹配mount.nfs: requested NFS version or transport protocol is not supported解决方法显式指定nfsvers参数如-o nfsvers3更新内核NFS模块6.3 性能优化建议网络层使用千兆网卡和六类线禁用虚拟机网络节流设置NFS配置# 在/etc/exports中添加 async,no_wdelay # 对频繁小文件写入有利开发习惯避免在共享目录下执行git status等扫描操作将编译输出目录与源代码分离7. 进阶集成开发环境配置7.1 VS Code远程开发配置安装Remote - SSH扩展配置SSH连接到Ubuntu虚拟机在共享目录中打开项目配置tasks.json实现一键编译{ version: 2.0.0, tasks: [ { label: Build ARM, type: shell, command: make, group: { kind: build, isDefault: true }, problemMatcher: [] } ] }7.2 CLion远程开发配置配置Toolchains添加交叉编译工具链设置Deployment将代码自动同步到共享目录配置Custom Build TargetBuild: make Clean: make clean Install: ssh root开发板IP cd /mnt/nfs_share/build ./hello_world7.3 自动化测试集成在项目中添加测试脚本#!/bin/bash # tests/run_tests.sh # 编译测试版本 make clean make CFLAGS-DTESTING # 在开发板执行测试 ssh root192.168.1.200 EOF cd /mnt/nfs_share/build ./hello_world_test exit $? EOF # 获取退出状态 TEST_RESULT$? exit $TEST_RESULT

相关文章:

从虚拟机到开发板:手把手教你用NFS在Ubuntu 20.04和ARM板间联调C程序

从虚拟机到开发板:构建嵌入式C程序的NFS联调工作流 当你在Ubuntu虚拟机里完成了ARM架构的交叉编译,看着那个新鲜出炉的Hello World可执行文件,接下来要面对的就是嵌入式开发中最磨人的环节——如何把这个程序快速部署到物理开发板上运行测试。…...

构建免费大模型API代理服务:降低LLM应用开发成本与统一调用方案

1. 项目概述与核心价值最近在折腾大语言模型应用开发的朋友,估计都绕不开一个头疼的问题:API调用成本。无论是做原型验证、功能测试,还是小范围部署,直接调用官方商业API,账单数字跳起来的速度可比代码跑得快多了。这时…...

【读书笔记】《自驱型成长》

《自驱型成长》核心要点整理一、为什么自驱力如此重要? 现代社会中,自驱力缺失已成为普遍问题——无论是职场中只靠奖金期权驱动的年轻人,还是离开父母管控后彻底放纵的大学生,根源都在于:孩子从未真正成为自己人生的主…...

利用Taotoken模型广场为AIGC应用动态选择性价比最优的模型

利用Taotoken模型广场为AIGC应用动态选择性价比最优的模型 1. 理解模型选择的核心需求 在构建内容创作应用时,文案生成和图片描述是两种典型的AIGC任务。文案生成通常需要较强的语言理解和创造力,而图片描述则更注重对视觉元素的准确捕捉。不同模型在这…...

从Blender到Unity:一个免费古屋模型资产的全流程处理实录(含材质优化技巧)

从Blender到Unity:一个免费古屋模型资产的全流程处理实录(含材质优化技巧) 在独立游戏开发或虚拟场景搭建中,获取高质量的3D模型资产往往需要投入大量成本。幸运的是,像Hoi An Ancient House这样的免费优质模型为创作者…...

告别重复编码:用快马平台生成模块化unet模板,极大提升分割项目开发效率

在工业缺陷检测项目中,图像分割是核心环节之一。传统开发流程中,从数据预处理到模型部署的每个环节都需要手动编写大量重复代码,不仅耗时耗力,还容易引入错误。最近尝试用InsCode(快马)平台生成模块化UNet模板后,开发效…...

PX4-Autopilot架构深度解析:构建高效可扩展的无人机飞行控制系统

PX4-Autopilot架构深度解析:构建高效可扩展的无人机飞行控制系统 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot PX4-Autopilot作为业界领先的开源无人机飞控软件,解决了现代…...

Docker监控体系构建全指南(从cAdvisor+Prometheus+Grafana到生产级告警闭环)

更多请点击: https://intelliparadigm.com 第一章:Docker监控体系构建全指南(从cAdvisorPrometheusGrafana到生产级告警闭环) 核心组件选型与职责划分 监控体系采用三层架构:数据采集层(cAdvisor&#xf…...

AutoContext:AI自动优化提示词,提升大模型应用效率

1. 项目概述:AutoContext,让AI自己写提示词的“元工具”如果你和我一样,经常和各类大语言模型(LLM)打交道,无论是ChatGPT、Claude还是本地部署的开源模型,那你一定深知一个痛点:写提…...

为什么你的Docker容器在麒麟V10上内存泄漏翻倍?——基于perf + eBPF的国产内核内存分配栈追踪(含可复用火焰图生成模板)

更多请点击: https://intelliparadigm.com 第一章:Docker容器在麒麟V10上内存泄漏的典型现象与国产化调试必要性 在基于银河麒麟V10(Kylin V10 SP3,内核版本 4.19.90-24.5.ky10.aarch64)部署 Docker 20.10.17 的生产环…...

别只盯着VIF>10:多重共线性处理中的三个常见误区与我的取舍经验

别只盯着VIF>10:多重共线性处理中的三个常见误区与我的取舍经验 在数据分析领域,多重共线性问题就像房间里的大象——人人都知道它的存在,却常常用过于简单化的方式处理。许多分析师机械地遵循"VIF>10就剔除变量"的教条&…...

Ultralytics YOLO模型OpenVINO边缘计算部署与性能优化实战指南

Ultralytics YOLO模型OpenVINO边缘计算部署与性能优化实战指南 【免费下载链接】ultralytics Ultralytics YOLO 🚀 项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics 在边缘计算场景中部署YOLO模型时,技术团队常面临三大核心挑战&a…...

避坑指南:你的GEO芯片数据真的能用吗?快速判断表达矩阵质量的3个关键检查点

GEO芯片数据质检手册:3个关键指标判断你的矩阵是否"健康" 第一次打开GEO数据库下载的表达矩阵时,那种兴奋感很快会被困惑取代——这些数字真的可靠吗?去年协助审稿某期刊的12篇基于GEO数据的论文时,我发现有7篇都存在原…...

OCAuxiliaryTools:让黑苹果配置变得简单的终极图形化管理工具

OCAuxiliaryTools:让黑苹果配置变得简单的终极图形化管理工具 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 还在为复杂…...

产品经理必看:如何用‘用户故事地图’反推用例图?让需求落地更清晰

产品经理实战:从用户故事地图反推用例图的逆向工程思维 在敏捷开发实践中,用户故事地图已经成为产品经理梳理需求的重要工具。但当我们需要将碎片化的用户故事转化为系统化的功能设计时,如何建立两者之间的桥梁?这正是逆向推导用例…...

从‘俄罗斯方块’到‘涟漪移动’:VLSI布局算法里那些有趣的工程比喻与实战选择

从‘俄罗斯方块’到‘涟漪移动’:VLSI布局算法里那些有趣的工程比喻与实战选择 芯片设计就像一场精密的城市交通规划——当数百万个逻辑单元需要被合理地安置在硅基板上时,工程师们创造了一系列充满想象力的算法。这些算法不仅有着"俄罗斯方块"…...

告别USBi!用STM32单片机给ADAU1761音频DSP烧写程序的保姆级教程

低成本实现ADAU1761音频DSP自主烧录:STM32全流程替代方案 在音频信号处理领域,ADAU1761凭借其高性价比和集成化设计,成为众多嵌入式开发者的首选。然而传统开发流程中,ADI官方USBi仿真器的依赖性问题始终困扰着开发者——不仅增加…...

Docker-in-Docker调试失效?VSCode 2026新增嵌套容器调试沙箱(Beta 4已验证OpenShift 4.15兼容)

更多请点击: https://intelliparadigm.com 第一章:Docker-in-Docker调试失效的根源与演进背景 Docker-in-Docker(DinD)曾被广泛用于 CI/CD 流水线中构建容器镜像,尤其在 GitLab Runner 或 Jenkins Agent 等隔离环境中…...

别再问接线了!XK3168地磅仪表DB9线RS232通讯,一个Java串口程序搞定数据采集

工业地磅数据采集实战:Java串口通信解析XK3168仪表全流程 车间里那台老式地磅又罢工了——这是不少工厂工程师的日常烦恼。传统工业设备与现代IT系统之间的数据鸿沟,往往让现场调试变成一场耗时耗力的拉锯战。本文将手把手带您打通XK3168地磅仪表数据采集…...

Python零基础如何快速调用Taotoken平台上的大模型API

Python零基础如何快速调用Taotoken平台上的大模型API 1. 准备工作 在开始调用Taotoken平台的大模型API之前,需要确保已经完成以下准备工作。首先,注册一个Taotoken账号并登录控制台。在控制台的API Key管理页面,可以创建新的API Key&#x…...

为 Ubuntu 上的 OpenClaw Agent 工作流配置 Taotoken 作为模型供应商

为 Ubuntu 上的 OpenClaw Agent 工作流配置 Taotoken 作为模型供应商 1. 准备工作 在开始配置之前,请确保您的 Ubuntu 系统已安装 Node.js 16 或更高版本。这是运行 OpenClaw 和 Taotoken CLI 工具的基础环境。您可以通过以下命令检查 Node.js 版本: …...

魔兽地图转换与修复终极指南:w3x2lni如何拯救你的地图文件

魔兽地图转换与修复终极指南:w3x2lni如何拯救你的地图文件 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 你是否曾因魔兽地图版本不兼容而烦恼?是否遇到过重要地图文件损坏却束手无策&…...

ClawRecipes:基于文件优先与菜谱驱动的AI团队协作脚手架

1. 项目概述:ClawRecipes,一个为AI团队协作而生的“脚手架”工具如果你正在使用OpenClaw,并且已经厌倦了在聊天界面里手动协调多个AI助手、来回传递文件、或者为每个新项目重复搭建相同的工作目录结构,那么ClawRecipes可能就是你在…...

别再乱配Jackson了!这5个SerializationFeature和DeserializationFeature配置,能帮你避开90%的坑

别再乱配Jackson了!这5个SerializationFeature和DeserializationFeature配置,能帮你避开90%的坑 最近在重构一个老项目时,我又一次被Jackson的配置问题折腾得够呛。API返回的数据莫名其妙少了几个字段,日志输出的JSON格式混乱不堪…...

VSCode多智能体协同编程不是未来,是现在:2026 Q1已上线的4项GA特性+2项Preview功能(附微软内部性能压测原始数据)

更多请点击: https://intelliparadigm.com 第一章:VSCode多智能体协同编程不是未来,是现在 VSCode 已通过插件生态与开放 API 实现多智能体(Multi-Agent)协同编程的生产级落地——开发者不再需要等待“下一代 IDE”&…...

从“盲人摸象”到“心中有数”:ESO(扩张状态观测器)如何让机器人感知未知扰动

从“盲人摸象”到“心中有数”:ESO如何赋予机器人感知未知扰动的第六感 想象一下驾驶汽车穿越崎岖山路时,方向盘会自动补偿颠簸带来的偏移;或者工业机械臂在负载突然变化时,依然能保持精准轨迹——这些场景背后都隐藏着一个关键挑…...

PostgreSQL vs MySQL:深度技术对比与选型指南

引言 在数据库选型时,PostgreSQL和MySQL是两个最热门的选择。它们都是成熟的开源关系型数据库,但底层架构和设计理念有显著差异。 本文从技术角度深入分析两者的区别,帮助你做出正确的选型决策。 本文由PGCCC(中国权威PG认证机构…...

在智能客服系统中集成多模型API以提升回答质量与稳定性

在智能客服系统中集成多模型API以提升回答质量与稳定性 1. 智能客服系统的多模型集成需求 现代智能客服系统需要处理多样化的用户查询,从简单的FAQ匹配到复杂的业务咨询。单一模型往往难以覆盖所有场景,可能出现部分问题回答质量不稳定或超出模型能力范…...

3步终极指南:如何永久免费使用Cursor AI编程助手Pro功能

3步终极指南:如何永久免费使用Cursor AI编程助手Pro功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...

AI原生开发闭环:human_test()实现自动化真人可用性测试与修复

1. 项目概述:当AI开发遇上真人测试 最近在折腾一个挺有意思的项目,叫 human_test() 。这名字听起来像个函数调用,实际上它也确实是一个可以被AI智能体(Agent)直接调用的“技能”。简单来说,它解决了一个A…...