Linux下GPIO和看门狗应用编程

文章目录

  • GPIO应用编程
  • 看门狗应用编程

GPIO应用编程

应用层操控硬件可以通过操作这些硬件的设备文件来进行,设备文件是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的I/O操作来操控硬件设备。设备文件通常在/dev/目录下,该目录下的文件也称为设备节点,前面驱动开发中的设备节点文件就存放该目录下,通过对相应的设备文件进行读写操作从而达到控制其对应硬件的目的。
除了对设备文件操作可以控制硬件设备外,还可以通过对sysfs文件系统对硬件设备进行操控。sysfs提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据和属性的访问支持。硬件设备、设备属性、对象关系在sysfs中分别对应目录、文件和链接文件。
sysfs挂载在/sys/目录下,打开/sys/目录,其包含的文件及其层级关系如下图所示。
在这里插入图片描述
/sys/devices下存放着系统所有的设备目录;/sys/block是块设备目录;/sys/bus是系统总线类型的目录;/sys/class是按照功能分类放置的目录;/sys/dev是按照设备号方式放置的目录;/sys/firmware是内核中的固件目录;/sys/fs是文件系统目录;/sys/kernel是内核中所有可调参数的位置;/sys/module是系统中存放模块信息的目录;/sys/power是系统中电源选项。/sys/devices是最重要的目录,其他的设备目录都是链接到该目录下。
下面介绍一下通过sysfs控制gpio的方法。
进入到/sys/class/gpio目录下,该目录下包含两个文件export和unexport以及gpio_和gpiochip_等文件夹。gpiochip_对应着开发板的gpio控制器,是一组gpio,后面的数字就是这组gpio中的起点,gpio_就是某一个具体的gpio口。
export用于将指定编号的GPIO引脚导出,在使用GPIO引脚之前,需要将其导出,导出成功之后才能使用它。export文件是只写文件,将一个指定的编号写入到export文件中即可将对应的GPIO引脚导出。导出的命令如下。

echo 0 > export //导出gpio0

使用上面的命令后就可以在/sys/class/gpio目录下生成了一个名为gpio0的文件夹,文件夹里面有相关属性的文件,使用cat命令就可以查看属性值,如下图所示。
在这里插入图片描述
unexport用于将导出的GPIO引脚删除,删除的命令如下。

echo 0 > unexport //删除gpio0

direction文件配置GPIO引脚为输入或输出模式,有"in"和"out";value是在GPIO配置为输出模式下,向value文件写入"0"控制GPIO引脚输出低电平,写入"1"则控制GPIO引脚输出高电平。在输入模式下,读取value文件获取GPIO引脚当前的输入电平状态。active_low属性文件用于控制极性,可读可写,默认情况下为0;edge控制中断的触发模式,该文件可读可写,非中断引脚为"none",上升沿触发为"rising",下降沿触发为"falling",边沿触发为"both"。
进到相应的gpio目录下,配置各属性的命令如下,可根据自己的要求给属性设置对应的值。

echo “in” > direction
echo “out” > direction
echo “0” > active_low
echo “1” > active_low
echo “0” > value
echo “1” > value
echo “none” > edge
echo “rising” > edge
echo “falling” > edge
echo “both” > edge

上面是采用命令设置各属性,代码实现如下。

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <error.h>
#include <stdlib.h>static char gpio_path[100];   //gpio存放路径
static int gpio_config(const char *attr, const char *val)   //gpio属性设置函数
{char file_path[100];  //加属性之后的路径int fd,ret;sprintf(file_path,"%s/%s",gpio_path,attr);   //属性的路径fd = open(file_path, O_RDWR);if(fd < 0){perror("open error"); return fd;}ret = write(fd,val,strlen(val));  //给gpio相关属性设置值if(ret < 0){perror("attribute write error");return ret;}close(fd);return 0;
}int main(int argc, char **argv)
{int fd,ret;char value[1];char file_path[100];if(argc != 3)   //argv[1]:gpio number ------  argv[2]:value{printf("error argument!\n");return -1;}sprintf(gpio_path,"/sys/class/gpio/gpio%s",argv[1]);if (access(gpio_path,F_OK))    //如果需要的gpio目录不存在,则需要通过export导出,相当于命令 echo 0 > export{fd = open("/sys/class/gpio/export", O_WRONLY);  //打开配置文件if(fd < 0){perror("open error"); return fd;}ret = write(fd,argv[1],strlen(argv[1]));if(ret < 0){perror("gpio write error");return ret;}close(fd);}//目标gpio已存在,直接设置gpio_config("direction","out");  //配置输入输出方向gpio_config("active_low","0");   //配置低电平gpio_config("value",argv[2]);   //设置值//gpio_config("edge","both");   //设置中断触发模式//读取gpio的value属性sprintf(file_path,"%s/%s",gpio_path,"value");fd = open(file_path,O_RDONLY);read(fd,value,1);printf("value = %c\n",value[0]);return 0;
}

上面的程序执行时传入两个参数,第一个参数是gpio对应的编号,第二个参数是设置的value属性值,有些gpio口设置value的时候是不被允许的,可以根据自己开发板的情况修改代码执行程序。


