【应用开发一】LED开发

news2024/11/23 19:44:42

文章目录

  • 1应用层控制外设的两种方式
  • 2 sysfs和/sys关系
  • 3 LED控制方式
    • 3.1 基本情况
    • 3.2 LED属性文件介绍
    • 3.3 命令行属性测试
    • 3.4 led程序
    • 3.5 开发板上测试

1应用层控制外设的两种方式

  1. 使用设备文件控制
    在Linux系统下,一切皆是文件。应用层控制底层硬件同样也是通过文件IO的方式。设备文件可以理解为硬件层向应用层提供的接口。应用层通过对设备文件IO的操作来操控硬件设备。设备文件通常在/dev/目录下,所以/dev目录下的文件成为设备节点。
  2. 使用sysfs文件系统
    还有一种方式是通过sysfs文件系统控制。sysfs文件系统是基于内存的文件系统,也是一种虚拟文件系统,他的作用是将内核信息已文件形式提供给应用层使用。他的主要功能是对系统设备进行管理,产生一个包含所有硬件层次的试图。
    sysfs提供可一种机制,可以显示的描述内核对象、对象属性以及对象间关系,用来导出内核对象的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。内核对象、对象属性以及对象间关系在用户空间sysfs中的表现如下表:
    内核中的组成要素sysfs中的表现
    内核对象(硬件设备)目录
    对象属性(设备属性)文件
    对象关系链接文件
  3. 总结
    应用层对底层硬件控制的两种方式:
    • /dev/目录下的设备文件(设备节点)
    • /sys/目录下设备的属性文件
      具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些文件只能通过sysfs方式进行操控。通常情况下,一般简单的设备会是用sysfs方式操作,例如led、GPIO等。对于复杂的文件,例如LCD、触摸屏、摄像头等,需要使用设备节点操作。

2 sysfs和/sys关系

sysfs文件系统挂载在/sys 目录下。sysfs文件系统中的目录包括block、bus、dev、devices、firmware、fs、kernel、modules、power等,每个目录下有许多文件或者子目录,对于这些目录的说’‘明如下所示(/sys目录下内容):
在这里插入图片描述

  1. devices
    系统中所有设备存放目录,sysfs管理设备的最重要的目录结构。
    在这里插入图片描述

  2. block
    块设备的存放目录,过时的接口,该目录下的文件通常是连接到’/sys/devices’目录下的文件。
    在这里插入图片描述

  3. bus
    所有设备按总线类型分类放置的目录结构,'/sys/devices’目录下的每种设备都是挂载在某种总线下的,例如i2c总线,同样,该目录下的文件也是链接到’sys/devices’目录下的。
    在这里插入图片描述

  4. class
    所有设备按照其功能分类放置的目录结构,例如led设备。'/sys/class/input’目录存放着所有输入类设备。
    在这里插入图片描述

  5. dev
    按照设备号的方式放置目录结构,该目录下有很多以主设备号:次设备号命令的文件,这些文件都是链接文件,连接到’/sys/devices’目录下。
    在这里插入图片描述

  6. firmware
    描述内核中的固件
    在这里插入图片描述

  7. fs
    描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。
    在这里插入图片描述

  8. kernel
    内核中所有的可调参的位置
    在这里插入图片描述

  9. module
    系统中所有模块信息
    在这里插入图片描述

  10. power
    系统中电源选项,有一些属性可以用于控制整个系统的电源状态
    在这里插入图片描述

系统中所有设备都会在/sys/devices中体现出来,是sysfs文件系统最重要的目录结构。

3 LED控制方式

3.1 基本情况

硬件情况:使用底板上的DS0 led(用户可以控制的唯一LED)
开发板启动方式:emmc启动
mmc中的系统:正点原子的系统
交叉编译器:arm-linux-guneabihf-

控制方式:sysfs文件系统
控制目录:/sys/class/led

3.2 LED属性文件介绍

进入到/sys/class/led目录下,该目录中存放着所有的LED设备,目录如下图所示:
在这里插入图片描述

可以看到该目录中有一个sys-led的文件夹,这个就是底板上LED的设备文件,该目录下文件如下图所示:
在这里插入图片描述

这里主要关注brightness、max_brightness以及trigger三个文件,这三个都是LED的属性文件。

  • brightness:亮度
    可读可写,设置led的亮度等级,
    0:灭
    正整数:pwm控制的led:值越大,led越亮
    GPIO控制的led:亮
  • max_brightness:最大亮度等级
    只读文件
  • trigger:触发模式
    可读可写,设置当前LED触发模式,读表示获取当前触发模式,写表示设置当前触发模式。
    触发模式:方括号[ ]括起来的表示当前触发模式
    • none:无触发
    • mmc0:对mmc0设备读写时led会闪烁
    • timer:有一定规律的亮灭,定时器控制
    • heartbeat:心跳呼吸模式

