自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1092)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

原创 Linux系统软件工程师/嵌入式Linux应用开发工程师 知识体系构建 500篇(持续更新)

今年受疫情影响,企业经营必不可免地受到冲击,企业在选人用人方面比以往都更加谨慎,招聘也更加苛刻。hr都试图用最低的成本去招最优秀的人才。本人从事嵌入式软件开发多年,结合自己的经验,推出了《嵌入式软件工程师技术面专题》,预计会有40篇,分成硬件协议、多进程多线程编程、网络编程、linux基础、C/C++等几大模块,每一篇在末尾都总结了相关提问,其中有些知识,即使是工作了两三年的同学也未必都懂,所以社招的同学也可以看,对于找工作绝对有帮助。**不打无准备之战,提前做好准备,方可立于不败之地**。欢迎大家订阅,只

2020-09-13 11:12:01 50471 73

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(3) 守护进程

守护进程(daemon),是一种运行在后台 的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制

2020-08-17 09:21:18 3650 4

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(4) 进程同步和通信的方式有哪些?

🥇 作者简介: 热衷于知识探索和分享的技术博主。💂 csdn主页::【✍️ 微信公众号:【🎉精彩专栏:🎓 【​ 🧡 【​ 📚【​ 🌎【✍️ 【​ …💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。然而,对于技术的探索和追求从未停歇。💪坚持创作,热衷分享,初心未改,继往开来!

2020-08-16 16:27:48 11171 3

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(15) 内核空间、用户空间、内核态、用户态

为了保证用户进程不能直接操作内核,保证内核安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。针对Linux操作系统,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为内核空间,而较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。对于校招而言,该问题提问几率较大,因为是基础性问题,考察对内核空间和用户空间的理解,进程的内核态和用户态等概念。),进程切换时,用户空间切换,内核空间不变。

2020-08-16 16:18:39 15171 2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(13) 请你描述下进程虚拟内存空间布局

对于这个问题,面试官可能拿出一张白纸,让你尝试画出linux下进程的虚拟内存空间布局,然后=再让你简述下每个分区的作用,可能会挑几个重点分区,例如堆区、栈区来进行深入展开,考察你对堆栈的理解等等。文章目录1 内核空间2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 BSS段6 数据段(Data)7 代码段(text)8 保留区问题提问在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4

2020-08-16 16:00:34 2014 2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(1) 进程和线程的基本概念与区别

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread)是操作系统能够进行调度的最小单位。它被包含在进程之中,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

2020-08-15 12:59:17 3267 2

原创 Linux C/C++ or 嵌入式面试之《网络编程系列》(4) tcp四次断开若干问题

首先A向B发送一个FIN报文段,报文段首部FIN=1,序列号seq=u(u为最后传送的数据的序列号加1,因为tcp规定,fin包消耗一个序列号,虽然没有发送数据),然后A进入FIN-WAIT-1(终止等待1)状态。(2)B收到释放连接的报文段后即发出确认报文段,报文首部ACK=1,ack=u+1,seq=v(v等于B前面传送过的数据的序列号加1),然后B进入CLOSE-WAIT(关闭等待)状态。(3)当A收到B的确认报文后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

2020-08-15 12:52:33 14838 2

原创 cmake基础教程(12)函数和宏用法

参考:https://cmake.org/cmake/help/latest/command/function.htmlhttps://cmake.org/cmake/help/latest/command/macro.html#command:macro在CMake中,函数和C或C++中的函数非常相似。你可以将参数传递给函数,它们在函数内部变成了变量。同样,一些标准变量如 ARGC、ARGV、ARGN,以及 ARGV0、ARGV1 等也被定义了。函数调用具有动态范围。在函数内部,你处于一个新的变量作用域;

2024-04-10 14:08:47 250

原创 boost共享内存使用(3)managed_shared_memory共享内存分配器

Boost.Interprocess提供了一些基本的类来创建共享内存对象和文件映射,并将这些可映射的类映射到进程的地址空间中。然而,管理这些内存段对于非平凡的任务来说并不容易。一个映射区域是一个固定长度的内存缓冲区,动态创建和销毁任何类型的对象需要大量的工作,因为这将需要编写一个内存管理算法来分配该段的部分。许多情况下,我们还希望将名称与在共享内存中创建的对象关联起来,以便所有进程都可以使用名称找到该对象。

