0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux应用开发【第十五章】存储设备应用开发

weidongshan 来源:weidongshan 作者:weidongshan 2021-12-10 19:31 次阅读

文章目录

15 存储设备应用开发

15.1 SD/TF卡,U盘使用步骤

15.1.1 SD/TF卡,U盘的硬件接口

15.1.2 确定设备点

15.1.3 分区

15.1.4 格式化并挂载

15.1.5 介绍分区表

15.2 自动挂载U盘

15.2.1 udev规则

15.2.2 正则表达式

15.2.3 自动挂载U盘

15.3 挂载后就是一般的读写文件

15 存储设备应用开发

15.1 SD/TF卡,U盘使用步骤

15.1.1 SD/TF卡,U盘的硬件接口

poYBAGGzOn2AddR4AARnURvd8oI007.png

如上图的100ask6ull开发板,⑦为USB口,U盘从这里插入;⑱为mico sd卡槽,micro sd卡可以直接从这里插入。

注:micro sd卡也叫tf卡,它是sd卡类的一种,还有sd卡,mini sd卡等,我们简称这一类都叫sd卡。

15.1.2 确定设备点

①U盘确定设备点

下图是未插入U盘前/dev/目录下的内容

pYYBAGGzOn2Ae421AADE5V4fm3o229.png

当我们插入U盘后/dev/目录下的内容为下图

poYBAGGzOoOAA3xOAADMklaquQ0331.png

由这两幅图,可以清楚看到插入U盘后,/dev/目录下多了sda,sda1,很显然这两个东西就是和我们的U盘有关的。

当我们插入U盘linux系统一般都会提示该设备节点是哪个,下图就是当我们插入U盘后我们串口终端接收的信息,上面提示了有U盘插入,同时设备节点是sda

pYYBAGGzOoiAfDh1AABm4z7NQBQ695.png

sd表示这是个scsisata硬盘设备。

a:表示这是第一块硬盘,

1:这是这块硬盘的第一个分区,同时也是主分区。

根据以上内容,我们应该就能看出sda,sda1表示什么意思了。

sda表示整个U盘存储设备

sda1表示是sda的第一个分区。

②SD卡确定设备点

下图是未插入SD卡前/dev/目录下的内容

pYYBAGGzOn2Ae421AADE5V4fm3o229.png

当我们插入SD卡后/dev/目录下的内容为下图

poYBAGGzOo6AEcGEAADK2JowqqQ049.png

由这两幅图,可以清楚看到插入SD卡后,/dev/目录下多了mmcblk0,mmcblk0p1,很显然这两个东西就是和我们的SD卡有关的。

当我们插入sd卡,linux系统一般都会提示该设备节点是哪个,下图就是当我们插入sd卡后我们串口终端接收的信息,上面提示了有sd卡插入,同时设备节点是mmcblk0

pYYBAGGzOpSAZs8jAAAuqpfQfw4755.png

mmc 应该是 sd 的前身,所以sd与mmc 的驱动通用,于是Linux 就把设备节点名称延续下来了。

blk表示这是块设备,随后跟的数字是该设备的编号blk0,表示编号为0的块设备,区分块设备用的。

p表示是分区,p1 表示这是第一个分区。

根据以上内容,我们应该就能看出mmcblk0,mmcblk0p1表示什么意思了。

mmcblk0表示整个sd卡设备

mmcblk0p1表示这是sd卡设备的第一个分区。

15.1.3 分区

我们使用fdisk工具来分区,

执行fdisk /dev/mmcblk0后,输入m(进入菜单功能选项)进入 fdisk 画面:

poYBAGGzOpqAAfsjAADPdDZPljw706.png

常用的是:d l m p q t w命令

我们尝试利用剩余空间增加一个分区

此时按下w 就可以将分区信息存储到分区表中,并离开 fdisk;如果你决定这样的操作不对,也可以直接按下 q 取消刚刚的fdisk工具的所有动作,并退出fdisk。

15.1.4 格式化并挂载

