1. 从零认识Nerves框架
Nerves是一个基于Elixir语言的嵌入式开发框架,它让开发者能够用函数式编程的方式构建可靠的嵌入式系统。与传统嵌入式开发相比,Nerves提供了完整的工具链和运行时环境,将Erlang虚拟机的强大功能带入了嵌入式领域。
我第一次接触Nerves是在开发一个工业传感器项目时,当时需要实现设备固件的远程热更新功能。传统C语言开发需要自己实现OTA机制,而Nerves内置的固件更新机制让我在半小时内就解决了这个问题。这种开发效率的提升正是Nerves最吸引人的特点。
1.1 核心组件解析
Nerves架构包含几个关键组件:
- 系统镜像:基于Buildroot定制的Linux系统,只包含运行BEAM虚拟机所需的最小组件
- 工具链:交叉编译工具,支持ARM、x86等多种架构
- 固件打包系统:将Erlang应用、运行时和Linux内核打包成可烧录的固件
- 部署工具:支持SD卡烧录和网络部署两种方式
典型的Nerves应用开发流程是:在主机上开发 -> 交叉编译 -> 生成固件 -> 部署到目标设备。这种工作流与常规Elixir应用开发非常相似,大大降低了嵌入式开发的门槛。
1.2 开发环境准备
在开始LED控制项目前,需要准备以下环境:
-
安装Elixir 1.9+和Erlang/OTP 22+
bash复制# 在Ubuntu上的安装示例 wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb sudo dpkg -i erlang-solutions_2.0_all.deb sudo apt-get update sudo apt-get install esl-erlang elixir -
安装Nerves依赖工具
bash复制
mix archive.install hex nerves_bootstrap -
硬件准备(以Raspberry Pi 3为例):
- Raspberry Pi 3开发板
- 8GB以上Micro SD卡
- 有线网络连接(用于初始配置)
- 电源适配器
提示:虽然Nerves支持多种开发板,但建议初学者从Raspberry Pi开始,因为它内置了可编程控制的LED(ACT LED),无需额外硬件就能完成本教程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 创建第一个Nerves项目
2.1 项目初始化
执行以下命令创建项目骨架:
bash复制mix nerves.new hello_led
cd hello_led
这会生成一个标准的Nerves项目结构:
code复制hello_led/
├── _build/
├── config/
│ ├── config.exs
│ ├── target.exs
│ └── ...
├── lib/
│ └── hello_led.ex
├── test/
├── mix.exs
└── ...
关键配置文件说明:
config/config.exs:通用配置config/target.exs:设备特定配置mix.exs:项目依赖定义
2.2 设置目标平台
Nerves支持多种硬件平台,需要通过环境变量指定:
bash复制export MIX_TARGET=rpi3 # 对应Raspberry Pi 3
或者在每次mix命令前指定:
bash复制MIX_TARGET=rpi3 mix firmware
2.3 获取依赖
运行以下命令获取所有依赖:
bash复制mix deps.get
这个过程会下载:
- 针对目标平台的系统镜像
- 交叉编译工具链
- Elixir依赖库
首次运行可能需要较长时间(约5-10分钟),因为需要下载数百MB的系统镜像。
3. 构建和烧录固件
3.1 固件构建
执行构建命令:
bash复制mix firmware
这个命令会:
- 编译所有Elixir代码
- 打包Erlang运行时
- 生成.fw格式的固件文件
构建成功的输出位于_build/rpi3_dev/nerves/images/hello_led.fw
3.2 烧录到SD卡
插入SD卡后执行:
bash复制mix firmware.burn
这个命令会:
- 自动检测可用的SD卡
- 分区并格式化SD卡
- 写入引导程序、内核和根文件系统
- 部署生成的固件
注意:烧录过程会擦除SD卡上所有数据,请确保选择了正确的设备。在Linux上通常是/dev/sdX,在Mac上是/dev/diskX。
3.3 首次启动
将烧录好的SD卡插入Raspberry Pi并上电。观察以下现象:
- ACT LED会快速闪烁几次(系统启动中)
- 然后保持稳定点亮(系统启动完成)
- 如果连接了HDMI显示器,会看到Linux启动日志
4. 控制LED的基础实现
4.1 添加LED控制库
在mix.exs中添加依赖:
`
