嵌入式学习(八)——嵌入式Linux设备应用层开发

姓名:李萌怡  学号:19020100103  学院:电子工程学院

转自:https://blog.csdn.net/weixin_44839882/article/details/108468131

【嵌牛导读】:嵌入式系统分为硬件层、驱动层、操作系统层和应用层。要深入学习嵌入式系统,应用层开发是非常重要的部分。

【嵌牛鼻子】:应用层  文件结构

【嵌牛提问】:Linux的文件结构分为哪几部分?

【嵌牛正文】

1 应用层与驱动层

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

#include<reg51.h>

#include<intrins.h>

#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开发的过程中,一般更多地进行应用层的开发,只是当找不到合适的驱动时,才会在现有驱动程序的基础上进行适当改写,以使其适应我们的硬件。

2 Linux的文件结构

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

2.1 目录

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

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

Linux系统中最常用的目录之一就是家目录。Linux系统会为每个用户创建一个家目录。比如你的用户名叫neil,那你的家目录就是/home/neil/。很多Linux系统,比如Ubuntu,都允许用~ 符号代替用户的家目录。然而,标准库函数不能识别文件参数中的~ 符号,因此在程序中不要使用波浪线符号代替家目录。

所有目录的最顶层是根目录。在它下面包含了存放系统程序的/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

这个设备代表系统控制台。错误信息和诊断信息通常会被发到这个设备。

/dev/tty

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

/dev/null

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

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

————————————————

版权声明:本文为CSDN博主「毕浩然」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_44839882/article/details/108468131

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容