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

点亮 LED-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

点亮 LED

在这里插入图片描述

应用层操控硬件的两种方式

背景

  • Linux系统将所有内容视作文件,包括硬件设备,通过文件I/O方式与硬件交互

  • 设备文件,如字符设备文件与块设备文件,是硬件设备提供给应用层的接口

  • 应用层通过设备文件进行I/O操作,以控制硬件如显示屏、串口等

  • 设备文件位于/dev/目录,被称为设备节点

  • 除了设备节点,硬件设备还可以通过sysfs文件系统进行控制

sysfs 文件系统

  • sysfs是一种基于内存的虚拟文件系统,与devfs、proc文件系统类似,用于向应用层提供内核信息

  • sysfs主要功能是对系统设备进行管理,展示系统硬件的层次结构

  • sysfs通过分级的文件目录结构,展示设备驱动模型中各组件的层次关系

  • sysfs提供机制显式描述内核对象、对象属性及对象间关系,并将这些信息导出到用户空间

sysfs 与/sys

  • sysfs文件系统被挂载在/sys目录下,为Linux系统(如启动ALPHA/Mini I.MX6U开发板时)的标准组成部分

    • /sys 目录
  • /sys目录下的子目录包括block、bus、class、dev、devices、firmware等,每个目录下含有多个文件或子目录,反映系统的不同方面

    • /sys 目录结构

  • /sys/devices目录是sysfs中的核心,存放系统中所有设备的信息,是管理设备的主要目录结构

  • /sys/bus、/sys/class、/sys/dev等目录通过不同的方式(如按总线类型、功能分类、设备号)组织设备信息,且这些目录下的文件通常链接到/sys/device

  • 设备的属性和数据通过目录下的文件(称为属性文件)体现,通过读写这些文件可以访问或控制设备的属性和状态

小结

  • 应用层控制底层硬件通常通过两种方式

    • /dev/目录下的设备文件(设备节点)

    • /sys/目录下的设备属性文件

  • 选择使用/dev/目录或/sys/目录来操控设备依赖于设备的功能类型和设备驱动的实现方式

  • 简单的设备如LED和GPIO倾向于使用sysfs方式,其驱动会将设备属性导出到用户空间的sysfs文件系统中

  • 复杂的设备如LCD屏幕、触摸屏和摄像头则通常通过设备节点来进行控制

标准接口与非标准接口

  • Linux内核引入了设备驱动框架概念,以降低驱动开发难度和实现接口标准化

  • 内核为各种常见设备(如LED、输入设备、FrameBuffer、视频设备、PWM设备等)设计了一套标准的驱动实现框架

  • 设备驱动框架为驱动开发和应用层提供统一的接口规范,简化了开发过程

  • 使用设备驱动框架开发的驱动程序提供标准化接口,而不使用框架开发的驱动程序则提供非标准化接口

  • 对于一些不属于任何标准分类的硬件外设,如杂项设备(misc device),其驱动程序通常提供非标准接口,具体控制方法由驱动工程师掌握

  • 嵌入式系统中,许多硬件外设的驱动程序都是定制的,提供非标准化接口

LED 硬件控制方式

ALPHA/Mini I.MX6U 开发板出厂系统的 LED 设备是基于 Linux 内核标准 LED 驱动框架注册的,使用 sysfs 方式控制,没有在/dev 目录下的设备节点

/sys/class/leds 目录下存放了所有的 LED 设备,其中包括sys-led。目录下关注的主要是三个属性文件

  • brightness(用于设置和获取 LED 的亮度等级)

    • 对于 PWM 控制的 LED,亮度等级对应不同的占空比,但对于 GPIO 控制的 LED,只有亮和灭两种亮度等级
  • max_brightness(用于获取 LED 设备的最大亮度等级)

    • 只能被读取,不能写
  • trigger(用于获取和设置 LED 的触发模式)

    • none(无触发)

    • mmc0(当对 mmc0 设备发起读写操作的时候 LED 会闪烁)

    • timer(LED 会有规律的一亮一灭,被定时器控制住)

    • heartbeat(心跳呼吸模式,LED 模仿人的心跳呼吸那样亮灭变化)

