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

原子学习笔记3——点亮 LED

一、应用层操控设备的两种方式

应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现,设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/目录下,我们也把/dev 目录下的文件称为设备节点。
设备节点并不是操控硬件设备的唯一途径,除此之外,我们还可以通过 sysfs 文件系统对硬件设备进行操控。

1、sysfs 文件系统

sysfs 是一个基于内存的文件系统,同 devfs、proc 文件系统一样,称为虚拟文件系统;它的作用是将内核信息以文件的方式提供给应用层使用。

2、sysfs 与/sys

sysfs 文件系统挂载在/sys 目录下,启动 ALPHA 开发板,进入 Linux 系统(开发板出厂系统)之后,我们进入到/sys 目录下查看,如下所示
在这里插入图片描述
上图显示的便是 sysfs 文件系统中的目录,包括 block、bus、class、dev、devices、firmware、fs、kernel、modules、power 等
系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而
/sys/bus、/sys/class、/sys/dev 分别将设备按照挂载的总线类型、功能分类以及设备号的形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices 中。
设备的一些属性、数据通常会通过设备目录下的文件体现出来,也就是说设备的数据、属性会导出到用户空间,以文件形式为用户空间提供对这些数据、属性的访问支持,可以把这些文件称为属性文件;读这些属性文件就表示读取设备的属性信息,相反写属性文件就表示对设备的属性进行设置、以控制设备的状态。

3、总结

这里给大家进行一个总结,应用层想要对底层硬件进行操控,通常可以通过两种方式:

  • /dev/目录下的设备文件(设备节点);
  • /sys/目录下设备的属性文件。
    具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD 等、触摸屏、摄像头等。

二、LED 硬件控制方式

对于 ALPHA开发板出厂系统来说,此 LED 设备使用的是 Linux 内核标准 LED 驱动框架注册而成,在/dev 目录下并没有其对应的设备节点,其实现使用 sysfs 方式控制。进入到/sys/class/leds 目录下,如下所示:
在这里插入图片描述
上小节介绍了/sys/class 目录,系统中的所有设备根据其功能分类组织到了/sys/class 目录下,所以/sys/class/leds 目录下便存放了所有的 LED 类设备。从上图可以看到该目录下有一个 sys-led 文件夹,这个便是底板上的用户 LED 设备文件夹。
这里我们主要关注便是 brightness、max_brightness 以及 trigger 三个文件,这三个文件都是 LED 设备的属性文件:
trigger:触发模式,该属性文件可读可写,读表示获取 LED 当前的触发模式,写表示设置 LED 的触发模式。不同的触发模式其触发条件不同,LED 设备会根据不同的触发条件自动控制其亮、灭状态,通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式:
在这里插入图片描述
方括号([heartbeat])括起来的表示当前 LED 对应的触发模式,none 表示无触发,常用的触发模式包括none(无触发)、mmc0(当对 mmc0 设备发起读写操作的时候 LED 会闪烁)、timer(LED 会有规律的一亮一灭,被定时器控制住)、heartbeat(心跳呼吸模式,LED 模仿人的心跳呼吸那样亮灭变化)。
通常系统启动之后,会将板子上的一颗 LED 设置为 heartbeat 触发模式,将其作为系统正常运行的指示灯,譬如 ALPHA 开发板系统启动之后,底板上的用户 LED 就会处于心跳呼吸模式。
通过上面的介绍,已经知道如何去控制 ALPHA开发板底板上的用户 LED 了,譬如通过echo 命令进行控制:

echo timer > trigger //将 LED 触发模式设置为 timer
echo none > trigger //将 LED 触发模式设置为 none
echo 1 > brightness //点亮 LED echo 0 > brightness//熄灭 LED

使用 echo 或 cat 命令进行测试、控制 LED 状态;除了使用 echo 或 cat 命令之后,同样我们编写应用程序,使用 write()、read()函数对这些属性文件进行 I/O 操作以达到控制 LED 的效果。

三、编写 LED 应用程序