通常系统启动之后,都会将板子上的一颗led设置为heartbeat触发模式,表示系统正在正常运行。

3.3 命令行属性测试

通过echo命令进行LED控制

echo timer > trigger		// 将led触发模式设置为定时触发
echo none > trigger			// 将led触发模式设置为无触发模式
echo 1 > brightness			// 点亮led

3.4 led程序

gitee:LED

#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 fd_trigger, fd_brightness;

    /* 判断输入参数个数 */
    if( argc < 2 ) {
        USAGE();
        exit(-1);
    }

    /* 打开文件 */
    fd_trigger = open(LED_TRIGGER, O_RDWR);
    if (fd_trigger < 0 ) {
        perror("open trigger error");
        exit(-1);
    }

    fd_brightness = open(LED_BRIGHTNESS, O_RDWR);
    if (fd_brightness < 0 ) {
        perror("open brightness error");
        exit(-1);
    }

    /* 判断输入参数 */
    if ( !strcmp(argv[1],"on") ) {
        write(fd_trigger, "none", 4);
        write(fd_brightness, "1", 1);
    } else if ( !strcmp(argv[1], "off") ) {
        write(fd_trigger, "none", 4);
        write(fd_brightness, "0", 1);
    } else if ( !strcmp(argv[1], "trigger")) {
        if ( argc != 3 ) {
            USAGE();
            exit(-1);
        }

        if ( write(fd_trigger, argv[2], strlen(argv[2]) ) < 0 ) {
            perror("set trigger faile");
        }
    } else {
        USAGE();
    }

    close(fd_trigger);
    close(fd_brightness);

    exit(0);
}

因为是运行在I.MX6ULL平台上,所以要是用交叉编译器编译,makefile文件内容如下:

TARGET ?= led				# 目标文件
CROSS_COMPILE ?= arm-linux-gnueabihf-		# 交叉编译器

CC = $(CROSS_COMPILE)gcc		
LD = $(CROSS_COMPILE)ld		

src = led.c		# 源码文件

$(TARGET):$(src)
	$(CC) -o $@ $<


.PHONY: clean			# 伪目标

# 清除工程
clean:
	rm -rf *.o $(TARGET)

3.5 开发板上测试

将编译好的二进制文件使用scp命令发送到开发板上。在开发板中执行下面命令,观察led变化。二进制文件一定要有可执行权限。

./led on					// 亮
./led off					// 灭
./led trigger heartbeat 	// 呼吸模式	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆的实现详解

目录 1. 堆的概念和特点2. 堆的实现2.1 堆向下调整算法2.2堆的创建2.3 建堆时间复杂度2.4 堆的插入2.5 堆的删除2.6 堆的代码实现2.6.1 结构体2.6.2 初始化2.6.3 销毁2.6.4 插入2.6.5 删除2.6.6 获取堆顶2.6.7 判空2.6.8 个数2.6.9 向上调整2.6.10 向下调整3. 堆的实现测试测试…

SQL连接与筛选:解析left join on和where的区别及典型案例分析

文章目录 前言一、left join on和where条件的定义和作用left join on条件where条件 二、left join on和where条件的区别原理不同left join原理&#xff1a;where原理&#xff1a; 应用场景不同执行顺序不同&#xff08;作用阶段不同&#xff09;结果集不同 三、实际案例理解lef…

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…

高考填报志愿,找准自己的真兴趣来选择专业

又是一年一度的高考填报志愿的时间了&#xff0c;毕业生们要根据自己的分数&#xff0c;在很短的时间内确定自己的专业。专业千万条&#xff0c;兴趣第一条。专业的选择很大程度上决定着大学的学习生活是否顺利&#xff0c;甚至决定着以后的职业生涯。在纷繁复杂的专业中&#…

全球首个数字人开源了

DUIX&#xff08;Dialogue User Interface System&#xff09;是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源&#xff0c;开发者可自行接入多方大模型、语音识别&#xff08;ASR&#xff09;、语音合成&#xff08;TTS&#xff09;能力&#xff0c;实现数字…

【AI落地应用实战】如何高效检索与阅读论文——302.AI学术论文工具评测