2024-04-06 21:12:05 950

原创 boost共享内存使用(1)认识shared_memory_object和mapped_region

shared_memory_object类是boost库中用于创建和管理共享内存对象的类。它提供了一种在多个进程之间共享数据的方法,允许这些进程共享同一块内存区域。主要作用包括:创建共享内存对象:可以使用shared_memory_object类来创建一个新的共享内存对象。通过指定名称、大小和访问权限等参数,可以创建一个新的共享内存区域。打开现有的共享内存对象:如果共享内存对象已经存在,可以使用shared_memory_object类来打开它。通过指定名称和访问权限等参数,可以打开现有的共享内存区域。

2024-04-06 17:37:55 701

原创 拿到一个python包,setup.cfg文件如何使用

在Python项目中,setup.cfg文件通常用于配置项目的元数据和依赖项。它是一种类似于INI文件的格式,包含了项目的相关信息,如名称、版本、作者等。同时,setup.cfg文件也可以用来定义项目的依赖项。[metadata][options]requestsnumpypandas在上面的示例中,metadata部分包含了项目的名称和版本信息。options部分定义了项目的依赖项,其中install_requires字段指定了项目所需的依赖包。

2024-03-16 11:33:30 490

原创 ubuntu个人系统软件安装配置备忘

【代码】ubuntu个人系统软件安装配置备忘。

2024-03-02 22:34:09 498

原创 编译链接实战(25)ThreadSanitizer检测线程安全

ThreadSanitizer(又称为TSan)是一个用于C/C++的数据竞争检测器。在并发系统中,数据竞争是最常见且最难调试的错误类型之一。当两个线程并发访问同一个变量,并且至少有一个访问是写操作时,就会发生数据竞争。C++11标准正式将数据竞争定义为未定义行为。更多例子见https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces。

2024-03-02 22:15:38 523

原创 编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误

fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址清理器),这是一种快速的内存错误检测工具。它可以检测出程序中的两种常见错误:越界访问(out-of-bounds accesses)和使用后释放(use-after-free)错误。当你在编译程序时使用这个选项,编译器会插入额外的代码来检查每次内存访问是否合法,以便发现潜在的内存错误。

2024-03-02 16:20:59 169

转载 编译链接实战(24)禁用临时对象消除优化-fno-elide-constructors

后来经过查找发现是因为g++编译器实现省略创建一个只是为了初始化另一个同类型对象的临时对象。指定这个参数(-fno-elide-constructors)将关闭这种优化,强制g++在所有情况下调用拷贝构造函数。在fun函数中会返回一个class A的对象,那么编译器会在栈上构造一个临时对象,构造临时对象的方法则是调用拷贝构造函数。3.如果函数返回值是类对象,函数执行完成返回调用时。那么加上这个参数重新编译试试,运行结果如下。1.当用类一个对象去初始化另一个对象时。道理很简单,我写了个很简单的例子。

2024-03-02 10:52:27 33

原创 编译链接实战(22)C/C++代码覆盖率统计报告生成

gcov是一个测试代码覆盖率的工具,它是 gcc 自带的查看代码覆盖率的工具。使用效果如下图所示:程序运行完成后,可以查看每个文件的代码覆盖率情况,上面报告中展示了每个文件的行覆盖率,函数覆盖率和分支覆盖率。打开一个文件的覆盖率报告,页面对开始有文件的基本信息描述,以 FreeRTOS 的 task.c 为例,它的有效代码行数为 921 行,共 24 个函数(几千行的文件其实也没多少嘛~)蓝色表示运行被覆盖的代码,前面的数字表示代码执行次数。红色表示未执行代码。

2024-03-02 00:06:27 1129

转载 内核解读之内存管理(13)逆向映射

数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。

2024-02-29 23:59:36 365

原创 内核解读之内存管理(8)什么是page cache

文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存,即将文件中的数据缓存到page中,这些page就叫page cache。

2024-02-24 22:22:17 1030

原创 内核解读之内存管理(6)address_space建立文件索引结点inode和页page、虚拟地址空间vma的映射

