linux基础操作2-字符设备控制-LBA的控制(LED/BEEP/AD控制)

2023-05-16

导:在 linux 驱动中,字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的。

1.先理顺对 main函数的理解

main 函数作为应用程序的入口,在头文件“#include<stdio.h> ”中。
main 函数需要传参数的时候完整的定义为: int main(int argc,char **argv)
            //参数 argc,表示参数的个数
            //参数**argv,存储输入字符的数组:argv[0]表示程序名称,argv[1]——argv[n]输入的参数
                不传参数的时候定义为:int main(void),

            //函数 main 的返回值为类型为 int,用于判断程序执行成功还是失败

                无返回,并且不传参数的时候定义为:main(void) (等同 void main(void))

可测函数 int main(int argc,char **argv) 的用例子如下

2.LBA控制操作

----------硬件电路---------------

 

 

-----引入一个硬件io的控制函数ioctl()-----------

    int ioctl( int fd, int request, int cmd);
//参数 fd,函数 open 返回的句柄。
//参数 request 和参数 cmd,由内核驱动决定具体操作,例如:request 可以代表哪一个 IO 口,cmd 代表对 IO 进行什么样的操作,也可以反过来。具体的含义由驱动工程师在驱动中 switch决定。

//返回值:返回 0 成功;返回-1,出错

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <termios.h>
#include <sys/stat.h>
 