可以通过 echo 命令进行控制 LED 的亮度和触发模式,还可以编写应用程序,使用 write()、read()函数对这些属性文件进行 I/O 操作以达到控制 LED 的效果

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

  • 使用 cat 读取以及 echo 写入到属性文件中的均是字符串,应用程序中通过 write()向属性文件写入数据,以及使用 read()读取的数据也是字符串 ASCII 编码的

编写 LED 应用程序

开始:程序的入口点

校验传参:检查 argc 是否小于 2

  • 如果是,则展示 USAGE 消息,程序异常退出(状态为 -1)

打开文件

  • 尝试打开 trigger 文件,得到文件描述符 fd1

    • 如果 fd1 小于 0,打印 “open error”,程序异常退出(状态为 -1)
  • 尝试打开 brightness 文件,得到文件描述符 fd2

    • 如果 fd2 小于 0,打印 “open error”,程序异常退出(状态为 -1)

如果 fd2 小于 0,打印 “open error”,程序异常退出(状态为 -1)

  • 如果 argv[1] 等于 “on”

    • 写 “none” 到 fd1,写 “1” 到 fd2
  • 如果 argv[1] 等于 “off”

    • 写 “none” 到 fd1,写 “0” 到 fd2
  • 如果 argv[1] 等于 “trigger”

    • 检查 argc 是否等于 3

      • 如果不是,则展示 USAGE 消息,程序异常退出(状态为 -1)
    • 尝试写 argv[2] 到 fd1

      • 如果写操作返回值小于 0,打印 “write error”
  • 如果没有匹配的参数,则展示 USAGE 消息

正常退出:程序正常退出,返回状态 0

#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"
//定义了控制LED触发模式和亮度的文件路径
#define  USAGE()    fprintf(stderr, "usage:\n"  \"    %s <on|off>\n"   \"    %s <trigger> <type>\n", argv[0], argv[0])
//fprintf函数用于格式化输出
//stderr表示标准错误输出流
// \ 是续行符,表示这一行未结束,下一行是本行的延续int main(int argc, char *argv[])
{int fd1, fd2;/* 校验传参 *///如果参数为1个则报错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 *///strcmp函数返回0表示两个字符串相等if (!strcmp(argv[1], "on")) {write(fd1, "none", 4); 	//先将触发模式设置为none//将字符串"none"写入文件描述符fd1所指向的文件,4表示写入的字节数write(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);
}

在开发板上测试

通过gcc 编译器获得可执行文件后移植到开发板

./testApp on # 点亮 LED

./testApp off # 熄灭 LED
./testApp trigger heartbeat # 将 LED 触发模式设置为 heartbeat

相关文章:

点亮 LED-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

点亮 LED 应用层操控硬件的两种方式 背景 Linux系统将所有内容视作文件&#xff0c;包括硬件设备&#xff0c;通过文件I/O方式与硬件交互 设备文件&#xff0c;如字符设备文件与块设备文件&#xff0c;是硬件设备提供给应用层的接口 应用层通过设备文件进行I/O操作&#xff…...

从0到1搭建数据中台(4):neo4j初识及安装使用

在数据中台中&#xff0c;neo4j作为图数据库&#xff0c;可以用于数据血缘关系的存储 图数据库的其他用于主要用于知识图谱&#xff0c;人物关系的搭建&#xff0c;描述实体&#xff0c;关系&#xff0c;以及实体属性 安装 在官网 https://neo4j.com/ 下载安装包 neo4j-co…...

【20】读感 - 架构整洁之道(二)

概述 继上一篇文章讲了前两章的读感&#xff0c;已经归纳总结的重点&#xff0c;这章会继续跟进的看一下&#xff0c;深挖架构整洁之道。 编程范式 编程范式从早期到至今&#xff0c;提过哪些编程范式&#xff0c;结构化编程&#xff0c;面向对象编程&#xff0c;函数式编程…...

js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例

