LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

嵌入式Linux应用层与驱动层要想学习

2023年9月11日 245点热度

1应用层与驱动层

要想学习嵌入式Linux应用层的开发,首先要分辨好应用层和驱动层之间的关系。我们在大专阶段学习51等较简单的单片机时,都是把应用层和驱动层混在一个文件里写的。例如拿下边的I2C程序为例:

#include
#include
#define uchar unsigned char 
#define nop _nop_()
 
sbit sda = P2^1;//sda接在P2.1	   
sbit scl = P2^0;//sda接在P2.0
 
void delay1()//用于每个语句间的延时
{
	;//空语句
	;
	;
}
 
 
void delay(unsigned int i )//用于LED亮灯延时
{
	while(i--);
}
 
/*scl在高电平期间,sda由高电平变成低电平时,I2C启动*/
void start_24c02()	  //用于24C02的启动
{
	scl = 1;
	delay1();	  
	sda = 1;
	delay1();
	sda = 0;
	delay1();
	
}
 
 
/*scl在高电平期间,sda由低电平变成高电平时,I2C停止*/
void stop_24c02()	//用于24c02启动
{
	sda = 0;
	delay1();
	scl = 1;
	delay1();
	sda = 1;
	delay1();
}
 
 
/*scl在高电平期间,sda变成低电平表示应答*/
void ack_24c02()	//24C02的应答
{
	uchar i = 0;
	scl = 1;
	delay1();
	while((sda ==1)&&(i<200)) //(i<200)表示:如果期间不给应答信号,则程序会一直停在这里,为了避免长时间的等待应答,在此处增加了一个延时
	{
		i++;
	}
	scl = 0;
	delay1();
 
}
 
/*I2C总线初始化,将I2C总线全部设置为高电平,来释放总线*/
void init_24c02()//I2C总线的初始化
{
	sda = 1;
	delay1();     
	scl = 0;
	delay1();	
}
 
 
/*读取一个字节*/
uchar read_onebyte_24c02()
{
	uchar i,date;
	scl=0;
	delay1();
	sda=1;
	delay1();	
	for(i = 0;i<8;i++)	             
	{
		scl = 1;					  
		delay1();										
		date=(date<<1)|sda;		  		  
		scl = 0;
		delay1();			
		
	}
	delay1();			
	return date;
	
}
 
 
/*写一个字节*/
void write_onebyte_24c02(uchar date)
{
	uchar i,temp;
	temp = date;
	for(i=0;i<8;i++)				 
	{
		temp = temp<<1;	
		scl = 0;
		delay1();
		sda =CY;  //temp 左移一位,将移出的最高位字节放到PSW的CY中
		delay1();
		scl = 1;
		delay1();
	}
	scl = 0;
	delay1();
	sda = 1;
	delay1();	
}
 
 
/*对从机的某一地址的某一位置写入一个字节
1、找到要操作地址的从机,同时进行写操作0xA0
2、要写入的位置add
3、要写入的数据dat
*/
void write_add_dat_24c02(uchar add,uchar dat)
{
	start_24c02();					
	write_onebyte_24c02(0xA0);		 //进行写操作0XA0,24C02 的高四位地址为1010;后三位地址A2、A1、A0全部接地,所以为000,;由于为写操作,所以最后一位也为0
	ack_24c02();					
	write_onebyte_24c02(add);		
	ack_24c02();					 
	write_onebyte_24c02(dat);		
	ack_24c02();					 
	stop_24c02();					 
}
 
/*读取某地址的一个字节
1、找到要操作地址的从机,同时进行写操作0xA0
2、要写入的地址add
3、对选中地址的从机进行读操作 0xA1
4、调用读取一个字节函数read_onebyte_24c02(),进行数据读取
*/
uchar read_add_dat_24c02(uchar add)
{
	uchar dat;
	start_24c02();					 
	write_onebyte_24c02(0xa0);		 
	ack_24c02();					 
	write_onebyte_24c02(add);		 
	ack_24c02();					 
	start_24c02();					 
	write_onebyte_24c02(0xa1);	 //进行读操作0XA0,24C02 的高四位地址为1010;后三位地址A2、A1、A0全部接地,所以为000,;由于为读操作,所以最后一位为1
	ack_24c02();					 
	dat = read_onebyte_24c02();	
	ack_24c02();
	stop_24c02();					 
	return (dat);
}
 
 
void main()
{
	init_24c02();						 //初始化I2C 
	while(1)
	{
		write_add_dat_24c02(3,0x0f);	 //对地址3进行写入数据
		delay(200);						 
		write_add_dat_24c02(4,0xf0);	 //对地址4进行写入数据
		delay(200);						
		P3 = read_add_dat_24c02(3);		 //读取地址3的数据
		delay(55000);					 //保持灯亮
		P3 = read_add_dat_24c02(4);		 //读取地址4的数据
		delay(55000);					//保持灯亮
	
	}
}

该程序所要实现的功能是将数据0x0f和0xf0分别写入地址3和地址4。这个目标可以分为两部份执行:第一部份是估算出要储存的数据(因为该程序要储存的数据早已给下来了,就不用算了,但在实际工程中,这种数据通常是要自己获取的),第二部份是根据I2C合同的时序将这种数据发送给硬件。于是,里面提及的第一部份被称为应用层开发,第二部份被称为驱动层开发。