上一小节,我们新建立了一个分区,我们的第二个分区为 /dev/mmcblk0p2 ,分区类型为 Linux ,此时我们可以mkfs.ext3 /dev/mmcblk0p2对其进行格式化

pYYBAGGzOqCABm9_AABiEQWZJG4182.png

此时我们可以用mount命令挂载该分区到我们想要的目录

mount -t ext3 /dev/mmcblk0p2 /mnt/

通过df –Th命令查看是否挂载成功。

poYBAGGzOqaAa4wSAAA-pMDwmSE037.png

当然我们也可以挂载mmcblk0p1这个分区,也是先指定某种文件系统格式化该分区,然后再用mount命令指定挂载的格式的同时挂载,最后df –Th命令查看是否挂载成功。

U盘的分区,格式化,挂载等操作和sd卡一致,只是将/dev/mmcblk0 变成了/dev/sda1。

15.1.5 介绍分区表

pYYBAGGzOqaARmfYAABDn64N2T0824.png

上图是利用fdisk 里的p功能字,打印分区表功能显示的。

Device:表示这是哪一个分区,这里表示是mmcblk0的的一个分区;

Boot:表示启动引导标志;

StartCHS:分区开始的柱面、磁头、扇区;

EndCHS:分区结束的柱面、磁头、扇区;

StartLBA:逻辑块地址起始位置;

EndLBA: 逻辑块地址结束位置;

Sectors: 扇区数量;

Size:分区大小。

Id与Type:成对出现,id表示文件系统类型编号,type表示文件系统类型标记

注:这里的Id与Type其实只是做个标记,并没有实际变成我们想要的文件系统格式,因此如果需要挂载时,还需要用mkfs相关命令的格式化为对应文件系统格式后再挂载。

15.2 自动挂载U盘

15.2.1 udev规则

udev是Linux(linux2.6内核之后)默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件。通过udev编写对应规则,实现设备节点变化时做出规定的动作,例如本节所说的热拔插实验、

udev常用的规则我们了解下。

1)规则文件中以 “#” 开头的行以及空行将被忽略;

2)规则文件必须以 .rules 作为后缀名,否则将被忽略; 3)规则文件分别位于: 系统规则目录(/usr/lib/udev/rules.d)、 运行时规则目录(/run/udev/rules.d)、 本机规则目录(/etc/udev/rules.d),/etc/ 的优先级最高、 /run/ 的优先级居中、 /usr/lib/ 的优先级最低,也就是说我们可以在本机规则目录(/etc/udev/rules.d)下添加新的规则,它优先级最高,如果存有低优先级的同类规则,也会被高优先级的新规则替换掉,规则文件开头的数字越小它的执行顺序越靠前。 4)"键"有两种类型:匹配与赋值。 如果某条规则的所有匹配键的值都匹配成功,那么就表示此条规则匹配成功, 也就是此条规则中的所有赋值键都会被赋予指定的值。

匹配类:

①“==”等于;

②“!=”不等于;

③“ACTION”匹配事件的动作,例如"add"表示插入一个设备;

④“KERNEL”匹配设备的内核名称,如sda;

⑤“SUBSYSTEM” 所属的子系统。例如"sound"或"net"等。

赋值类:

①“=”,为键赋予指定的值;

②“LABEL”设置一个可用作 GOTO 跳转目标的标签

③“GOTO” 跳转到下一个匹配的 LABEL 标签所在的规则;

④“RUN”{类型}对于每一个设备事件来说,在处理完规则之后,都可以再接着执行一个程序列表(默认为空)。 不同的"类型"含义如下:“program"一个外部程序, 如果是相对路径, 那么视为相对于 /usr/lib/udev 目录。 否则必须使用绝对路径。如果未明确指定"类型”, 那么这是默认值。"builtin"与 program 类似,但是仅用于表示内置的程序。程序名与其参数之间用空格分隔。 如果参数中含有空格,那么必须使用单引号(’)界定。仅可使用运行时间非常短的前台程序, 切勿设置任何后台守护进程或者长时间运行的程序

