【应用开发一】LED开发

文章目录

  • 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.mzph.cn/diannao/35048.shtml

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

相关文章

第100+12步 ChatGPT学习:R实现KNN分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现KNN分类 &#xff08;1&a…

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…

攻击者开始使用 XLL 文件进行攻击

近期&#xff0c;研究人员发现使用恶意 Microsoft Excel 加载项&#xff08;XLL&#xff09;文件发起攻击的行动有所增加&#xff0c;这项技术的 MITRE ATT&CK 技术项编号为 T1137.006。 这些加载项都是为了使用户能够利用高性能函数&#xff0c;为 Excel 工作表提供 API …

【SQL Server数据库】关系模式与关系代数

目录 一、请用关系代数完成下列查询 1. 求 供应工程J1 零件P1的供应商号码SNO&#xff1b; 2. 求 供应工程J1 零件&#xff08;P&#xff09;为红色 的供应商号码SNO&#xff1b; 3. 求 没有使用 天津供应商&#xff08;P&#xff09;生产的红色零件&#xff08;S&#xff0…

pycharm中的使用技巧

1、更改主题&#xff1a;找到设置&#xff0c;然后更改主题 点击选择自己喜欢的主题&#xff0c;然后就可以更改主题了 2、设置字体的快捷键 找到设置&#xff0c;如下&#xff1a; 找到increase&#xff0c;如下&#xff1a; 右键选择&#xff0c;增加字体快捷键 按住ctrl滑轮…

Excel 查找后隐去右边列

Excel 有几列数字 ABC11002042002202100102326027010841199100512100100 当给定参数时&#xff0c;请从每行找到该参数&#xff0c;隐去右边的列。如果某行不含该参数&#xff0c;则隐去整行。当参数是 100 时&#xff0c;结果如下&#xff1a; ABC710082021009119910010121…

shell之免交互

免交互 交互&#xff1a;发出指令控制指令的运行&#xff0c;程序再接收到指令的效果做出对应的反应。 免交互&#xff1a;间接的&#xff0c;通过第三方的方式把指令传送给程序&#xff0c;不用直接的下达指令 Hhere Document 免交互 这是命令行格式&#xff0c;也可以写在脚本…

QTableWidget的使用

使用QTableWidget&#xff0c;初始化数据、设置列头及格式&#xff0c;设置行数&#xff0c;设置每个单元格的编辑&#xff0c;间隔行底色变换、行选择 &#xff0c;模式&#xff0c;单元格选择模式、插入行 、追加行、删除行&#xff0c;单元格加图标&#xff0c;单元格显示ch…

好记性不如烂笔头(三)——文件保存后打开呈现乱码问题

现象 请随博主进行下列操作&#xff0c;神奇的事情会发生—— 1、新建记事本&#xff0c;里面输入“同”字&#xff0c;保存为ANSI格式 2、再次打开会发现&#xff0c;“同”已经变成了乱码 3、类似的字还有很多&#xff0c;例如“同学”的“学”。而有些字则不会出现这种情况…

3_电机的发展及学习方法

一、电机组成及发展 1、什么是励磁&#xff1f; 在电磁学中&#xff0c;励磁是通过电流产生磁场的过程。 发电机或电动机由在磁场中旋转的转子组成。磁场可以由 永磁体或励磁线圈产生。对于带有励磁线圈的机器&#xff0c;电流必须在线圈中流动才能产生&#xff08;激发&#x…

香港服务器托管对外贸行业必要性和优势

在当今全球化的经济环境下&#xff0c;外贸企业面临着前所未有的机遇与挑战。其中&#xff0c;服务器托管的选择对于外贸企业的运营效率和市场拓展具有举足轻重的作用。香港服务器&#xff0c;凭借其独特的地理位置、优质的网络环境和卓越的服务性能&#xff0c;一直是外贸企业…

“Hello, World” 的历史

“Hello, World!” —— 初学者进入编程世界的第一步 由布莱恩柯林汉 撰写的“Hello, world”程序 (1978年) 布莱恩W.克尼汉&#xff08;Brian W. Kernighan&#xff09;—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多&#xff…

OS中断机制-嵌套和竞争

对于FreeRTOS最好不去用中断嵌套,中断嵌套会增加堆栈空间的使用,因为每个中断服务程序都需要保存和恢复寄存器状态,这可能会耗尽有限的堆栈空间,从而导致系统故障。以及中断嵌套时,不同的中断服务程序可能会竞争访问共享资源,从而增加死锁的风险。这可能会导致系统出现故…

Verilog进行结构描述(structural modeling)(一):基本概念

目录 1.结构描述(structural modeling)的内容&#xff1a;2.实例 微信公众号获取更多FPGA相关源码&#xff1a; 1.结构描述(structural modeling)的内容&#xff1a; 用门来描述器件的功能基于基本元件和底层模块例化语句最接近实际的硬件结构主要使用元件的定义、使用声明以…

Flink——最流批的大数据框架(流批一体)

Apache Flink基础教程 资料来源&#xff1a;Apache Flink Tutorial (tutorialspoint.com) Apache Flink是Apache Hadoop的开源本地分析数据库。它由Cloudera、MapR、Oracle和Amazon等供应商提供。本教程中提供的示例是使用Cloudera Apache Flink开发的。 本教程是为那些想要学…

fork 是一个创建新进程的系统调用

在计算机科学中&#xff0c;fork 是一个创建新进程的系统调用。具体来说&#xff0c;fork 调用会创建一个与当前进程几乎完全相同的副本&#xff0c;包括父进程的内存布局、环境变量、打开的文件描述符等。这个新的进程被称为子进程&#xff0c;而原始进程被称为父进程。 以下…

光伏开发有没有难点?如何解决?

随着全球对可再生能源的日益重视&#xff0c;光伏技术作为其中的佼佼者&#xff0c;已成为实现能源转型的关键手段。然而&#xff0c;光伏开发并非一帆风顺&#xff0c;其过程中也面临着诸多难点和挑战。本文将对这些难点进行探讨&#xff0c;并提出相应的解决策略。 一、光伏开…

12 学习总结:操作符

目录 一、操作符的分类 二、二进制和进制转换 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;二进制 &#xff08;三&#xff09;进制转换 1、2进制与10进制的互换 &#xff08;1&#xff09;2进制转化10进制 &#xff08;2&#xff09;10进制转化2进制 2…

解决vs2022scanf报错问题

vs2022scanf报错问题 大家下完vs2022之后,开心的写下一段简单的代码: #include <stdio.h> #include <stdlib.h>int main() {int a;scanf("%d", &a);printf("%d", a);return 0; } vs2022会毫不犹豫的报错,下面是报错信息: 翻译过来就是v…

探究InnoDB Compact行格式背后

目录 一、InnoDB 行格式数据准备 二、COMPACT行格式整体说明 三、记录的额外信息 &#xff08;一&#xff09;变长字段长度列表 数据结构 存储过程 读取过程 变长字段长度列表存储示例 &#xff08;二&#xff09;NULL 值位图 数据结构 存储过程 读取过程 NULL 值…