Linux驱动开发之阻塞与非阻塞IO
简述
在Linux内核中,I/O操作可以是阻塞或非阻塞的。
阻塞I/O是指进程在进行I/O操作时会一直等待直到操作完成。在这种情况下,进程会被挂起,直到I/O操作完成。这种方式可以确保操作的完整性,但可能会导致进程长时间等待,从而影响应用程序的响应速度。
非阻塞I/O是指进程在进行I/O操作时不会一直等待,而是立即返回。如果I/O操作还没有完成,则进程可以继续执行其他操作。这种方式可以提高应用程序的响应速度,但可能会导致I/O操作不完整或错误。关系如下:
在Linux内核中,可以使用select、poll、epoll等系统调用来实现非阻塞I/O。这些系统调用可以监视多个文件描述符,并在其中任何一个变为“就绪”时通知进程。这样,进程可以在I/O操作完成之前继续进行其他操作,而...
Linux驱动开发之并发控制
概述
并发(Concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(Race Conditions)。
在Linux内核中,主要的竞态发生于如下几种情况:
对称多处理器(SMP)的多个CPU
单CPU内进程与抢占它的进程
中断(硬中断、软中断、Tasklet、底半部)与进程之间
解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。访问共享资源的代码区域称为临界区(Critical Sections),临界区需要被以某种互斥机制加以保护.以下是一些实现并发...
Linux驱动开发之字符设备
驱动结构
结构如图:
cdev结构体
在Linux内核中,cdev结构体是表示字符设备的结构体之一。字符设备是一种特殊类型的设备,它以字符为单位进行输入和输出,例如终端、串口等。
cdev结构体用于表示字符设备,它包含了所有与该设备相关的信息和属性。cdev结构体定义在头文件<linux/cdev.h>中,其定义如下:
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
...
Linux驱动开发之设备文件
devfs
devfs是一种特殊的文件系统,用于在Linux内核中管理设备文件。在早期版本的Linux内核中,设备文件是通过手动创建和管理的,但是随着系统设备数量的增加,这变得越来越困难。
devfs解决了这个问题,它是一种动态的文件系统,可以自动创建和删除设备文件。当一个设备被添加到系统中时,devfs会自动为其创建一个设备文件,并在设备被删除时删除该文件。
devfs的优点包括:
简化设备文件的管理
允许设备文件的动态创建和删除
提高系统的可靠性和稳定性
但是,devfs在现代Linux内核中已经被udev取代,因为udev提供了更多的功能和灵活性。因此,如果您正在使用最新版本的Linux内核,您不需要了解devfs的详细信息。
udev
udev是L...
Linux驱动开发之文件系统
简介
Linux系统中采用的文件系统有很多种,以下是一些常用的文件系统:
ext4:是Linux系统中使用最广泛的文件系统,支持文件大小高达1EB(EB级别的文件系统尚未被广泛使用)。它支特数据日志和元数据日志,提供了更好的文
件系统稳定性。
XFS:是一种高性能的日志文件系统,适用于大容量文件系统和强烈的/○操作。它支特高速读取和写入,可以处理大量的小文件和大文件
Bts:是一种新的文件系统,支持快照、压缩、多设备、白动修复等功能。它是一个多用途的文件系统,可以适用于很多场景。
NTFS:是一种Windows系统中常用的文件系统,Linux系统中也可以读取和写入NTFS文件系统。但由于其专有技术,Linux系统不能直接使用NTFS文件系统。
FAT32:是一...
Linux驱动开发之内核模块
一、简介
在Linux系统中,内核模块是指一段可加载的代码,可以动态地插入(移除)到内核中,以扩展或修改内核的功能。内核模块是Linux内核的一个重要组成部分,它们允许用户或开发人员在不重新编译整个内核的情况下修改或扩展内核功能。内核模块可以实现许多功能,例如添加文件系统、设备驱动程序、网络协议栈等。它们通常编写在C语言中,并使用内核AP进行偏程。内核模块的代码必须遵循内核的编程规范,并且必须经过内核源代码的编译和链接才能成为可加载的内核模块。内核模块可以通过命令行或在系统启动时自动加载。一旦内核模块被加载,它会在内核中创建个新的模块对象,并将其添加到内核模块列表中。内核模块可以通过内核模块接口与内核进行通信,例如获取内核参数、注册设备驱动程序等。总之,内核模块是Linux系统中一个...
cmake之string命令
string
查找
string(FIND <string> <substring> <output_variable> [REVERSE])
在中查找,返回值存放于,找到则返回在中的下标,找不到返回-1。默认为首次出现的匹配,如果使用了REVERSE则为最后一次匹配。注:下标从0开始,以字节做为单位,因此遇到中文时下标表示字符编码第一字节的位置。
替换
string(REPLACE <match_string> <replace_string>
<output_variable> <input> [<input>...])
从所有 …中查找并使用替换,替换后的字符串存...
qemu搭建Linux学习环境
背景
最近在学习Linux的内核驱动,就想在Linux环境下搭建一个运行Linux的环境。了解到qemu可以满足我的需求,就折腾了一下。
参考1
参考2
环境
VM虚拟机
Ubuntu 20.04
安装
vm虚拟机和Ubuntu安装
参考链接
vbox虚拟机和ubuntu安装
参考链接
相关工具链
命令行终端下输入:
sudo apt-get update
sudo apt-get install -y git gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev ...
音频编码之Opus
概述
Opus是一个有损音频压缩的数字音频编码格式,由Xiph.Org基金会开发,之后由互联网工程任务组(IETF)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。
Opus集成了两种声音编码的技术:以语音编码为导向的SILK和低延迟的CELT。Opus可以无缝调节高低比特率。在编码器内部它在较低比特率时使用线性预测编码在高比特率时候使用变换编码(在高低比特率交界处也使用两者结合的编码方式)。Opus具有非常低的算法延迟(默认为22.5 ms),非常适合用于低延迟语音通话的编码,像是网络上的即时声音流、即时同步声音旁白等等,此外...
音频编码之MP3
概观
MP3是一个数据压缩格式。它舍弃脉冲编码调制(PCM)音频数据中,对人类听觉不重要的数据(类似于JPEG,是一个有损图像的压缩格式),从而达到了压缩成小得多的文件大小。
在MP3中使用了许多技术,其中包括心理声学,以确定音频的哪一部分可以丢弃。MP3音频可以按照不同的比特率进行压缩,提供了权衡数据大小和音质之间的依据。
MP3格式使用了混合的转换机制将时域信号转换成频域信号:
32波段多相积分滤波器(PQF)
36或者12 tap 改良离散余弦滤波器(改进的离散余弦变换);每个子波段大小可以在0…1和2…31之间独立选择
混叠衰减后处理
尽管有许多创造和推广其他格式的重要努力,如 MPEG 标准中的 AAC(Advanced Audio Coding)和...
音频编码之AAC
概述
高级音频编码 (英语:Advanced Audio Coding,AAC)是有损音频压缩的专利数字音频编码标准,由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年,为一种基于MPEG-2的标准,2000年,MPEG-4标准在原本的基础上加上了PNS(Perceptual Noise Substitution)等技术,并提供了多种扩展工具。为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。其作为MP3的后继者而被设计出来,在相同的比特率之下,AAC相较于MP3通常可以达到更好的声音质量 ^[2]^ 。
AAC由国际标准化组织及国际电工委员会标准化为MPEG-2及MPEG-4规格的一部分。 ^[3]^ ^[...
音频基础知识
概述
声音的本质是空气压力差造成的空气振动,振动产生的声波可以在介质中快速传播,当声波到达接收端时(比如:人耳、话筒),引起相应的振动,最终被听到。
两个基本属性:
振幅。声音的振幅就是音量。
频率。频率的高低就是音调,频率的单位是赫兹(Hz)。
当声波传递到话筒时,话筒里的碳膜会随着声音一起振动,而碳膜下面是一个电极,碳膜振动时会触碰电极,接触时间的长短跟振动幅度有关(即:声音响度),这样就完成了声音信号到电压信号的转换。后面经过电路放大后,就得到了模拟音频信号。
模拟音频:用连续的电流或电压表示的音频信号,在时间和振幅上是连续。过去记录的声音都是模拟音频,比如:机械录音(以留声机、机械唱片为代表)、磁性录音(以磁带录音为代表)等模拟录音方式。
计算机...
代码检查工具cppcheck的安装及使用
简介
官方网站:http://cppcheck.net/
Cppcheck 是用于 C/C++ 代码的静态分析工具。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码构造。目标是实现很少的误报。Cppcheck旨在能够分析您的C / C++代码,即使它具有非标准语法(在嵌入式项目中很常见)。
安装
Windows
下载安装包安装即可。下载地址:http://cppcheck.net/
Linux
Cppcheck can also be installed from various package managers; however, you might get an outdated version then.
Debian
sudo apt-ge...
vscode配置qt开发环境
背景
因为个人感觉QT Creator使用起来没有VSCode顺手, 故网上查找了一下,在VSCode中搭建QT开发环境的方法。因为QT5过后支持使用CMake构建项目,所以在VSCode中也可以使用CMake构建QT项目。
以下并非原创,只是记录过程,方便自己日后翻阅。文章来自于CSDN博客
测试环境
QT 5.14.2(MinGW 7.3.0 64bit)
CMake 3.19.1
Visual Studio Code 1.63.2
软件&插件安装
软件安装
QT Creator安装
Visual Studio Code安装
VSCode插件安装
在扩展商店搜索插件,点击安装即可
C/C++扩展
CMake
...
shell教程
shell
教程链接
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编...
linux下非特权用户安装软件
Linux下非特权用户安装软件
下载源码
编译可执行程序
设置用户环境变量
安装tree
# 下载源码
wget http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
# 解压
tar zxvf tree-1.7.0.tgz
# 编译
cd tree-1.7.0
make
# 设置环境变量
vi ~/.bashrc
# 添加内容
export PATH=/home/user/tree-1.7.0:$PATH
# 生效
source ~/.bashrc
安装 ncurses-devel
# 下载
wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar...
linux下网络编程
网络编程
通信协议
TCP协议
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。即客户端和服务器之间在交换数据之前会先建立一个TCP连接,才能相互传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
TCP的优点 :可靠,稳定 ,TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
TCP的缺点 :慢,效率低,占用系统资源高,易被攻击 ,TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有...
linux下IO多路复用
I/O多路复用
Linux下select详解
select、poll和epoll优缺点和比较
IO模型:
同步阻塞IO(Blocking IO)
同步非阻塞IO(Non-blocking IO)
IO多路复用(IO Multiplexing)
异步IO(Asynchronous IO)
信号驱动IO(Signal Driven IO)
IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;
一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;
没有文件句柄就绪就会阻塞到超时timeout退出或者一直阻塞。
select
概述
允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个时间发生或经历一段指...
json简析
概述
JSON是 JavaScript Object Notation的缩写,它是一种数据交换格式。也是 JavaScript的一个子集,表示对象。
JSON 是存储和交换文本信息的语法,类似于 XML ,但是它比 XML更小,更快,更易解析。
JSON 规定字符集必须是 UTF-8,字符串必须用双引号 “”,Object的键也必须用双引号 ""。
因为 JSON有着上面的规定,使得 JSON在其它编程语言也可以轻易解析。
JSON vs XML
相同之处:
JSON 和 XML 数据都是 “自我描述” ,都易于理解。
JSON 和 XML 数据都是有层次的结构
JSON 和 XML 数据可以被大多数编程语言...
共计 90 篇文章,5 页。