如需更加详细关于udev内容可以参考这两篇文章《udev 中文手册 [金步国]》,《Writing udev rules.html》文章链接已保存在本章对应目录下。

15.2.2 正则表达式

在udev的设备匹配上用到正则表达式,我们大致了解下,如需更加详细的内容可以参考这篇文章《正则表达式30分钟入门教程》,文章链接已保存在本章对应目录下。

①在电脑上查找文件,如果需要找‘.c’文件,我们通常会用‘*.c’就可以查找全部的‘.c’文件,如下图

poYBAGGzOqeAP_KBAABWXjYyzQ0545.png

这里使用的 * 就是通配符,表示任意字符。

②如果我们想要更加精确的表达的话就无能为力了,因此引入了正则表达式。

·:表示任意字符(换行符除外);

*:表示重复0次或更多次;

+:表示重复1次或更多次;

?:表示重复0次或1次;

[~]:表示这里面的字符里的某一个,例如[abc]表示abc中的其中一个,[1-9]表示1至9的其中一个。

例如leds?[1-3],其中s?表示s出现0次或者1次,[1-3]?表示1至3的某一个,出现0次或1次,根据以上信息匹配的结果就是leds,led1,led2,led3。我们通过一个语句就匹配了4个设备,多么简练。

15.2.3 自动挂载U盘

①创建用于挂载U盘的目录

mkdir /mnt/usb –p

②在/etc/udev/rules.d目录下添加用于检测U盘插入规则(add),终端下执行以下命令创建第一个U盘插入规则。

vim /etc/udev/rules.d/11-add-usb.rules

在11-add-usb.rules中添加如下内容:

ACTION!="add",GOTO="END" KERNEL=="sda[0-9]",RUN+="/etc/mount-usb.sh %k" LABEL="END"

上面的内容意思是:如果不是add添加事件,那么就跳到END标签处结束,如果是add事件那么执行以下规则,如果添加的设备是sda0至sda9中任意一个,那么就执行RUN后面的内容,此处是一个脚本,一个挂载U盘的脚本,它还带有个参数%k,表示kernel的值。

然后在/etc/目录下创建mount-usb.sh脚本

在mount-usb.sh中添加如下内容:

#!/bin/sh mount -t vfat /dev/$1 /mnt/usb sync

上面的内容意思是:#!/bin/sh表示是脚本文件,按脚本文件解析,mount -t vfat /dev/$1 /mnt/usb表示按vfat格式将/dev/$1挂载到/mnt/usb目录下,其中这里的$1就是之前规则里传入进来的%k,也就是kernel值。Sync表示同步U盘数据。

最后记得给脚本文件添加执行权限。

chmod +x /etc/mount-usb.sh

③在/etc/udev/rules.d目录下添加用于检测U盘移出规则(remove),终端下执行以下命令创建第U盘移出规则。

vim /etc/udev/rules.d/11-remove-usb.rules

在11-remove-usb.rules中添加如下内容:

ACTION!="remove",GOTO="END" KERNEL=="sda[0-9]",RUN+="/etc/umount-usb.sh %k" LABEL="END"

上面的内容意思是:如果不是remove添加事件,那么就跳到END标签处结束,如果是remove事件那么执行以下规则,如果移出的设备是sda0至sda9中任意一个,那么就执行RUN后面的内容,此处是一个脚本,一个卸载U盘的脚本,它还带有个参数%k,表示kernel的值。

然后在/etc/目录下创建umount-usb.sh脚本

在umount-usb.sh中添加如下内容:

#!/bin/sh sync umount /mnt/usb

上面的内容意思是:#!/bin/sh表示是脚本文件,按脚本文件解析,先同步U盘数据,然后再卸载,其中这里的$1就是之前规则里传入进来的%k,也就是kernel值。

最后记得给脚本文件添加执行权限。

chmod +x /etc/umount-usb.sh

④设置好规则后,当我们插入U盘,执行df –Th就会显示如下图