看门狗应用编程

为了使系统在异常情况下能自动复位,一般都需要引入看门狗,看门狗本质上是一个可以在一定时间内被复位的计数器。当看门狗启动后,计数器开始自动计数,经过特定的时间,如果计数器没有被复位,计数器就会溢出从而对CPU产生一个复位信号使系统重启。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零,俗称喂狗,喂狗是为了不产生复位信号。如果系统不出问题,程序就可以保证按时喂狗,一旦程序跑飞,则不会喂狗,系统收到复位信号进行复位。
使用WDIOC_GETTIMEOUT指令获取超时时间,WDIOC_SETTIMEOUT指令设置超时时间。

int timeout;
ioctl(int fd, WDIOC_GETTIMEOUT, int *timeout); //获取超时时间
ioctl(int fd, WDIOC_SETTIMEOUT, int *timeout); //设置超时时间

WDIOS_ENABLECARD指令开启、WDIOS_DISABLECARD指令停止看门狗。

int option = WDIOS_ENABLECARD;
ioctl(int fd, WDIOC_SETOPTIONS, int *option);  //开启int option = WDIOS_DISABLECARD;
ioctl(int fd, WDIOC_SETOPTIONS, int *option);  //关闭

使用WDIOC_KEEPALIVE指令喂狗。

ioctl(int fd, WDIOC_KEEPALIVE, NULL);

开发板的/dev/目录下有watchdog和watchdog0两个和看门狗相关的设备节点,这两个代表的是同一个硬件外设,我在代码中都试了,这两个设备节点都是可以控制看门狗的。
在这里插入图片描述
看门狗的测试代码如下。

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <error.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>int main(int argc, char **argv)
{int timeout;   //超时时间设定int time;   //喂狗间隔时间int op;   //设置看门狗状态int fd;int ret;if(argc != 2)   //需要用户传入超时时间{printf("error argument!\n");return -1;}fd = open("/dev/watchdog", O_RDWR);   //打开看门狗设备文件if (fd < 0) { perror("open error"); return fd;}op = WDIOS_DISABLECARD; ret = ioctl(fd,WDIOC_SETOPTIONS,&op);   //先停止看门狗计时器if (ret < 0) { close(fd); return ret; }timeout = atoi(argv[1]);   //接收参数ret = ioctl(fd,WDIOC_SETTIMEOUT,&timeout);  //设置超时if (ret < 0) { close(fd); return ret; }op = WDIOS_ENABLECARD; ret = ioctl(fd,WDIOC_SETOPTIONS,&op);  //开启看门狗计时器if (ret < 0) { close(fd); return ret; }time = (timeout*1000-100)*1000;   //设置喂狗时间间隔,在超时时间到来前100ms喂狗printf("set timeout : %ds\n",timeout);ret = 0;while(1){usleep(time);  //喂狗时间间隔ret++;printf("KEEPALIVE---%d\n",ret);ioctl(fd,WDIOC_KEEPALIVE,NULL);  //喂狗}return 0;
}

程序运行结果如下图所示。
在这里插入图片描述
该程序运行起来之后,每隔一段时间,在看门狗将要到时前进行一次喂狗操作,这样系统就能正常运行。按下Ctrl+C终止该程序之后,内核打印信息如下。

watchdog watchdog0: watchdog did not stop!

说明看门狗计时器还在计时,没有因为程序的终止而停下,所以看门狗计时器会溢出,从而发生复位重启,由上图可以看到,计时器到时候开发板就自动重启了。


参考资料:
I.MX6U嵌入式Linux C应用编程指南V1.4——正点原子

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

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

相关文章

Yolo-Z:改进的YOLOv5用于小目标检测

目录 一、前言 二、背景 三、新思路 四、实验分析 论文地址&#xff1a;2112.11798.pdf (arxiv.org) 一、前言 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即…

延迟队列实现方案总结

日常开发中&#xff0c;可能会遇到一些延迟处理的消息任务&#xff0c;例如以下场景 ①订单支付超时未支付 ②考试时间结束试卷自动提交 ③身份证或其他验证信息超时未提交等场景。 ④用户申请退款&#xff0c;一天内没有响应默认自动退款等等。 如何处理这类任务&#xff0c;最…

MAC缓解WebUI提示词反推

当前环境信息&#xff1a; 在mac上安装好stable diffusion后&#xff0c;能做图片生成了之后&#xff0c;遇到一些图片需要做提示词反推&#xff0c;这个时候需要下载一个插件&#xff0c;参考&#xff1a; https://gitcode.net/ranting8323/stable-diffusion-webui-wd14-tagg…

66 内网安全-域横向批量atschtasksimpacket

目录 演示案例:横向渗透明文传递at&schtasks 案例2-横向渗透明文HASH传递atexec-impacket案例3-横向渗透明文HASH传递批量利用-综合案例5-探针主机域控架构服务操作演示 传递攻击是建立在明文和hash值的一个获取基础上的攻击&#xff0c;也是在内网里面常见协议的攻击&…

一道简单的C#面试题