1、例程源码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
#define USAGE() fprintf(stderr, "usage:\n" \" %s <on|off>\n" \" %s <trigger> <type>\n", argv[0], argv[0])
int main(int argc, char *argv[])
{int fd1, fd2;// /* 校验传参 if (2 > argc) {USAGE();exit(-1);}// /* 打开文件 fd1 = open(LED_TRIGGER, O_RDWR);if (0 > fd1) {perror("open error");exit(-1);}fd2 = open(LED_BRIGHTNESS, O_RDWR);if (0 > fd2) {perror("open error");exit(-1);}// /* 根据传参控制 LED if (!strcmp(argv[1], "on")) {write(fd1, "none", 4); //先将触发模式设置为 nonewrite(fd2, "1", 1); //点亮 LED}else if (!strcmp(argv[1], "off")) {write(fd1, "none", 4); //先将触发模式设置为 nonewrite(fd2, "0", 1); //LED 灭}else if (!strcmp(argv[1], "trigger")) {if (3 != argc) {USAGE();exit(-1);}if (0 > write(fd1, argv[2], strlen(argv[2])))perror("write error");}elseUSAGE();exit(0);
}

程序中定义了两个宏,LED_TRIGGER 和 LED_BRIGHTNESS,分别对应/sys/class/leds/sys-led/trigger 和/sys/class/leds/sys-led/brightness 属性文件;程序首先会调用 open()函数打开这两个属性文件,之后判断传入参数指向相应的动作,传入"on"表示点亮 LED,先调用 write()将"none"
写入到 trigger 属性文件中,也就是设置为无触发,接着再向 brightness 属性文件中写入"1"点亮 LED;传入"off"表示熄灭 LED,同样也是先调用 write()将"none"写入到 trigger 属性文件设置 LED 为无触发,接着再向brightness 属性文件中写入"0"熄灭 LED;传入"trigger"表示设置 LED 的触发模式,则需要传入第二个参数,第二个参数表示需要设置的模式。

2、开发板上测试

启动开发板进入 Linux 系统,将上小节编译得到的可执行文件 testApp 拷贝到开发板根文件系统中,譬如拷贝到开发板 Linux 系统的家目录下,如下图所示:
在这里插入图片描述
拷贝方法很多,介绍下 scp 命令:
1、将开发板用网线连接在与虚拟机同一个路由器下,查看下开发板的IP地址。
例如,在 home 目录下有个 test 文件我们要把这个 test 文件传到开发板的/home/root 目录(我们一般传文件都是传文件到家目录(/home/root)的)。指令格式如下

scp 文件 用户名@ip 地址:路径

例:scp testApp root@192.168.5.14:/home/root
指令格式分析:
testApp 要传输的文件
root 为用户名,开发板默认的就是 root 用户,拥有最高权限
@ 一个符号
192.168.5.14 开发板 ip
: 这里要加一个英文字符的“:”,不要忘记了!
/home/root 要传输到开发板的路径
在这里插入图片描述
在开发板/home/root 可以看到 testApp 文件已经通过网络传输到开发板了。
2、用WiFi驱动,同样是获取IP地址
首先插上USBWiFi,进入终端

cd /home/root/shell/wifi
ls

在这里插入图片描述
使用station上网模式

wpa_cli -i wlan0 scan_result // 此指令需要启动进入后再插 WIFI 才生效,需要 wpa_supplicant 在运行。

在这里插入图片描述

source ./alientek_usb_wifi_setup.sh -m station -i ALIENTEK-YF -p 1590202**** -d wlan0

参数解释:
-m station :设置成 station 模式
-i ALIENTEK-YF :无线网络名称(ssid)。
-p 1590202**** :无线网络密码(psk)。
-d wlan0 :USB WIFI 节点
看到下图已经获取到 ip 信息就代表连接无线网络成功,如果没有获取到 ip 信息,请检查密码是否正确或者重试指令。
在这里插入图片描述
若未能正常获取 ip,等待 RTL871X: set group key camid:5 这句话出现后输入 udhcpc -i wlan0 指令重新获取 ip。若没有这句话,请检查无线网络信息是否正确。
测试是否能上网,使用 ping 指令 ping 百度,可按 ctrl+c 终止执行指令