pYYBAGGzOqeAYXpAAAA8jXdUB6I913.png

表明/dev/sda1已经成功挂载在/mnt/usb目录下了。

注1: vfat格式也就是fat32格式,使用vfat格式是由于windows操作系统与linux操作系统都支持,这样U盘就可以在windows操作系统与linux操作系统之间作为交换文件的介质。

注2:Linux 系统中欲写入U盘等存储介质内时,有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲真正的写入U盘等存储介质内需要执行sync 指令,它会将存于 buffer 中的数据强制写入U盘等存储介质内,这也是为什么脚本里在要加入sync的原因。

15.3 挂载后就是一般的读写文件

成功挂载后,我们就可以在挂载目录下进行创建,修改等文件操作,就等同于操作U盘上的文件。

poYBAGGzOqiAHE8YAAAqpfAMeIk728.png

如上图,我们在终端使用以下命令创建两个文本文件。touch /mnt/usb/111.txt touch /mnt/usb/222.txt

然后再拔出U盘,插到电脑中查看是否存在111.tx与222.txt

pYYBAGGzOqiADGM5AABLXSoWhQ4081.png

我们可用在上面添加些内容,然后再插入开发板,查看电脑上修改的内容在开发板上是否显示。在111.txt中添加abc,在222.txt中添加100ask,保存,弹出U盘,插入开发板。 通过cat命令查看内容,如下图

poYBAGGzOqiABaaQAAAnVHnNiXM111.png

显示的内容正确,以后我们就可以通过U盘把电脑的东西往开发板上搬了。

审核编辑黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11306

    浏览量

    209555
  • 存储设备
    +关注

    关注

    0

    文章

    164

    浏览量

    18591