file结构体和inode结构体中都有一个address_space结构体指针,实际上,file->f_mapping是从对应inode->i_mapping而来,inode->i_mapping->a_ops是由对应的文件系统类型在生成这个inode时赋予的。它是代表某个地址空间吗?实际上不是的,它是用于建立文件结点(struct inode)到内存页面(struct page)的映射,其实就是每个file都有这么一个结构,将文件系统中这个file对应的数据与这个file对应的内存绑定到一起;

2024-02-24 14:16:33 382

转载 Linux文件系统原理分析(2)inode索引节点

假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。

2024-02-18 17:06:31 87

原创 mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景,其中一个典型的应用场景是网络文件传输。假设我们需要将一个大文件传输到远程服务器上。在传统的方式下,我们可能需要将文件内容读入内存,然后再将数据从内存复制到网络协议栈中,最终发送到远程服务器。这个过程中,涉及到了多次数据拷贝操作,增加了 CPU 的开销,降低了传输效率。而使用 mmap 零拷贝技术,则可以将文件映射到内存中,然后直接将内存中的数据传输到网络协议栈中,避免了数据在内核和应用程序之间的复制,从而提高了传输效率。

2024-02-18 15:29:16 1000

原创 嵌入式架构师成长之路--架构设计

而我之所以推崇多进程的原因就是,多进程能从物理上隔绝了这种“方便”的通讯方式,导致在想实现一个模块交互时,会多思考下这个交互是必要的吗,如果是必要的,则会进一步思考接口定义是否简单明了(因为进程间的通讯相对会麻烦些,开发人员会本能减少交互,明确接口的想法去仔细考虑接口,协议的定义,否则折腾的是自己了),这如同人生,如果一直顺风顺水,人们可能不会想太多,思考太多,而如果道路上有些坎坷,则会有另一种感悟吧。而如果采用多进程的模型,好吧,你的服务进程挂了,你自己找原因吧,没什么可争辩的了。

2024-02-18 15:08:14 893

转载 内核解读之文件系统(3)文件IO原理剖析(read/write、mmap)

转发自:https://zhuanlan.zhihu.com/p/442771856。

2024-02-18 14:10:33 67 1

原创 计算机科学导论(4)DMA传输原理

DMA(Direct Memory Access)直接内存访问是一种允许某些硬件子系统在不通过中央处理单元(CPU)的情况下,直接从内存读取或向内存写入数据的技术。这种方式可以显著提高数据传输的效率,减轻CPU的负担,使CPU能够同时处理其他计算任务。DMA广泛应用于需要高速数据传输的场景,如硬盘驱动器、固态驱动器、网络卡、声卡等外围设备与内存之间的数据传输。总之,DMA是一种有效提高数据传输效率、减轻CPU负担的关键技术,对于现代计算机系统的高性能运行至关重要。

2024-02-07 00:56:08 780

原创 计算机科学导论(5)一文读懂RAM、ROM、SRAM、DRAM、SDRAM等内存概念

SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机访问存储器)是一种动态随机访问存储器(DRAM),它与传统的DRAM相比,最大的特点在于“同步”二字。RAM的特点是易失性的,也就是说,当电源关闭时,存储在RAM中的数据会丢失。RAM(Random Access Memory,随机访问存储器)和ROM(Read-Only Memory,只读存储器)是计算机系统中两种基本的存储技术,它们在功能和用途上有显著的不同。

2024-02-06 19:39:07 923

原创 计算机科学导论(2)计算机如何存储音频

这一过程涉及到声音的采集、模拟到数字的转换(A/D转换)、编码和最终存储。:量化是指将采样点的幅度值转换为有限的数字范围内的一个值。这个过程涉及到位深度(Bit Depth)的概念,它决定了可以表示的幅度级别的数量。最后,经过编码和压缩的音频数据可以存储在各种数字存储介质上,如硬盘、固态驱动器(SSD)、光盘或云存储服务中。量化的过程会损失一定的精度,量化的精度等于相邻两个整数所表示的实数的差值(标准),如果两个实数之间的差距小于这个差值,他们便会被量化为同一个整数。顾名思义,振幅表示振动的幅度。

2024-02-03 22:40:57 436

原创 计算机科学导论(0)冯诺依曼体系结构