int main(int argc ,char *argv[])
{
	int i,j,k,fd,adc_len,r;//
	i=atoi(argv[1]);
	j=atoi(argv[2]);//
	k=atoi(argv[3]);
	
	char adc_buffer[512];
	char *leds="/dev/leds";
	char *buzzer_ctl="/dev/buzzer_ctl";
	char *adc="/dev/adc";//=========if p i c p========================
	if((fd=open(leds,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开LED失败!\r\n");
	} 
	printf("打开LED 成功!\r\n");
	ioctl(fd,i,j);
	close(fd);//--------关闭LED----if p i c p-----------------------------
	printf("关闭LED 成功!\r\n");
	
	if((fd=open(buzzer_ctl,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开beep失败!\r\n");
	} 
	printf("打开beep 成功!\r\n");
	ioctl(fd,k,0);
	close(fd);//--------关闭beep-----if p i c p----------------------------
	printf("关闭beep 成功!\r\n");
	
	if((fd=open(adc,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开adc失败!\r\n");
	}else
	{
		printf("打开adc成功!\r\n");
		adc_len=read(fd,adc_buffer,10);
		if(adc_len==0) printf("read null \r\n");
		else {
			r=atoi(adc_buffer);
			r=(int)(r*10000/4095);
			printf("数值为:%d \t",r);
		}
	}				
	close(fd);//--------关闭adc if c p---------------------------------
	printf("关闭beep 成功!\r\n");
	return 1;
}

3 现象验证:

第一个参数是亮灭,第二个参数是选择灯,第三个参数开关beep

        验证通过!!!!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux基础操作2-字符设备控制-LBA的控制(LED/BEEP/AD控制) 的相关文章

  • 10大经典排序算法-已经亲自验证

    10大经典排序 参考书籍 王道 数据结构第8章节 算法代码在Visio Stdio 2019验证过 xff01 根据操作方式可分5类 xff1a 插入排序 xff0c 交换排序 xff0c 选择排序 xff0c 归并和基数排序 其中 xff
  • 线性表--顺序表、单链表、双链表 总结

    线性表 顺序表 单链表 双链表 基础操作总结 函数 xff1a 王道 数据结构 已在Visio Stdio 2019验证成功 xff01 顺序表插入 删除 查找 单链表的头插法 尾插法 xff0c 按值 按序查找 xff0c 插入 删除 双
  • 串的模式识别和kmp算法

    串的简单模式匹配 与 KMP 获取next数组 参考书籍 王道 数据结构 代码验证软件 xff1a vs2019 include lt iostream gt typedef char SString 暴力比对 S abcabaaabaab
  • 二叉树和二叉排序树的操作

    二叉树和二叉排序树的操作 参考书籍 王道 书籍结构 代码已在vs2019验证过 1 二叉树的遍历 二叉树的建树 xff08 层次建树 xff09 xff0c 前序 中序 后序遍历 中序非递归遍历 层次遍历 include lt iostre
  • 图的遍历和相关操作

    图的遍历和相关操作 参考书籍 xff1a 王道 数据结构 代码在vs2019验证过 xff01 图的创建 xff0c 打印 xff0c 广度优先遍历 xff0c 深度优先遍历 测试代码 xff1a include lt stdio h gt
  • GDB调试 小结

    本文介绍使用GDB进行C调试 参考 xff1a 用gdb调试程序笔记 以段错误 Segmental fault 为例 GDB操作基本命令 1 编写调试测试代码如下 bugging c 1到100的求和函数 xff0c 代码调试 buggin
  • 嵌入式 2-笔试--c/c++ (重复的题目就是高频考查题)

    转自 xff1a https blog csdn net cxyzyywoaini article details 87879788 第一套 重复的题目越重要 xff01 预处理器 xff08 Preprocessor xff09 1 用预
  • 嵌入式 3-笔试-linux/c/c++(重复的题目就是高频考查题) 8个大厂精选收集50题

    Linux开发相关的大厂面试题 xff0c 主要是Linux服务器开发相关 xff0c 此处仅作优秀试题摘录 xff0c 详细文档 xff0c 可自行到文档csdn下载区下载 xff0c 同时 xff0c 如涉及侵权内容 请及时告知 xff
  • 关于Runnable 和 Thread的应用场景

    摘自StackOverflow 个人觉得比较靠谱的答案 xff0c 细节请看url http stackoverflow com questions 541487 implements runnable vs extends thread
  • RT-Thread嵌入式操作系统 开发笔记(上)

    更详细的参考链接 0 准备 xff1a 环境准备 xff1a MDK ARM 5 30 正式版或评估版 xff0c 5 14 版本及以上版本均可 43 破解软件 STM32F103 pack 库文件 百度云盘云盘文件 1 文件 xff0c
  • RT-Thread嵌入式操作系统 开发笔记(中)

    9 生产者消费者问题模型 xff08 验证代码producer consumer c xff09 生产者消费者问题是 一个经典的 多线程同步问题 有两个线程 一个生产者线程和一个消费者线程 两个线程共享二个初始为空 固定大小为n的缓存区 生
  • 嵌入式软件基础问题-转

    volatile关键字的作用 直译为 易变 xff0c 与const相反 用volatile定义的变量 xff0c 在每一次被访问时都是从内存中读取该量的值 xff0c volatile不允许编译器优化该值到寄存器 xff0c 所以取值时不
  • 嵌入式操作系统RT-Thread和Freertos资源对比总结 转

    Freertos是一个国外推出的一个迷你的实时操作系统内核 xff0c 开源 xff0c 功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记录功能 软件定时器 协程等 xff0c 可基本满足较小系统的需要 RT Thr
  • 虚拟机更改IP 连接失败 问题解决Destination Host Unreachable

    问题1 xff1a 虚拟机原来是ens33的ip 1 100 xff0c 可以联网 xff0c 改为3 66就无法联网 xff0c 再改回1 100 xff0c 依然无法联网 如图 解决方法 xff1a 重启网卡管理器即可 xff1a se
  • NUC980 jtag0 默认管脚复用问题

    NUC980DK61YC 使用G13 xff08 管脚编号是205 xff09 用作普通io口 xff0c 出现报错 报错 xff1a echo 205 gt sys class gpio export Please Check GPIOG
  • usb的device模式hid配置错误点

    将usb做从机 xff0c hid通信操作 xff08 模拟串口 xff0c 模拟u盘 xff0c hid通信 xff09 内核设定 1 模拟u盘 2 模拟串口 3 hid通信 1 报错 xff1a insmod libcomposite
  • nuc980 串口问题 串口断帧 丢帧问题

    NUC980 的性能不错 xff0c 串口速率号称达到3Mbps xff08 代码级有4M的极限 xff09 xff0c 并且带有流控性能 xff1b 经过单独测试3Mbps下有千分之三的丢包率 xff08 NUC980和电脑的串口助手交互
  • 2021-09-14 uboot移植开发

    引言 xff1a 最近要改动uboot xff0c 实现像微软PC上 xff0c u盘一键刷机或手机上安全模式下刷机的操作 专门去好好研究了点uboot的启动过程 xff1b 以下为总结 xff1a 嵌入式系统 微软 PC bootload
  • JAVA 泛型中的<T> 和 <?> 的应用场景

    在JAVA 泛型中 xff0c 经常看到 lt gt 应用场景为当不确定类型时 因为泛型的输入参数是类型 xff0c 而有一些状况下我们并不能确定类型
  • 当ctrl + c无法打断linux应用程序的执行时(CPU占比过大),该注意什么 ?

    如题 xff0c 问题显示如下 xff1b 经过测试 xff1a 发现是线程资源无法及时是否导致的 xff1b 每个线程都是while xff08 1 xff09 如果线程之间没有设置优先级的话 xff1b 当一个线程的while xff0

随机推荐