试题&#xff1a; 抽顺序问题&#xff1a;有10位面试者&#xff0c;需要随机抽号面试。 1&#xff09;总共十个号数&#xff0c;用数组表示&#xff1b; 2&#xff09;每一位面试者输入1开始抽签&#xff0c;然后得到抽签号&#xff0c;输入2结束抽签&#xff1b; 3&#x…

Linux玩物志:好玩却无用的软件探秘

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 我们已经学习了yum指令&#xff0c;可以在Linux中安装一些软件的指令。下面我们就盘点一些可玩性很高但是却没有什么用的软件&#xff0c;在枯燥的学习中增添一丝乐趣&#xff01; For…

CSS宽度100%和宽度100vw之间有什么不同?

vw和vh分别代表视口宽度和视口高度。 使用width: 100vw代替的区别在于width: 100%&#xff0c;虽然100%将使元素适合所有可用空间&#xff0c;但视口宽度具有特定的度量&#xff0c;在这种情况下&#xff0c;可用屏幕的宽度 。 如果设置样式body { margin: 0 }&#xff0c;则1…

2000-2021年上市公司产融结合度量数据

2000-2021年上市公司产融结合度量数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、是否持有银行股份、持有银行股份比例、是否持有其他金融机构股份、产融结合 3、来源&#xff1a;上市公司年报 4、范围&#xff1a;上市公司 5、样本量&#xff…

gRPC源码剖析-Builder模式

一、Builder模式 1、定义 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的的表示。 2、适用场景 当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 说人话&#xff1a…

java基础篇-环境变量

java基础 编程学习的关键点、重点1.环境变量设置待续 编程学习的关键点、重点 输入输出 Java语言、C语言、Python语言、甚至SQL语言&#xff0c;都需要实战、做大量输入输出等 1.环境变量设置 1.下载jdk安装 jdk官网下载直达链接&#xff1a;https://www.oracle.com/java/te…

2023香港秋灯展丨移远通信闪耀亮相,开启Matter生态互联新篇章

10月27日&#xff0c;2023香港国际秋季灯饰展于香港会议展览中心正式开幕。 移远通信携最新一站式Matter解决方案、Wi-Fi模组&#xff0c;以及多款代表前沿技术的智能灯具、插座等终端重磅亮相。同时&#xff0c;公司产品总监丁子文围绕“Matter生态互联新篇章”主题发表演讲&a…

深度学习之基于YoloV8的行人跌倒目标检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、行人跌倒目标检测系统四. 总结 一项目简介 世界老龄化趋势日益严重&#xff0c;现代化的生活习惯又使得大多数老人独居&#xff0c;统计数据表…

Zynq UltraScale+ XCZU7EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

SurfaceFliger绘制流程

前景提要&#xff1a; 当HWComposer接收到Vsync信号时&#xff0c;唤醒DisSync线程&#xff0c;在其中唤醒EventThread线程&#xff0c;调用DisplayEventReceiver的sendObjects像BitTub发送消息&#xff0c;由于在SurfaceFlinger的init过程中创建了EventThread线程&#xff0c…

Android环境变量macOS环境变量配置

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览macOS基础知识 三、设置环境变量3.1 终…

Spring两大核心之一:AOP(面向切面编程)含设计模式讲解,通知类型切点;附有案例,实现spring事务管理

模拟转账业务 pom.xml <dependencies><!--spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.29</version></dependency><!--lombok-->…

物联网二维码核销盒对接文档

核销盒是干嘛的&#xff1f; 1.在某些场景下快速核销订单或打卡签到等&#xff0c;通过核销盒能快速将订单信息发送到后端进行处理。 一&#xff0c;首先你需要有一台核销设备&#xff0c;也就是核销盒。 二&#xff0c;通过接口激活或更新核销盒 ​​​​​​​ 简要描述 激…

2.Vue — 模板语法、数据绑定、el与data的写法、数据代理

文章目录 一、模板语法1.1 插值语法1.2指令语法 二、数据绑定语法2.1 单向数据绑定2.2 双向数据绑定 三、el与data的两种写法3.1 el3.2 data 四、数据代理4.1 Object.defineProperty4.2 Vue数据代理4.2.1 展示数据代理4.2.2 Vue数据代理 一、模板语法 root容器里面的代码被称为…

边缘计算技术的崭新篇章:赋能未来智能系统

边缘计算是近年来云计算和物联网技术发展的重要趋势。通过将数据处理和分析从云端迁移到设备边缘&#xff0c;边缘计算能够实现更低的延迟和更高的数据安全。本文将探索边缘计算技术的最新进展及其在不同行业中的应用场景。 1. 实时数据处理与决策 在需要快速响应的场景中&…

Seata入门系列【15】@GlobalLock注解使用场景及源码分析

1 前言 在Seata 中提供了一个全局锁注解GlobalLock&#xff0c;字面意思是全局锁&#xff0c;搜索相关文档&#xff0c;发现资料很少&#xff0c;所以分析下它的应用场景和基本原理&#xff0c;首先看下源码中对该注解的说明&#xff1a; // 声明事务仅在单个本地RM中执行 //…