冯诺依曼体系结构(Von Neumann architecture),也称为普林斯顿体系结构(Princeton architecture),是一种计算机架构理论,由匈牙利数学家和物理学家约翰·冯·诺依曼(John von Neumann)在1945年提出。这一体系结构是现代计算机设计的基础,其核心思想是将程序指令和数据存储在同一个读写内存中,使计算机能够按照存储的指令顺序自动执行操作。存储器是用来存放数据和程序的。算术逻辑单元主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中。

2024-02-03 14:31:30 394

转载 面向对象设计与分析(40)敏捷开发流程之Scrum:3大工件、3个角色、5个会议、12原则

Scrum是一个用于开发和维护复杂产品的框架,是一个增量的、迭代的开发过程,目的是让开发人员像打橄榄球一样迅猛并充满激情,通过团队合作,提高工作效率。通过团队间的有效交互,为企业创造价值。

2024-01-28 19:23:40 59

转载 面向对象设计与分析40讲(39)软件开发管理工具kanban

Kanban是一种流行的框架,用于实施和软件开发。它需要实时沟通的能力和完全透明的工作。工作内容在Kanban Board上直观地表示,允许团队成员随时查看每项工作的状态。Kanban在当今的敏捷和DevOps软件团队中非常重要,但Kanban的工作方法可以追溯到几十年前。在1940年代后期,丰田开始根据超市用来存放货架的相同模型优化其工程流程。让超市库存的产品刚好能满足消费者的需求,这种做法优化了超市和消费者之间的物流。

2024-01-28 19:10:09 41

原创 面向对象设计与分析40讲(38)软件生命周期模型之原型模型

软件设计人员根据前期的需求分析,进行软件系统框架的搭建,根据用户的业务需求,开发初始的原型系统,原型系统应具备基本的业务需要,针对用户的基本业务,原型系统上都要体现出来,在搭建原型系统时,还要考虑后续原型系统功能的拓展性,为后续的软件功能更改做好准备。基本的思想是——在限定的时间内,用最经济的方法开发出一个可实际运行的系统模型,用户在运行使用整个原型的基础上,通过对其评价,提出改进意见,对原型进行修改,评价过程反复进行,使原型逐步完善,直到完全满足用户的需求为止。这有助于减少开发周期,提高开发效率。

2024-01-28 16:55:12 369

原创 面向对象设计与分析40讲(34)软件生命周期模型

软件生命周期模型是指在软件开发过程中,按照一定的阶段和活动划分,描述了软件从概念到废弃的全过程。它是一种组织和管理软件开发活动的框架,用于指导开发团队在不同阶段进行需求分析、设计、编码、测试和维护等工作。常见的软件生命周期模型包括以下几种:瀑布模型:瀑布模型是最经典的软件生命周期模型之一。它将软件开发过程划分为线性的阶段,包括需求分析、设计、编码、测试和维护等。每个阶段依次完成,前一个阶段完成后才能进入下一个阶段。原型模型:原型模型注重通过创建和演示可用的软件原型来验证需求和设计。它采用快速迭代的方式,通过

2024-01-28 15:11:38 228

原创 面向对象设计与分析40讲(37)软件生命周期模型之螺旋模型

螺旋模型中,发布的第一个模型甚至可能是没有任何产出的,可能仅仅是纸上谈兵的一个目标,但是随着一次次的交付,每一个版本都会朝着固定的目标迈进,最终得到一个更加完善的版本。成本高:由于螺旋模型的复杂性,以及迭代周期中需要进行的多个活动和任务,它往往需要更多的人力、物力和时间投入,导致整个开发过程的成本增加。灵活性和可定制性:螺旋模型允许根据项目的特点和需求进行定制,可以根据具体情况选择合适的活动和任务,并调整迭代周期的长度和数量。难以预测:由于螺旋模型的不确定性和复杂性,开发进度和成本难以准确预测。

2024-01-28 00:09:29 431

原创 Ubuntu(x86、arm)22.04配置清华源

地址:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上面有个下拉列表,根据自己的ubuntu版本进行切换。

2024-01-24 10:05:18 878

原创 grpcui安装使用

官网地址:https://github.com/fullstorydev/grpcui。

2024-01-23 14:14:20 367

转载 编译链接实战(21)链接过程的符号冲突问题

