21、树莓派内核交叉编译与DHT11传感器使用指南

树莓派内核交叉编译与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传感器的使用为我们提供了丰富的开发可能性。通过深入理解和掌握这些技术,我们可以开发出更多有价值的应用。希望本文能为广大开发者提供一些帮助和启示。

内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键环节,重点揭示高速行车条件下基础设施的振动传递规律力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课题的研究者。; 使用场景及目标:①用于高校科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围优化方向。
内容概要:本文系统研究了非线性薛定谔方程的物理信息神经网络(PINN)求解方法,提出一种将物理规律嵌入深度学习模型的科学计算新范式。通过构建全连接神经网络架构,将非线性薛定谔方程及其初始/边界条件作为损失函数的核心组成部分,实现了在无须大量标注数据的前提下对复值偏微分方程的高精度数值求解。该方法充分利用自动微分技术精确计算方程残差,有效融合了数据驱动模型驱动的优势,在光学孤子传播、量子系统演化等典型场景中展现出优异的逼近能力泛化性能。文中配套提供了完整的Python实现代码,涵盖网络搭建、损失定义、训练优化结果可视化全流程。; 适合人群:具备Python编程能力深度学习基础知识,熟悉偏微分方程理论及科学计算的理工科研究生、科研人员,以及从事光学、量子物理、流体力学等领域建模仿真的工程技术人员。; 使用场景及目标:① 掌握PINN方法的基本原理实现技巧;② 学习如何将复杂物理方程转化为可训练的神经网络损失项;③ 应用于非线性光学、玻色-爱因斯坦凝聚、水波动力学等问题的仿真预测;④ 为相关科研课题提供可复现的算法原型代码参考。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解神经网络对微分算子的近似机制、损失函数的多任务加权策略以及训练过程中的超参数调优方法,进而可迁移至其他非线性偏微分方程的求解任务,拓展其在交叉学科中的应用边界。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 微软推出的【AZ-900微软认证】是一项针对初学者的基础级云服务资格认证,其目的在于帮助学习者掌握云概念、微软Azure服务的运作机制以及云解决方案的核心知识。获得这一认证后,考生将能够清晰地理解云计算领域的基础术语、服务模式(包括IaaS、PaaS、SaaS等)以及这些服务在Azure平台上的实际应用方式。 在【必过考题】部分,我们可以观察到两个重点议题,它们分别聚焦于PaaS(平台即服务)的概念阐释和云成本的计算方式。 在第一个议题中,考生被要求辨别关于PaaS的正确性描述。PaaS平台提供了一个开发环境,但并不允许用户直接访问操作系统(Box 1: No)。比如,Azure Web Apps服务可以用来部署web应用,但用户无法直接管理虚拟机或IIS系统。另一方面,PaaS确实具备自动扩展的功能(Box 2: Yes),这表示可以根据实际需求自动增加负载均衡的虚拟机以支持web应用的运行。PaaS框架还为开发人员提供了构建和调整云端应用的工具,预置的应用组件能够有效缩短新应用的编程周期(Box 3: Yes)。 第二个议题同样关注云计算理念的理解,尤其强调IT支出从资本性支出(CapEx)向运营性支出(OpEx)的转型思想。传统的IT投资通常被视为CapEx,而云计算的按需付费机制使企业能够将这部分开支转化为OpEx,从而在财务规划上获得更大的自由度。 在为AZ-900考试做准备时,考生需要特别关注以下几个核心知识点: 1. **云服务模式**:深入理解IaaS(基础设施即服务)、PaaS和SaaS(软件即服务)之间的差异及其各自的应用情境。 2. **Azure服务*...
源码下载地址: https://pan.quark.cn/s/239a0d536a1e 依据所提供的文件资料,可以归纳出以下核心内容:由清华大学计算机系邓俊辉教授精心编纂的算法训练营题目合集,对于CSP(中国软件专业人才设计创业大赛)及PAT(程序设计能力测试)这类编程竞赛具有极高的参考价值,堪称一份极具价值的参考资料。此类竞赛普遍对参赛者的算法功底和编程技巧提出严苛要求。该合集中的题目算法领域紧密相连,其中包含了“最大红矩形”这一典型题目。所谓最大红矩形题目,其核心任务是针对一个由红色绿色方格构成的棋盘,寻觅出最大的纯红矩形区域。要攻克这一问题,必须运用数据结构算法的相关知识,特别是栈这一数据结构的应用。 “最大红矩形”问题能够被抽象转化为“直方图最大面积”问题。具体转化方法是将棋盘的每一列视为一个独立的直方图单元,其中红色方格的贡献体现为当前位置前一个绿色方格所在行数的差值,从而保证每个直方图的基宽恒定为1。随后,借助扫描直方图的技术手段来探寻最大矩形面积。这一过程需要对每个直方图进行系统性遍历,并利用栈来记录各直方图的下标信息。一旦检测到当前直方图的高度小于栈顶元素所记录的高度,则意味着遭遇了一个“高点”,此时需计算以该“高点”为右边界条件的最大矩形面积。 在编程实践环节,必须高度关注栈的操作细节,以及如何精确地初始化和操纵栈来应对直方图问题。代码实现中,通常配置两个栈,一个用于储存直方图的高度值,另一个用于标记直方图的下标位置。当面对新高度时,需审慎判断当前高度栈顶高度的相对关系,并据此抉择是执行入栈操作还是计算面积。针对“低点”(即当前高度小于栈顶),应直接将当前高度纳入栈中;而对于“高点”,则需执行弹出栈顶元素的操作,并基于该栈顶元素的高...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值