今天介绍的是前后端分离系统中的请求参数 数组参数的生成&#xff0c;api请求发送&#xff0c;到后端请求参数接收的全过程示例。 为何会有这个文章&#xff1a;后端同一个API接口同时处理单条或者多条数据&#xff0c;这样就要求我们在前端发送请求参数的时候需要统一将请…...

揭秘郭采洁浪漫升级

【揭秘&#xff01;郭采洁浪漫升级&#xff0c;与“莫拉怪乐”共谱爱情新篇章】在这个春意盎然的季节里&#xff0c;娱乐圈迎来了一则既意外又甜蜜的爆炸新闻——郭采洁&#xff0c;这位以独特气质与精湛演技著称的才女&#xff0c;悄然间迈入了人生的新阶段&#xff0c;而她的…...

数据结构(Java):力扣牛客 二叉树面试OJ题(一)

&#x1f449; ​​​​​​目录 &#x1f448; 1、题一&#xff1a;检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二&#xff1a;另一棵树的子树 2.1 思路分析 2.2 代码 3、题三&#xff1a;翻转二叉树 3.1 思路分析 3.2 代码 4、题四&#xff1a;判断树是否对称 …...

在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 数据…...

逻辑门的题目怎么做?

FPGA语法练习——二输入逻辑门&#xff0c;一起来听~~ FPGA语法练习——二输入逻辑门 题目介绍&#xff1a;F学社-全球FPGA技术提升平台 (zzfpga.com)...

CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”

参考连接&#xff1a; 【linux】CentOS 7报错&#xff1a;yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…...

51单片机STC89C52RC——18.1 HC-SR04超声波测距

目的/效果 独立按键K1按下后开始测距&#xff0c;LCD显示距离&#xff08;mm&#xff09; 一&#xff0c;STC单片机模块 二&#xff0c;HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能&#xff0c;精度达3mm。 2.2 时序 以上时序图表明…...

WordPress与 wp-cron.php

WordPress 傲居全球最流行的内容管理系统&#xff08;CMS&#xff09;之位&#xff0c;占据了互联网约43%的网站后台&#xff0c;这主要得益于其直观易用的用户界面以及丰富的扩展功能&#xff0c;特别是为新手用户提供了极大的便利。 然而&#xff0c;在畅享WordPress带来的便…...

bb-------

社保费申报及缴纳...

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…...

Python中使用SpeechLib实现文本转换语音朗读的示例(修正bug)

一、修正SpeechLib的导入包顺序后的代码&#xff1a; from comtypes.client import CreateObjectengine CreateObject(SAPI.SpVoice) stream CreateObject(SAPI.SpFileStream)from comtypes.gen import SpeechLibinfile E:\\语音文档\\易经64卦读音.txt outfile E:\\demo.…...

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a;在Ubuntu系统上部署Hallo&#x…...

Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )

目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一&#xff1a;使用 IDEA 直接创建项目 项目创建方式二&#xff1a;使用Spring Initializr 的 Web页面创建项目 &#xff08;了解&#…...

电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法

在信息爆炸的时代&#xff0c;屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性&#xff0c;我对于录屏软件的需求可以说是既挑剔又实际。今天&#xff0c;我就为大家分享一下我近期体验的三款录屏软件&#xff1a;福昕录屏大师、转转大师录屏大师和OB…...

idea双击没有反应,打不开

问题描述 Error opening zip file or JAR manifest missing : /home/IntelliJ-IDEA/bin/jetbrains-agent.jar解决方案...

关于UniApp使用的个人笔记

UniApp 开发者中心 用于注册应用以及申请对应证书 https://dev.dcloud.net.cn/pages/app/list https://blog.csdn.net/fred_kang/article/details/124988303 下载证书后&#xff0c;获取SHA1关键cmd keytool -list -v -keystore test.keystore Enter keystore password…...

autoware.universe源码略读(3.16)--perception:object_range_splitter

autoware.universe源码略读3.16--perception:object_range_splitter Overviewnode&#xff08;Class Constructor&#xff09;ObjectRangeSplitterNode::ObjectRangeSplitterNode&#xff08;mFunc&#xff09;ObjectRangeSplitterNode::objectCallback Overview 这里处理的依…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...