树莓派内核交叉编译与DHT11传感器使用指南
1. 树莓派内核交叉编译
在嵌入式平台上通常无法构建内核,但树莓派凭借其丰富的根文件系统可以实现这一操作。不过,为了获得更快的编译速度,在桌面系统上进行交叉编译往往是更优选择。
1.1 准备工作
假设你已经准备好了交叉编译工具和环境,交叉编译器前缀假设为
/opt/x−tools/arm–unknown−linux–gnueabi/bin/*
,如果工具安装位置不同,请相应替换。
安装主机环境工具:
$ sudo apt-get install git bc
$ sudo apt-get install libncurses5-dev
获取内核源代码:
$ cd ~/xrpi/devel/staging
$ git clone --depth=1 https://github.com/raspberrypi/linux
$ cd ./linux
注意添加
--depth=1
选项以避免长时间下载不必要的历史记录。
修复
inputbox.c
文件:
$ nano scripts/kconfig/lxdialog/inputbox.c
在大约第128行找到
case KEY_BACKSPACE:
,并在其下方添加
case 8:
,然后保存文件。
执行
make mrproper
命令:
$ cd ~/xrpi/devel/staging/linux
$ make mrproper
注意该命令会清除包括
.config
文件在内的所有内容,建议将
.config
文件备份到
~/.config.bak
或其他安全位置。
1.2 不同型号树莓派的配置
-
Pi 1/Zero/Zero W
编辑Makefile:
bash $ cd ~/xrpi/devel/staging/linux $ nano Makefile
在文件顶部添加以下两行:
ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi-
调整PATH变量:
bash $ PATH="/opt/x-tools/arm-unknown-linux-gnueabi/bin:$PATH"
生成默认配置:
bash $ make bcmrpi_defconfig
进一步自定义配置:
bash $ make menuconfig -
Pi 2/3/3+/Compute Module 3
同样编辑Makefile并添加:
ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi-
调整PATH变量:
bash $ PATH="/opt/x-tools/arm-unknown-linux-gnueabi/bin:$PATH"
生成默认配置并自定义:
bash $ make bcm2709_defconfig $ make menuconfig
1.3 构建内核
配置完成后,开始构建内核:
$ make zImage modules dtbs
构建过程可能需要较长时间,例如在较旧的32位单核心Devuan Linux实例上,此步骤耗时2小时15分钟。
如果
/tmp
文件系统空间不足,可以将临时文件指向其他目录:
$ mkdir ./tmp
$ export TMPDIR="$PWD/tmp"
1.4 安装内核
-
本地安装
在树莓派3 B+ 或类似型号上构建内核后,可按以下步骤将新内核安装到/boot分区:
bash $ sudo make modules_install $ sudo cp arch/arm/boot/dts/*.dtb /boot/ $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/ $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
对于Pi 1/Zero/Zero W:
bash $ sudo cp arch/arm/boot/zImage /boot/kernel.img
对于Pi 2/3/3+/Compute Module 3:
bash $ sudo cp arch/arm/boot/zImage /boot/kernel7.img -
交叉安装
首先确定SD卡位置:
bash $ lsblk $ sudo blkid
挂载SD卡:
bash # mkdir /mnt/boot # mkdir /mnt/root # mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/root
重命名原内核文件:
bash # cd /mnt/boot # mv kernel.img kernel.was
安装编译好的模块:
bash $ cd ~/xrpi/devel/staging/linux $ sudo make INSTALL_MOD_PATH=/mnt/root modules_install
复制内核文件:
对于较小的Pi型号:
bash $ sudo cp arch/arm/boot/zImage /mnt/boot/kernel.img
对于较大的Pi型号:
bash $ sudo cp arch/arm/boot/zImage /mnt/boot/kernel7.img
复制其他相关文件:
bash $ sudo cp arch/arm/boot/dts/*.dtb /mnt/boot/ $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/boot/overlays/ $ sudo cp arch/arm/boot/dts/overlays/README /mnt/boot/overlays/
最后卸载SD卡:
bash $ sudo unmount /mnt/boot $ sudo unmount /mnt/root
1.5 冒烟测试
将SD卡插入目标树莓派并启动。插入Pi Zero后启动并登录运行
dmesg
,第二行应确认已使用新的交叉编译内核。
如果启动时看到初始彩色闪屏一直显示在控制台,则表示
kernel.img
文件加载/启动失败。
2. DHT11传感器使用
DHT11是一款经济实惠的湿度和温度传感器,由D-Robotics UK制造。它能够在0至50°C的工作温度范围内测量20至90%的相对湿度,精度为±5% RH,温度测量精度为±2°C,两个值均以8位分辨率返回。
2.1 传感器特性
- 信号传输与1-Wire协议类似,但响应时间不同,且不支持设备序列号,因此与Linux内核中的1-Wire驱动不兼容。
- 需要3.3至5.5 V的电源供应,从树莓派的3.3 V电源供电可确保GPIO信号电平安全。
- 工作电流在0.5至2.5 mA之间,待机电流为100至150 μA。
2.2 电路连接
DHT11传感器的引脚4连接到公共接地,引脚1连接到3.3 V电源,引脚2为信号引脚,与所选的GPIO引脚通信。程序
dht11.c
默认使用GPIO 22,可在命令行中覆盖。
为防止线路浮空,使用一个上拉电阻R1将线路拉高到3.3 V,数据手册推荐使用5 kΩ电阻,也可安全替换为更常见的4.7 kΩ电阻,该电阻在电缆长度不超过20米时适用。
2.3 通信协议
-
整体协议
1. 由于上拉电阻,线路初始为高电平。
2. 主机将线路拉低至少18 ms以发出读取请求,然后释放总线,使线路恢复高电平。
3. 约20至40 μs的暂停后,传感器将线路拉低80 μs,然后再拉高80 μs,表示准备返回数据。
4. DHT11向总线发送40位信息,每位以50 μs的低电平开始,随后:- 26至28 μs的高电平表示0位。
-
70 μs的高电平表示1位。
5. 传感器再次将线路拉低50 μs,结束传输。
6. 传感器释放总线,线路恢复高电平空闲状态。
-
数据位格式
每个数据位以50 μs的低电平开始,最后一位结束后的低电平也持续50 μs。低电平到高电平转换后,高电平持续26至28 μs表示0位,持续70 μs表示1位。 -
数据格式
传感器响应的40位数据包括16位相对湿度、16位摄氏温度和8位校验和。但DHT11的湿度和温度小数部分始终为0,实际每个测量值只有8位精度。校验和是前4个字节的简单求和,溢出部分直接丢弃,可提高数据接收的准确性。
2.4 软件实现
读取DHT11传感器的用户空间软件使用GPIO引脚的直接寄存器访问,面临的挑战包括短时间测量(26至70 μs)和Linux内核中的抢占式调度延迟。
一种解决方案是在位结束(线路变低)之前统计读取高电平信号的次数,根据时间长短判断0位和1位。
源代码位于:
$ cd ~/RPi/dht11
重新构建应用程序:
$ make clobber
$ make
使用
-h
选项获取帮助:
$ ./dht11 -h
Usage: ./dht11 [-g gpio] [-h]
where:
-g gpio Specify GPIO pin (22 is default)
-h This help
2.5 时间测量
为实现快速准确的时间测量,不依赖网络时间协议(NTP)守护进程更新的系统时钟,而是使用Linux单调时钟。
以下是获取单调时间的函数:
0042: static inline void
0043: timeofday(struct timespec *t) {
0044: clock_gettime(CLOCK_MONOTONIC,t);
0045: }
计算经过时间的一般步骤:
1. 捕获初始时间(记为t0)。
2. 捕获事件发生后的当前时间(记为t1)。
然后使用类似
ns_diff()
的函数计算经过时间。
综上所述,树莓派内核交叉编译和DHT11传感器的使用都有各自的步骤和要点,掌握这些知识可以更好地利用树莓派进行开发。
树莓派内核交叉编译与DHT11传感器使用指南(续)
3. 树莓派内核交叉编译与DHT11使用总结
3.1 内核交叉编译总结
树莓派内核交叉编译虽然步骤较多,但逻辑清晰。下面通过一个流程图来展示整个过程:
graph LR
A[准备交叉编译工具和环境] --> B[安装主机环境工具]
B --> C[获取内核源代码]
C --> D[修复inputbox.c文件]
D --> E[执行make mrproper]
E --> F{选择树莓派型号}
F -- Pi 1/Zero/Zero W --> G[编辑Makefile并配置]
F -- Pi 2/3/3+/Compute Module 3 --> H[编辑Makefile并配置]
G --> I[调整PATH变量并生成配置]
H --> I
I --> J[构建内核]
J --> K{安装方式}
K -- 本地安装 --> L[安装到/boot分区]
K -- 交叉安装 --> M[确定SD卡位置并挂载]
M --> N[重命名原内核文件]
N --> O[安装编译好的模块]
O --> P[复制内核文件和相关文件]
P --> Q[卸载SD卡]
L --> R[冒烟测试]
Q --> R
从这个流程图可以清晰地看到,整个内核交叉编译过程从准备工作开始,根据不同的树莓派型号进行配置,然后进行构建和安装,最后进行冒烟测试来验证是否成功。
同时,为了更清晰地对比不同型号树莓派的配置差异,我们列出以下表格:
| 树莓派型号 | Makefile配置 | 生成默认配置命令 | 内核安装文件名 |
| ---- | ---- | ---- | ---- |
| Pi 1/Zero/Zero W | ARCH=arm
CROSS_COMPILE=arm-unknown-linux-gnueabi- | make bcmrpi_defconfig | kernel.img |
| Pi 2/3/3+/Compute Module 3 | ARCH=arm
CROSS_COMPILE=arm-unknown-linux-gnueabi- | make bcm2709_defconfig | kernel7.img |
通过这个表格,我们可以快速了解不同型号树莓派在配置和安装过程中的关键差异。
3.2 DHT11传感器使用总结
DHT11传感器的使用也有一套完整的流程,下面用一个列表来总结:
1.
了解传感器特性
:包括信号传输、电源要求、电流消耗等,确保在使用时满足其工作条件。
2.
进行电路连接
:正确连接引脚,并使用合适的上拉电阻,保证信号的稳定传输。
3.
掌握通信协议
:清楚整体协议和数据位格式,以便准确解析传感器返回的数据。
4.
实现软件代码
:使用直接寄存器访问GPIO引脚,解决短时间测量和调度延迟的问题。
5.
进行时间测量
:利用Linux单调时钟进行准确的时间测量,确保数据采集的准确性。
4. 常见问题与解决方法
4.1 内核交叉编译常见问题
-
网络问题
:在使用
git从VirtualBox获取内核源代码时可能遇到网络问题。解决方法是在VirtualBox外使用git下载,然后使用scp上传master.tar.gz文件。 -
空间不足问题
:如果
/tmp文件系统空间不足,可通过创建新目录并设置TMPDIR环境变量来解决。 -
配置文件丢失问题
:执行
make mrproper命令会清除.config文件,建议提前备份到安全位置。
4.2 DHT11传感器使用常见问题
- 信号读取不准确 :由于短时间测量和调度延迟的问题,可能导致信号读取不准确。可以通过统计高电平信号次数来判断0位和1位,经过多次实验确定合适的划分界限。
- 传感器无响应 :检查电路连接是否正确,确保电源供应正常,上拉电阻是否合适。
5. 应用拓展与建议
5.1 内核交叉编译应用拓展
- 定制内核功能 :通过修改内核配置文件,可以启用或禁用特定的组件和子系统,满足不同的应用需求。例如,对于对功耗要求较高的应用,可以禁用不必要的硬件驱动。
- 开发新的内核模块 :掌握内核交叉编译技术后,可以开发新的内核模块,进一步扩展树莓派的功能。
5.2 DHT11传感器应用拓展
- 环境监测系统 :结合树莓派和DHT11传感器,可以搭建一个简单的环境监测系统,实时监测室内的温度和湿度,并将数据上传到云端进行分析。
- 智能家居控制 :根据DHT11传感器采集的温度和湿度数据,实现智能家居设备的自动控制。例如,当温度过高时,自动打开空调。
总之,树莓派内核交叉编译和DHT11传感器的使用为我们提供了丰富的开发可能性。通过深入理解和掌握这些技术,我们可以开发出更多有价值的应用。希望本文能为广大开发者提供一些帮助和启示。

48

被折叠的 条评论
为什么被折叠?