ping www.baidu.com -I wlan0

接下来执行 testApp 程序测试:

./testApp on # 点亮 LED
./testApp off # 熄灭 LED
./testApp trigger timer # LED 会有规律的一亮一灭,被定时器控制住

在这里插入图片描述
结果与执行的一致。

相关文章:

原子学习笔记3——点亮 LED

一、应用层操控设备的两种方式 应用层如何操控底层硬件&#xff0c;同样也是通过文件 I/O 的方式来实现&#xff0c;设备文件便是各种硬件设备向应用层提供的一个接口&#xff0c;应用层通过对设备文件的 I/O 操作来操控硬件设备&#xff0c;譬如 LCD 显示屏、串口、按键、摄像…...

齐护K210系列教程(十八)_识别条码

识别条码 联系我们 将识别到的条形码内容打印输出并显示 测试条形码可以到如下网站得到&#xff1a;http://www.jsons.cn/barcode/ 4&#xff0c;课程资源 课程程序下载&#xff1a;【18条形码】 联系我们 扫码 或者点这里加群了解更多&#xff01; Created by qdprobot...

K折交叉验证

训练数据稀缺&#xff0c;无法构成验证集。 所以我们将训练数据分为k个子集。 执行k次模型训练和验证。每次在k-1个子集上进行训练&#xff0c; 并在剩余的一个子集&#xff08;该轮没有训练的子集&#xff09;上进行验证。 最后&#xff0c;这k次实验结果取平均来估计训练和验…...

Docker 的 Ubuntu 操作系统镜像

Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统&#xff0c;十分适合研发场景。 Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Li…...

【Python】Python中的logging模块介绍和示例

Python中的logging模块是一个强大的内置模块&#xff0c;用于记录和跟踪应用程序的运行过程。它提供了灵活的日志记录功能&#xff0c;可以将日志消息输出到多个目标&#xff08;如控制台、文件、远程服务器等&#xff09;&#xff0c;并支持不同的日志级别。以下是logging模块…...

PXIe规格i3/i5/i7单板计算机控制器

是专为PXIe混合测试系统设计的主控制器&#xff0c;3U 12HP PXIe规格。该产品采用Intel Core™i3/i5/i7 第四代高性能处理器&#xff0c;内存可支持高达16G DDR3L。该系统PXI Express的link配置为通用的4Port 4lane的模式&#xff0c;数据吞吐量高达8GB/S。 CX786x提供丰富灵活…...

弱网对抗的策略有哪些?

在弱网环境下&#xff0c;数据传输可能会面临丢包、延迟、抖动等问题&#xff0c;因此采取合适的弱网对抗策略对于确保数据传输的稳定性和可靠性至关重要。以下是一些常见的弱网对抗策略&#xff1a; 数据压缩&#xff1a;使用压缩算法如Gzip、Brotli等对数据进行压缩&#xf…...

如何通过OMS加快大表迁移至OceanBase

OMS&#xff0c;是OceanBase官方推出的数据迁移工具&#xff0c;能够满足众多数据迁移场景的需求&#xff0c;现已成为众多用户进行数据迁移同步的重要工具。OMS不仅支持多种数据源&#xff0c;还具备全量迁移、增量同步、数据校验等功能&#xff0c;并能够对分表进行聚合操作&…...

讨论:WGS84与CGCS2000的坐标系怎么互转

前言&#xff1a; 今天我们要讨论一个问题&#xff1a;WGS84与CGCS2000的坐标系怎么互转&#xff1f; 对于有一定基础的朋友应该知道&#xff0c;WGS84和CGCS2000属于不同的椭球&#xff0c;如果进行严密的数学转换&#xff0c;是需要建立参数模型之后&#xff0c;再进行转换&…...