在解析引用的过程中,最常发生的问题就是符号重定义。当链接器将目标文件或静态库同时链接到最终的二进制文件时,是不能出现重复符号的,否则会导致链接失败,即对于静态链接,重复符号是零容忍的。但对于动态链接,链接器却采取了容忍的策略。在Linux下编译动态库的时候,所有的符号默认都是导出的,也就是动态库中的函数名,类名等,在外部都是可见的。当程序引用多个动态库时,由于各个动态库可能属于不同的团队来开发,不同团队使用相同的第三方库的可能性也是有的(例如openssl,libcurl,cjson等),

2024-01-21 20:31:08 51

转载 编译链接实战(20)链接究竟做了哪些事

为了更好地理解计算机程序的编译和链接的过程, 我们先简单回顾下计算机程序开发的历史。计算机的程序开发并非从一开始就有着这么复杂的自动化编译、 链接过程。原始的链接概念远在高级程序语言发明之前就已经存在了, 在最开始的时候, 程序员(当时程序员的概念应该跟现在相差很大了) 先把一个程序在纸上写好, 当然当时没有很高级的语言, 用的都是机器语言, 甚至连汇编语言都没有。当程序须要被运行时, 程序员人工将他写的程序写入到存储设备上, 最原始的存储设备之一就是纸带, 即在纸带上打相应的孔。

2024-01-21 14:06:25 48

原创 面向对象设计与分析40讲(36)软件开发过程模型之增量模型

增量模型强调将整个项目划分为多个增量或阶段,并在每个增量中逐步构建和交付系统的功能。开发和测试:在每个增量中,开发团队按照预定的优先级顺序进行功能开发和测试。集成和验证:在每个增量完成开发和测试后,将其集成到已有的系统中,并进行验证和测试以确保新功能与现有系统的兼容性和稳定性。迭代开发:在每个增量的评审和反馈后,开发团队可以根据客户的需求和反馈进行调整和修改,并继续下一个增量的开发和交付。反馈和调整:每个增量的交付和评审提供了反馈机制,使开发团队能够及时调整和改进系统,以满足客户的需求和期望。

2024-01-07 20:20:55 384

原创 面向对象设计与分析40讲(35)软件生命周期模型之瀑布模型

瀑布模型是一种软件开发过程模型,它将软件开发过程划分为一系列阶段,并且每个阶段必须按照顺序完成,前一个阶段完成后才能进入下一个阶段,形如瀑布流水,最终得到软件产品。这些阶段通常包括需求分析、设计、编码、测试和维护等。在瀑布模型中,每个阶段都有明确的输入和输出,而且每个阶段的输出成为下一个阶段的输入。

2024-01-06 01:06:03 969

原创 面向对象设计与分析40讲(17)双重检查锁定(double-checked locking)范式

双重检查锁定(也称为“双重检查锁定优化”)是一种用于减少获取锁的开销的软件设计模式。它通过在获取锁之前测试锁定条件(即“锁提示”)来实现。只有在锁定条件检查表明需要锁定时才会进行锁定操作。即假设A、B两个线程同时运行与A、B点,B的release操作对线程A可见。同时p = new Singleton()的读写操作不会被重排到B点之后。

2023-12-24 22:53:23 534

原创 面向对象设计与分析40讲(16)静态工厂方法模式

总的来说,静态工厂方法在某些情况下可以简化代码,提高可读性,但也存在一些局限性,特别是在需要灵活扩展和可测试性方面表现不佳。在实际应用中,需要根据具体的场景和需求来选择是否使用静态工厂方法。前面我们介绍了简单工厂模式,在创建对象前,我们需要先创建工厂,然后再通过工厂去创建产品。静态工厂方法还可以直接集成到类中,简称self create。

2023-12-24 22:12:48 383

AOA Linux实现 ,含TCP转发

AOA Linux实现 ,含TCP转发

2022-03-17

HI3519AV100最新SDK smaple

海思最新SDK 程序 版本V2.0.1.0 最新

2019-03-29

RTP协议在嵌入式网络摄像机中的设计及实现.pdf

rtp,网络摄像头开发,描述了rtp推流,h264编码,v4l2视频流获取

2018-04-27

v4l2读取摄像头

v4l2读取摄像头,能在linux下编译,生成yuv文件,可以指定文件帧数

2018-01-30

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除