我们观察以上示例代码,发觉作者还是很规矩地把驱动层程序编程了函数的方式(比如write_add_dat_24c02()),但应用层和驱动层的程序终究还是存贮在同一个c文件中。而在Linux系统中,驱动层和应用层分的很清楚,它们分别保存在两个不同的文件中。而且应用层的程序运行在用户空间中,驱动层的程序则是被编进了Linux内核里。在实际调用程序的过程中嵌入式linux应用层开发,由应用层程序执行数据估算等任务,任务执行完后通过一个插口将算好的数据发送给驱动层程序嵌入式linux应用层开发linux系统应用,最后由驱动层程序进行硬件实现。这样的分层有一个益处,就是对于调用同一个硬件的应用程序,他的驱动层可以不用更改,只更改应用层程序就可以了。

因为Linux操作系统现今发展的早已比较建立了,好多硬件设备都能在网上找到写好的驱动,因而在进行嵌入式Linux开发的过程中,通常更多地进行应用层的开发,只是当找不到合适的驱动时,就会在现有驱动程序的基础上进行适当改写,以使其适应我们的硬件。

2Linux的文件结构

Linux下一切皆文件。在Linux系统中,除了像文本文档等传统文件是文件,各类设备也可以被映射成一个文件。通过对设备文件进行操作就可以实现对设备的操作。为此,了解Linux的文件结构极其重要。

2.1目录

目录是拿来保存其他文件节点(inode)号和名子的文件,目录文件中的每项数据都指向一个文件的节点,删掉一个文件就相当于删掉了目录文件中对应的节点项。

这么问题来了,哪些是文件的节点(inode)呢?文件节点虽然就是保存了文件的属性的一个东西,这种属性包括文件的创建/更改日期、访问权限、文件位置、文件厚度等等。Linux在找寻某文件或对,某个文件进行操作时,不是去找寻文件的名子,而是去找寻文件对应的节点。

Linux系统中最常用的目录之一就是家目录。Linux系统会为每位用户创建一个家目录。例如你的用户名叫neil,那你的家目录就是/home/neil/。好多Linux系统,例如Ubuntu,都容许用~符号取代用户的家目录。但是linux 虚拟主机,标准库函数不能辨识文件参数中的~符号,因而在程序中不要使用波浪线符号取代家目录。

所有目录的最顶楼是根目录。在它下边包含了储存系统程序的/bin目录、存放系统配置文件的/etc目录、存放系统函数库的/lib目录和储存代表化学设备的设备文件的/dev目录等等。

2.2文件和设备

在Linux中,设备可以被映射成一个文件。比如,我们可以使用以下命令将CD-ROM驱动挂载为一个文件:

mount -t iso9660 /dev/hdc /mnt/cdrom
cd /mnt/cdrom

这时我们步入到/mnt/cdrom下就可以查看CD-ROM中包含的目录,只不过其中的目录都是只读的。

Linux中有3个比较重要的设备文件:/dev/console、/dev/tty和/dev/null。

/dev/console

这个设备代表系统控制台。错误信息和确诊信息一般会被发到这个设备。

嵌入式linux应用层开发_嵌入式linux应用开发详解_嵌入式应用层开发做什么工作

/dev/tty

假如一个进程有控制终端的话,文件/dev/tty还会作为控制终端的别称。但对于系统手动运行的进程和脚本,它们就没有控制终端,不须要访问设备/dev/tty。

/dev/null

这个设备是“空”设备,所有写向这个设备的输出就会被遗弃,而读这个设备会返回一个文件尾标志。一般用于作复制空文件的源文件,或将不须要的输出重定向到此文件。

设备可以分为字符设备和块设备,二者的区别在于访问设备时是否须要一次读写一整块。字符设备一般是普通的设备,块设备一般是硬碟、SD卡等储存设备。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: dev linux系统 嵌入式linux 应用层 文件目录
最后更新:2023年9月11日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
如何在Linux系统中查看CPU信息使用lscpu命令行 linux服务器搭建ftp的6下安装vsftpd步骤及步骤 贵州工业职业技术学院求职意向期望工作地--诚聘英才 实验1Linux安装实验掌握虚拟机的使用 Linux系统tar命令的使用方法及使用命令教程 linux 开源nas系统 杰和科技NAS服务器媒体见面会在京召开 Android与Linux开发大不同 Linux系统软件安装包:自己动手,安装不用愁 车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
UNIX系统内核设计的基本原理及特点分析!! 开源软件最古老的笑话——阅读源代码-documenting Linux嵌入式开发的小白最常见的几个问题? 图解linuxlinux内核结构框图对内核框图有个总体的把握 Linux的软件安装方式进行汇总和安装的方式汇总 搜狗输入法Linux版更新v1.0.0018 如何利用VWware虚拟机安装centos系统(Linux)? 为什么我们还要使用一键DD重装/更换系统呢?? 1.Linux磁盘分区和目录Linux发行版本之间的差别很少? 学习JAVA必须得安装一下JDK(developmentkitjava开发工具包) 打开U盘什么文件都看不到小编总结了 Linux里swap的几种常见含义及解决办法!! 玩蛇网推荐图文教程:python列表Linux系统补全输出重定向历史记录 go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由 Linux桌面发行版的分类、如何选择? 如何入门嵌入式开发是什么?华妹告诉你! Linux网络操作系统的实训课程-##回答#2 苹果MacOSX系统刷新DNS的方法,你知道吗? Linux系统运维及项目正式上线自学linux视频教程推荐! 如何在linux上安装搜狗输入法进行解释,别忘了关注本站
标签聚合
操作 linux系统 文件目录 linux服务器 命令 应用 内核 文件 虚拟机 软件
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 78篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.