SpringCloud面试题

SpringCloud常见组件有哪些 注册中心组件&#xff1a;Eureka、Nacos 负载均衡组件&#xff1a;Ribbon 远程调用组件&#xff1a;OpenFeign 网关组件&#xff1a;Zuul、Gateway 服务保护组件&#xff1a;Hystrix、Sentinel 服务配置管理组件&#xff1a;SpringCloudConfig、Nac…...

深入了解Java Stream中的Collectors.partitioningBy()

在Java编程中&#xff0c;Stream API是一种强大的工具&#xff0c;它提供了处理集合数据的便捷方式。而Stream API中的Collectors.partitioningBy()方法则是其中一个十分有用的函数&#xff0c;它允许我们根据指定的条件将元素分成两个组。在本文中&#xff0c;我们将深入探讨这…...

下拉多选【bootstrap-multiselect】

1、引入资源 <link rel="stylesheet" href="${components}/bootstrap/css/bootstrap-multiselect.css"> <script src="${components}/bootstrap/js/bootstrap-multiselect.js"></script> 2、初始化 $("#topic-select&qu…...

建筑(八大员)报考条件

建筑八大员报考时间2024 建筑八大员每年考两次,上半年的考试时间一般在5-6月份,下半年的考试时间一般在10月左右。报名在考前2个月进行&#xff0c;2024年的考试时间和次数可能因省份而异&#xff0c;以住建厅通知为准。建筑八大员报考条件2024 1、年龄在18周岁以上(含18周…...

_remote.repositories作用

问题描述 明明我本地有某个依赖但是却还是报错&#xff0c;原因就是存在_remote.repositories且你的远程仓库中找不到该依赖&#xff0c;可能发生在你修改了远程仓库或镜像时。 例子 本地有这个依赖&#xff0c;但是报错。 解决 删除_remote.repositories文件&#xff0…...

2.3 Spark运行架构与原理

Spark运行架构由SparkContext、Cluster Manager和Worker构成。在集群模式下&#xff0c;Driver进程初始化SparkContext并向Cluster Manager申请资源&#xff0c;后者根据算法在Worker节点上启动Executor。Executor负责任务执行&#xff0c;反馈状态给Cluster Manager。任务由Ta…...

redis的跳表

typedef struct zskiplistNode {// 分值double score;// 成员对象robj *obj;// 后退指针struct zskiplistNode *backward;// 层struct zskiplistLevel {// 前进指针struct zskiplistNode *forward;// 跨度unsigned int span;} level[]; } zskiplistNode;跳表的节点查找算法可以…...

探索未知,开启海外盲盒新纪元——海外盲盒App,你的全球奇遇宝箱

一、引言 在快节奏、高压力的现代生活中&#xff0c;我们时常渴望一份来自未知的惊喜。为此&#xff0c;我们精心打造了一款全新的海外盲盒App&#xff0c;带你跨越地域界限&#xff0c;开启一场充满惊喜的全球奇遇之旅。 二、产品介绍 海外盲盒App是一款集购物、娱乐、文化…...

LeetCode2215找出两数组的不同

题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;请你返回一个长度为 2 的列表 answer &#xff0c;其中&#xff1a;answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组…...

Git系列:git show 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

python爬虫(五)之新出行汽车爬虫

python爬虫&#xff08;五&#xff09;之新出行汽车爬虫 接完最后一单&#xff0c;终于肝完了最后一个python爬虫——新出行爬虫&#xff0c;将https://www.xchuxing.com网站上所有的汽车爬虫全部抓取下来。 import requests import json import csv from lxml import etree …...

CC324条提示词意外泄露——第31条让我出了一身冷汗

324条提示词意外泄露——第31条让我出了一身冷汗 原创 硅谷Alan Walker 硅谷Alan Walker 嘉妍Kea 2026年4月2日 02:47 美国 22人 在小说阅读器中沉浸阅读 当 AI 可以代替你发 Slack、fork 自己&#xff0c;人与 AI 的边界在哪里&#xff1f; src/constants/prompts.ts 57…...

企业级RESTful API设计终极指南:10个进阶技巧助力构建高性能接口

企业级RESTful API设计终极指南&#xff1a;10个进阶技巧助力构建高性能接口 【免费下载链接】restful-api-design-references RESTful API 设计参考文献列表&#xff0c;可帮助你更加彻底的了解REST风格的接口设计。 项目地址: https://gitcode.com/gh_mirrors/re/restful-a…...

DeepSeek-R1蒸馏模型入门:1.5B版本本地部署完整教程

DeepSeek-R1蒸馏模型入门&#xff1a;1.5B版本本地部署完整教程 1. 引言 1.1 为什么选择DeepSeek-R1 1.5B版本 DeepSeek-R1 1.5B版本是专为本地CPU环境优化的轻量级推理模型&#xff0c;它通过知识蒸馏技术保留了原版70B参数模型的核心推理能力&#xff0c;同时将参数量压缩…...

企业微信日程秒同步到Outlook?这个隐藏功能90%的人不知道

企业微信与Outlook日程无缝同步的终极指南&#xff1a;揭秘Exchange ActiveSync的高阶玩法 每次开会前手忙脚乱地在两个日历间切换&#xff1f;重要会议提醒因为系统不同步而错过&#xff1f;作为深度体验过十余种日程管理工具的效率控&#xff0c;我发现企业微信内置的Exchang…...

实测Nanbeige 4.1-3B WebUI:浅灰蓝波点背景+呼吸阴影效果惊艳

实测Nanbeige 4.1-3B WebUI&#xff1a;浅灰蓝波点背景呼吸阴影效果惊艳 1. 极简美学与功能设计的完美融合 第一次打开这个WebUI时&#xff0c;最直观的感受就是它完全颠覆了我对本地大模型界面的刻板印象。传统的部署方案往往只关注功能实现&#xff0c;界面设计几乎都是千篇…...

Windows下OpenClaw安装详解:千问3.5-9B接口配置全流程

Windows下OpenClaw安装详解&#xff1a;千问3.5-9B接口配置全流程 1. 为什么选择OpenClaw千问3.5-9B组合 去年我在尝试自动化办公流程时&#xff0c;发现市面上的RPA工具要么太笨重&#xff0c;要么需要频繁上传数据到云端。直到遇到OpenClaw这个开源的本地化AI智能体框架&am…...

linux——退出单一线程

pthread_exitexit(0)函数原型&#xff1a; void pthread‐exit(void *retval)&#xff1b; retval指针&#xff1a;必须指向全局&#xff0c;堆 #include<stdio.h> #include<pthread.h> #include<unistd.h> #include<string.h> #include<stdlib.h&…...

OpenClaw技能开发入门:为Qwen2.5-VL-7B扩展截图分析功能

OpenClaw技能开发入门&#xff1a;为Qwen2.5-VL-7B扩展截图分析功能 1. 为什么需要截图分析技能 上周我在整理项目文档时&#xff0c;突然意识到一个痛点&#xff1a;每次截图后都需要手动添加文字说明&#xff0c;这个过程既耗时又容易出错。作为一个长期关注自动化工具的技…...

AtCoder Beginner Contest 433

AtCoder Beginner Contest 433 ABCD https://www.bilibili.com/video/BV1srUTBEEfa/ AtCoder Beginner Contest 433 https://www.bilibili.com/video/BV14xUWBYELd/ https://blog.csdn.net/2503_93669452/article/details/155140717 【实况】AtCoder Beginner Contest 433&…...

解释器指令入口——栈顶缓存

解释器指令入口——栈顶缓存 书接上回&#xff0c;转发表的结构是栈顶状态和字节码值共同组成&#xff0c;使用栈顶状态的原因是为了在特殊情况下提高解释器的执行速度。 例1 栈顶状态前后一致 假设由下列字节码执行序列 iload_1 iaddiload_1字节码的含义是把本地变量表中的…...