Linux应用开发
文章平均质量分 76
凛冬将至__
嵌入式软件开发(驱动开发),文章内容主要为个人学习整理,偏向于实际应用
展开
-
深入理解阻塞与非阻塞、同步与异步
阻塞与非阻塞、同步与异步,这几个概念虽然每次看都能看的懂,但是过一段时间又会忘掉,所以系统的整理一下他们的区别,也方便自己后面忘掉的时候快速记忆,虽然网上有很多的说明这些概念的帖子,但是每次去找到能让自己明白的帖子也是一件不容易的事。原创 2023-07-18 23:06:27 · 162 阅读 · 0 评论 -
mmap与ioremap
4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。原创 2023-07-22 10:11:51 · 904 阅读 · 0 评论 -
基于IO多路复用的TCP、UDP
基于IO多路复用的TCP、UDP原创 2023-05-22 19:56:40 · 129 阅读 · 0 评论 -
Linux 线程基础
8、一个进程中的多个线程共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户 ID、用户组 ID。4、由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,在同一个进程中创建的线程共享该进程的地址空间。4、由于进程之间相互独立,线程共享同一进程下的资源,所以多进程的稳定性比多线程高,且多进程的资源量比多线程高。3、创建子进程的时候需要克隆父进程的所有资源,而创建线程不需要克隆资源,因为本身就共享同一进程下的资源。线程和进程都参与统一的调度。原创 2023-05-20 17:19:46 · 808 阅读 · 0 评论 -
进程间通信:信号
2、信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来 通知 用户空间进程发生了哪些系统事件。5.2.3中,提到了可以用子进程在退出的时候,给父进程发送一个SIGCHLD信号,来回收僵尸进程。3、如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它。4、如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。自定义信号处理函数,当信号发生的时候,立即执行自定义信号处理函数。3、执行缺省操作(执行默认操作)原创 2023-05-18 22:31:31 · 412 阅读 · 0 评论 -
Linux应用开发:网络编程(TCP、UDP)
Linux应用开发:socket原创 2023-05-13 17:27:32 · 709 阅读 · 0 评论 -
setsockopt的常用选项
(4)在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步),系统默认的状态发送和接收一次为8688字节(约为8.5K);打开这个功能后,内核在val时间之类还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。从三次握手上讲,就是设置这个状态之后,就算完成了三次握手,服务器socket状态也不是ESTABLISHED,而依然是 SYN_RCVD,不会去接收数据。注:此文原链接为,由于写的很好,我怕此文挂掉,所以抄了一份。原创 2023-05-13 15:37:36 · 605 阅读 · 0 评论 -
Linux应用开发:线程间通信(同步互斥机制)(互斥锁、条件变量、信号量)
互斥锁主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作,一个线程等待“条件变量的条件成立”而挂起,另一个线程使“条件成立” (给出条件成立信号 )并唤醒挂起线程。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。对条件的测试是在互斥锁(互斥)的保护下进行的。原创 2023-05-11 17:28:02 · 948 阅读 · 0 评论 -
Linux应用开发:进程间通信 System V
1、共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝2、为了在多个进程间交换信息, 内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。3、由于多个进程共享一段内存,因此也需要依靠某种同步机制,如 互斥锁 和 信号量 等。1、消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。2、消息队列可以按照类型来发送接收消息。原创 2023-05-07 22:40:43 · 628 阅读 · 0 评论 -
Linux驱动开发:SPI子系统
SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC 的 SPI 控制器接口。样。和 I2C适配器驱动一样,SPI主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC的使用者,这一部分的驱动就不用操心了。原创 2023-05-07 11:58:53 · 2593 阅读 · 2 评论 -
Linux驱动开发:I2C子系统
I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。在Linux 内核中 I2C 的体系结构分为3 个部分:1、I2C 核心:I2C 核心提供了I2C 总线驱动和设备驱动的注册、注销方法等。2、I2C 总线驱动:I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现,适配器可由 CPU 控制,甚至可以直接集成在CPU 内部。一般SOC 的 I2C 总线驱动都是由半导体厂商编写的,不需要用户去编写。原创 2023-05-06 22:41:39 · 1321 阅读 · 0 评论 -
Linux驱动开发 IO模型:非阻塞IO
当应用程序发起读取数据(read)的时候,不管数据有没有准备好,read函数都应该立即返回。如果数据准备好了,立即返回数据,如果没有准备好,返回错误码。原创 2023-04-16 10:35:29 · 166 阅读 · 0 评论 -
Linux驱动开发:platform总线驱动
/定义在linux/module.h中使用时,参数如下:of:总线类型match_table:idtable数组首地址。原创 2023-05-06 14:20:42 · 1653 阅读 · 0 评论 -
Linux驱动开发 IO模型:异步通知IO
在进程中注册一个信号处理函数,如果硬件的数据准备好的时候,会产生中断,在中断处理函数中给这个进程发送信号即可。如果内核没有发出信号应用程序,不需要阻塞,运行自己特有的代码即可。本来也要在中断处理函数中发送,此处同样的也是在write函数中发信号。2、通过fcntl调用到底层的fasync函数。3、将当前进程号告诉内核。1、注册信号处理函数。原创 2023-04-18 11:42:46 · 487 阅读 · 0 评论 -
Linux驱动开发 IO模型:阻塞IO
当应用程序发起读取数据(read)的时候,如果数据没有准备好,就会阻塞等待(进程休眠),如果与硬件的数据准备好了,就会产生硬件中断,在中断处理函数中唤醒休眠的进程,然后将准备好的数据拷贝至用户空间。原创 2023-04-16 13:26:50 · 355 阅读 · 0 评论 -
Linux驱动开发 IO模型:多路复用(select/poll/epoll)
在同一个APP应用程序同时监听多个硬件的数据,此时就需要使用I0多路复用机制中的select/poll/epoll来完成多个文件描述符的监听的过程,如果所有的文件描述符对应的数据都没有准备好,进程休眠。3. epoll当在休眠的时候,如果有驱动的数据准备好,epoll能 直接拿到准备好的文件描述符,不需要遍历,效率高。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。原创 2023-04-17 18:12:46 · 754 阅读 · 0 评论