收藏 人收藏

    评论

    相关推荐

    罗德与施瓦茨亮相第十五届亚洲电源技术发展论坛

    近日,罗德与施瓦茨(以下简称R&S)RT-ZISO 隔离测量系统亮相第十五届亚洲电源技术发展论坛。R&S示波器产品经理蔡恺波发表《新一代隔离探测系统为宽禁带功率电子设计提供解决方案》主题演讲,分享RT-ZISO领先的产品能力以及相关测试技术洞察。
    的头像 发表于 12-18 11:26 295次阅读

    龙腾半导体第十五届亚洲电源技术发展论坛精彩回顾

    近日,第十五届亚洲电源技术发展论坛在深圳湾万丽酒店圆满结束。龙腾半导体全程参与了这场汇聚行业精英与前沿技术的电源盛会:不仅精彩展示了最新产品和技术成果,还荣获“国产功率器件行业卓越奖”,赢得了市场的广泛关注与高度认可。
    的头像 发表于 12-10 11:52 254次阅读

    深度参与,共话未来 —— 吹田电气亮相第十五届亚洲电源技术发展论坛

    在这个金秋时节,吹田电气带着对电源技术的无限热爱与追求,我们启程前往第十五届亚洲电源技术发展论坛的盛会。在这场汇聚了行业精英、学者与前沿技术的盛会中,我们不仅仅见证了电源技术的最新进展,更与众多同行
    的头像 发表于 12-09 16:58 326次阅读
    深度参与,共话未来 —— 吹田电气亮相<b class='flag-5'>第十五</b>届亚洲电源技术发展论坛

    慧能半导体邀您相约第十五届亚洲电源技术发展论坛

    第十五届“亚洲电源技术发展论坛”将于12月7日在深圳湾万丽酒店3F隆重举办。本次会议再度升级,全面打造4大会场,包含半导体芯片、功率器件、被动元件、测试测量、检测认证等多个技术方向,涉及小功率、高功率、消费类电子、汽车、工业、5G、光伏储能等多产品应用领域。
    的头像 发表于 12-04 10:46 286次阅读

    海格通信亮相第十五届中国国际航空航天博览会

    近日,第十五届中国国际航空航天博览会在珠海举行,向公众展示当今国际航空航天业先进科技主流和发展水平。海格通信(SZ 002465)携系列新产品及解决方案参展,展示了公司在低空经济、无人智造、模拟仿真、卫星互联网、北斗导航、车路云一体化等创新成果。
    的头像 发表于 11-13 10:08 344次阅读

    四创电子即将亮相第十五届中国国际航空航天博览会

    第十五届中国国际航空航天博览会 (珠海航展) 将于2024年11月12日在广东珠海国际航展中心盛大开幕,现场将带来一场“空、天、海、陆”尖端设备的动态演示盛宴。
    的头像 发表于 11-11 09:44 364次阅读

    迅为iTOP-RK3568开发板驱动开发指南-第十八篇 PWM

    第七期_设备树 第八期_设备树插件 第九期_设备模型 第十期_热插拔第十一期_pinctrl子系统
    发表于 10-29 10:13

    《DNK210使用指南 -CanMV版 V1.0》第二十五章 LCD图片显示实验

    第二十五章 LCD图片显示实验 本章将介绍在LCD上的图片显示。通过本章的学习,读者将学习到LCD上图片的显示。本章分为如下几个小节:25.1 lcd模块介绍25.2 硬件设计25.3 程序设计
    发表于 10-23 09:34

    《DNK210使用指南 -CanMV版 V1.0》第十五章 按键中断实验

    第十五章 按键中断实验 本章实验将介绍如何使用CanMV让Kendryte K210通过中断的方式获取板载按键的状态。通过本章的学习,读者将学习到在CanMV下Kendryte K210的GPIO
    发表于 10-12 09:20

    文档更新 | 迅为RK3568驱动指南-第十七篇(串口)

    时序编写 第163 DS18B20驱动温度读取编写 163.4 运行测试 第164 DS18B20驱动使用ioctl设置分辨率 第165 DS18B20驱动使用ioctl读取分辨率 ✦
    发表于 09-24 10:42

    【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第五 Ubuntu使用apt-get下载

    【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第五 Ubuntu使用apt-get下载
    的头像 发表于 09-03 16:26 794次阅读
    【北京迅为】《stm32mp157<b class='flag-5'>开发</b>板嵌入式<b class='flag-5'>linux</b><b class='flag-5'>开发</b>指南》第五<b class='flag-5'>章</b> Ubuntu使用apt-get下载

    嵌入式linux开发的基本步骤有哪些?

    之前,首先需要选择合适的硬件平台。硬件选择需要考虑以下几个方面: 1.1 处理器 嵌入式Linux开发需要一个处理器,常见的处理器有ARM、MIPS、PowerPC等。选择处理器时,需要考虑处理器的性能、功耗、成本等因素。 1.2 存储
    的头像 发表于 09-02 09:11 498次阅读

    Linux 驱动开发与应用开发,你知道多少?

    一、Linux驱动开发与应用开发的区别开发层次不同:Linux驱动开发主要是针对硬件
    的头像 发表于 08-30 12:16 794次阅读
    <b class='flag-5'>Linux</b> 驱动<b class='flag-5'>开发</b>与应用<b class='flag-5'>开发</b>,你知道多少?

    文档更新 |迅为 RK3568开发板驱动指南-第十五/十六篇

    分辨率 ✦ 第十五篇 I2C 第166 初步认识I2C 166.1 I2C总线的由来 166.2 I2C硬件连接 166.3 I2C基础知识 166.4 iTOP-RK3568开发板上的I2C接口
    发表于 07-08 11:04

    精训促能 | 古瑞瓦特第十五期授权运维培训会圆满成功!

    精训促能 | 古瑞瓦特第十五期授权运维培训会圆满成功! 近日,为期3天的古瑞瓦特第十五期授权运维培训会圆满落幕。期间,多位学员齐聚山东济南,共同剖析光储运维问题,交流产品技术细节,切实提高光储运维
    的头像 发表于 06-07 20:22 299次阅读
    精训促能 | 古瑞瓦特<b class='flag-5'>第十五</b>期授权运维培训会圆满成功!