- 博客(14)
- 收藏
- 关注
原创 Linux应用开发之网络套接字编程
套接字(Socket)是计算机网络数据通信的基本概念和编程接口,允许不同主机上的进程(运行中的程序)通过网络进行数据交换。它为应用层软件提供了发送和接收数据的能力,使得开发者可以在不用深入了解底层网络细节的情况下进行网络编程,屏蔽了应用程序对底层协议的操作,使得应用程序使用网络进行数据传输变得更简便,使代码更容易维护。socket英文直译为“插座”,可以理解为应用层调用网络服务的接口。套接字主要由以下三个属性组成:网络地址:通常是IP地址,用于标识网络上的设备。端口号:用于标识设备上的特定应用或进程。
2025-05-29 16:38:48
985
原创 Linux线程同步之条件变量和信号量
本文系统介绍了线程同步机制中的条件变量和信号量。条件变量部分详细讲解了其工作原理及核心函数,包括pthread_cond_wait、pthread_cond_signal等,并附有示例代码演示线程同步实现。信号量部分区分了二进制信号量和计数信号量的应用场景,对比了有名信号量和无名信号量的特点及其API函数(如sem_init、sem_open等)。通过多个实际代码案例,展示了信号量在线程间和进程间同步的具体应用。全文最后总结了两种同步机制的选择原则和注意事项,为开发多线程/多进程程序提供了实用参考。
2025-05-27 11:36:59
1463
5
原创 Linux线程同步中的锁机制
当多个线程并发访问和修改同一个共享资源(如全局变量)时,如果没有适当的同步措施,就会遇到线程同步问题。这种情况下,程序最终的结果依赖于线程执行的具体时序,导致了竞态条件。竞态条件(race condition)是一种特定的线程同步问题,指的是两个或者以上进程或者线程并发执行时,其最终的结果依赖于进程或者线程执行的精确时序。它会导致程序的行为和输出超出预期,因为共享资源的最终状态取决于线程执行的顺序和时机。为了确保程序执行结果的正确性和预期一致,需要通过适当的线程同步机制来避免竞态条件。
2025-05-22 11:39:24
894
3
原创 Linux线程的创建、退出、线程池
Linux 中的线程是指轻量级的执行单元,相比于进程,具有以下特点:进程(Process)是正在执行的程序的实例。每个进程都有自己的地址空间、代码段、数据段和打开的文件描述符等资源。线程(Thread)是进程内的一个执行单元,它共享相同的地址空间和其他资源,包括文件描述符、信号处理等,但每个线程都有自己的栈空间。由于共享地址空间和数据段,同一进程的多线程之间进行数据交换比进程间通信方便很多,但也由此带来线程同步问题。同一进程的多线程共享大部分资源,除了每个线程独立的栈空间。
2025-05-21 13:35:53
848
原创 Linux应用开发之进程处理
上述共介绍了四种进程间的通信方式,分别为匿名管道,有名管道,共享内存和消息队列,其中匿名管道只能用于父子进程间的通信,因为其只能通过创建的文件描述符进行通信,只有父子进程之间可以继承到,其他进程无法获取到相关的资源。其余三种通信方式既可用于父子进程通信,也可以用作任何两个进程间的通信,因为他们都拥有一个唯一标识,会创建一个临时文件用于进程访问。还有另外一种可以用于进程间的通信方式,套接字,套接字一般用于网络通信,后续演变为进程间的一种通信方式,本文暂时不做介绍。
2025-05-20 17:24:36
1024
原创 C语言实现单/双向链表
单链表是每个元素多用一个位置来存放指向下一个元素的位置的指针。这样子从第一个元素可以找到第二个元素,第二个元素可以找到第三个元素,依此类推,所有的元素我们就都可以通过遍历而找到了。链式存储结构的元素除了要存储本身的值之外,还要存储一个指向后续元素的指针,这就是单链表,双链表多了一个指向上一个元素的指针。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为结点(Node)。
2025-05-16 23:14:43
728
1
原创 Linux应用层开发之文件I/O
fopen函数的原型为作用是打开一个文件并返回其文件指针。参数1:const char *__restrict __filename:表示打开的文件的路径,可以写相对路径/绝对路径参数2:const char *__restrict __modes:表示打开文件的方式,有读/写/追加写等(1)"r": 只读模式 没有文件打开失败(2)"w": 只写模式 若存在文件则会清空文件,不存在文件则创建新文件(3)"a": 只追加写模式 不会覆盖原有内容 新内容写到末尾,如果文件不存在则创建。
2025-05-16 15:42:25
883
1
原创 C++STL-list
list是C++的一个序列容器,插入和删除元素的效率较高,时间复杂度为常数级别,list容器的底层数据结构为带头双向循环链表,这使得 list的元素可以存储在非相邻的内存中,在list内部,不同元素之间通过指向前一个元素的指针以及指向后一个元素的指针相关联。删除迭代器iterator1指向的元素到iterator2指向元素之间的元素 包括iterator1指向的元素但不包括iterator2指向的元素,即擦除[iterator1,iterator2)。元素被插入到 iterator_pos指向的元素之前。
2025-05-13 16:38:17
575
原创 C++STL-set
头文件<set>包含set和multiset两种容器,分别是“有序集合”和“有序多重集合”,有序集合中的元素不可重复,有序多重集合可以包含多个相等的元素,两者都会将元素按从小到大的顺序排列。= / *解引用操作。查找set中值为data的元素的个数,由于set中元素各不相同,所以和find方法的效果类似(用于判断是否存在),存在返回true,不存在返回false。返回容器当前的大小(元素个数),set容器没有resize方法,因为元素各不相同,不允许重复,如果设置的大小大于当前容量,则多余的元素无法赋值。
2025-05-12 21:35:30
297
原创 C++STL-vector
vector在内存中以连续块存储元素,支持通过下标快速访问(时间复杂度为O(1))和修改,但使用下标修改的时间复杂度较高,一般采用尾部插入数据的方式,与静态数组不同,它可动态调整大小,自动处理内存分配与释放。赋值p为指向头部元素的迭代器,每次使p++,移动到了下一个元素,每次对p解引用可以得到当前位置元素的值,当p迭代到vec.end()时停止迭代。定义一个名为vec的vector类型容器,大小为m,各元素的值初始化为0。定义一个名为vec的vector类型容器,大小为m,各元素的值初始化为n。
2025-05-12 18:02:00
794
原创 stm32实现正弦、方波、三角波的波形识别
正弦波作为最基础的波形,可以组合产生任意波形,只包含一个和自己同频率的基波,不包含其他任何谐波分量,频谱图如下由于我使用的是复数傅里叶变换,所以频谱会有对称的现象。可以看到只包含一个频率分量也就是基波分量方波和三角波都是奇谐信号,只包含奇次谐波分量如三次、五次谐波,方波的基波幅度是三次谐波的三倍,三角波的基波幅度是三次谐波的九倍。而正弦波不包含谐波分量,这就是频谱法判断波形的关键。我们可以将傅里叶变换之后得到的基波幅度和三次谐波的幅度做比值,通过比值的大小即可判断不同的波形。
2025-04-11 18:03:57
1189
原创 STM32测量相位差
通道号,采样时间等可自由设置,采样时间可适当延长,要注意ADC频率和触发频率的关系,ADC采样一次要花费的时钟周期数为ADC位数+采样时间,触发频率不能高于ADC的时钟频率/采样一次花费的周期数,所以采样时间不可过长。2.将 ADC 设置为同步模式,本次选择常规同步模式,这样主 ADC 触发采样后,从ADC也会。开启两个 ADC 后,在哪个 ADC 的 MODE 中选择同步模式,哪个就是主 ADC,另。的相位差且采样到的信号保持原始相位。是主 ADC 的采样数据,高 16 位是从 ADC 的采样数据。
2025-04-11 15:30:18
429
原创 stm32的fir滤波器实现
本图中为低通滤波器,可以看到低于Fc=10800Hz的信号在经过该滤波器之后,其幅值并没有变化,高于10800Hz的信号在经过之后,幅值有非常大的衰减,也就是高于10800Hz的信号被滤除了。输入信号为粉色,5KHz的方波,其基波为5KHz的正弦,可以看到绿色信号是滤波之后留下的5KHz正弦波,其余谐波均高于10800Hz,已经被滤除。设计好滤波器之后,点击上方的目标-生成C头文件,导出为单精度浮点,就可以得到一个包含滤波器系数的h文件,将其复制到stm32的代码中使用。样也是显示频域特性的方法。
2025-04-11 15:08:31
672
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人