一、引言 作为一名学术领域的探索者&#xff0c;我们都知道&#xff0c;检索和阅读论文是我们获取知识、启发思考、验证假设的基石&#xff0c;也是日常学习中必不可少的基本功之一。然而在浩瀚的学术海洋中&#xff0c;如何快速、准确地找到我们需要的论文&#xff0c;就像是…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

python03——文件操作(new)

“变量”open&#xff08;‘文件路径’&#xff0c;‘模式’&#xff09; //注意加引号 “变量”.write( ) //write函数是写的是字符串&#xff0c;如果你写的东西不是字符串&#xff0c;要写成write&#xff08;str&#xff08;。。&#xff09;&#xff09; “变量”.read…

【Containerd】Containerd接入Harbor仓库

说明 在日常使用容器时&#xff0c;安全方便起见一般都会使用到私有仓库&#xff0c;一般都是采用 harbor 作为私有仓库&#xff0c;docker 对接 harbor 仓库非常简单&#xff0c;那么 containerd 如何对接 harbor 呢&#xff1f; 在内网使用 harbor 根据个人习惯&#xff0c…

快速上手golang(持续更新)

由于项目需要&#xff0c;我不得不快速掌握go语言来帮助我进行项目的开发。时间紧迫到我来不及去了解语言的特性就直接项目上手了。我决定就先熟悉一个主流的go框架和go语言的一些日常用法&#xff0c;之后就得滑着这只破船摇摇晃晃上路了。 1 基础命令 就说几个用的多的&…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中&#xff0c;模糊的代词如“他们”或“那个”常常出现&#xff0c;它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要&#xff0c;因为它们旨在提供一种自然的交流体验。然而&#xff0c;现有的对话助手在处理这类模糊引用时往…

Java HashMap 简介

HashMap 简介 HashMap 主要用来存放键值对&#xff0c;它基于哈希表的 Map 接口实现&#xff0c;是常用的 Java 集合之一&#xff0c;是线程不安全的。 HashMap&#xff1b;可以存储 null 的 key 和 value &#xff0c;但 null 作为 key 只能有一个&#xff0c;null 作为值可以…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中&#xff0c;我们介绍了大语言模型与人类对齐的“3H原则”&#xff0c;以及基于人类反馈的强化学习方法&#xff08;RLHF&#xff09;&#xff0c;本文将继续介绍另外一种非强化学习的对齐方法&#xff1a;直接偏好优化&am…

深度学习语义分割算法之基础知识

文章目录 前言一、图像分割介绍1.语义分割2.实例分割3.全景分割 二、常见数据集格式1.PASCAL VOC2.MS COCO 三、语义分割结果四、语义分割常见评价指标1.Pixel Accuracy2.mean Accuracy3.mean IoU 五、语义分割标注工具结束语 &#x1f482; 个人主页:风间琉璃&#x1f91f; 版…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中&#xff0c;Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox&#xff0c;开发者需要做好充分的环境准备工作。这不仅是编译成功的基础&#xff0c;也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

硬核实力再亮,玩出梦想科技发布全球首款安卓系统空间计算机

6月25日&#xff0c;玩出梦想科技在新加坡召开全球新品发布会&#xff0c;正式发布全球首款安卓系统空间计算机——玩出梦想MR&#xff0c;填补了空间计算机在安卓生态的空白。 作为品牌沉淀两年的破晓之作&#xff0c;玩出梦想MR以业内领先软硬件配置&#xff0c;强大自研算法…

kafka--发布-订阅消息系统

1. Kafka概述 1. kafka是什么 kafka是分布式的、高并发的、基于发布/订阅模式的消息队列软件系统。 kafka中的重要组件 Producer&#xff1a;消息生产者&#xff0c;发布消息到Kafka集群的终端或服务Consume&#xff1a;消费者&#xff0c;从Kafka集群中消费消息的终端或服…

CAN报文的发送类型-OnChange、OnWrite、IfActive、Repetition

CAN报文的发送类型分为基本发送类型和混合发送类型两大类 CAN基本发送类型包括Cyclic周期发送、OnChange变化时发送、OnWrite写入时发送和IfActive有效时发送。基本发送类型中的Cyclic称为周期型,而其他3个类型称为事件型(Event)。发送次数是通过定义Repetition重复次数来实…

AI 编程探索- iOS动态标签控件

需求分析&#xff1a; 标签根据文字长度&#xff0c;自适应标签居中显示扩展 超过内容显示范围&#xff0c;需要换行显示&#xff0c;且保持居中显示 AI实现过程 提问&#xff1a; 回答&#xff1a; import UIKit import SnapKitclass DynamicLabelsContainerView: UIView…