自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

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

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

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

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

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

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

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

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

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

2020-08-16 16:18:39 15103 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 1893 2

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

占个坑

2020-08-15 12:59:17 3159 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 14778 2

原创 C++编程法则365天一天一条(14)sizeof运算符使用

这是因为在内存中分配空间时,为了确保不同的对象具有唯一的地址,每个对象都需要占用至少一个字节的空间。不完全类型(incomplete types):如果一个类型是不完全的,即它的定义尚未完全提供(如只有声明但没有定义),那么。例如,当我们分配内存或操作具有特定大小要求的数据结构时,了解对象的大小非常重要。引用类型是对某种类型的别名或引用,它们并不占据额外的存储空间,因此与原始类型相比,它们的大小是相同的。的结果将始终是1(除非特定的编译器定义了不同的对齐规则)。运算符的结果是引用类型所指的类型的大小。

2023-09-24 21:57:50 72

原创 软件测试理论(0)常见软件测试分类

安全测试的目标是发现系统中的潜在漏洞、弱点和安全风险,并提供相应的修复建议,以确保系统能够有效地防御各种恶意攻击和非法访问。在手工测试中,测试人员会按照预先定义的测试步骤和测试用例,手动执行系统的功能,检查系统的行为和输出结果,并与期望结果进行对比。在实际测试中,手工测试和自动化测试往往结合使用,根据测试的需求和特点,灵活选择合适的测试方法和工具。通过进行单元测试,开发人员可以验证每个单元的功能是否正确,减少代码缺陷的出现,提高代码质量,便于代码重构和维护,同时也增加了代码的可读性和可测试性。

2023-09-24 16:39:46 28

原创 软件测试理论(1)压力测试有哪些评价指标

在进行压力测试之前,建议定义清晰的性能目标,并使用合适的工具和方法来测量和分析这些指标,以确保系统在各种负载条件下的性能和稳定性。监测系统的负载情况,包括CPU负载、内存使用、网络流量等,以确定系统是否接近资源饱和状态。每秒完成的请求数(TPS):表示系统每秒能够处理的请求数量,是系统性能的关键指标之一。CPU利用率:检查系统的CPU使用情况,高CPU利用率可能会导致性能下降。查看延迟分布直方图,了解不同请求的延迟情况,以及是否存在异常的长尾延迟。崩溃率:检查系统是否在高负载下崩溃或出现不可恢复的错误。

2023-09-14 16:54:06 451

原创 CMake基础教程(41)打包系统(生成deb和源码包)

CPack是CMake的一个模块,用于自动化构建和打包项目的可执行文件、库文件、资源和文档,以生成安装程序、二进制分发包和源代码分发包。ZIP (.zip)CPack模块会生成两个配置文件,分别是和CPackConfig.cmake: 这个配置文件用于生成二进制分发包和安装程序。它包含了一些配置选项,以告诉CPack如何构建和打包您的项目,包括生成哪些文件、如何组织安装目录、选择何种打包格式(例如ZIP、DEB、RPM等)等。

2023-09-14 00:32:02 66

原创 编译链接实战(15)rdynamic选项的用途

在没有使用 -rdynamic 选项编译程序时,由于缺少符号信息,调用 backtrace_symbols 可能只返回地址信息而不包含具体的符号名称。而使用 -rdynamic 选项重新编译程序时,会将所有符号导出到动态符号表中,backtrace_symbols 函数可以从动态符号表中查询到相应的符号信息,从而得到更详细的调用链信息,例如函数名、参数和行号等。当使用 -rdynamic 选项时,编译器会将所有的符号(包括全局符号和函数符号)导出到最终生成的可执行文件的动态符号表中。

2023-09-03 01:00:17 253

原创 编译链接实战(14)符号重定位与重定位表

符号重定位可以进行这种修正,使得程序中的符号引用指向正确的内存位置。这就是符号重定位的作用:将符号的引用解析为实际的内存地址。3、对于每个重定位条目,程序加载器通过符号表找到引用的符号,并将其地址与重定位类型和附加信息一起应用于重定位位置,以计算出最终的内存地址。符号重定位是实现动态链接和符号解析的关键步骤,它使得程序能够充分利用共享库和模块化设计,实现更高效和灵活的软件开发与部署。通过符号重定位,程序在运行时能够解析和访问其他对象文件或共享库中定义的符号,实现模块之间的符号引用和互操作。

2023-09-02 21:12:57 222

原创 编译链接实战(13)认识GOT表

GOT是一个特殊的数据段,存储着全局符号的地址。在程序启动时,动态链接器会填充GOT中的每个元素,将真正的地址写入其中。这样,当程序需要访问一个全局变量或调用一个外部函数时,它实际上是通过间接引用GOT中的对应元素来获取地址。需要注意的是,GOT是特定于体系结构和操作系统的,不同的体系结构和操作系统有不同的实现方式。时,编译器无法确定真正的地址,因为这些全局符号的地址是在程序运行时才被分配的。GOT的目的是提供一种机制,使得程序中的地址引用可以在动态链接的情况下解决。,从而支持动态加载和共享库的使用。

2023-09-02 19:54:15 98

原创 编译链接实战(11)gcc常用选项

用于启用大部分警告信息。它可以帮助开发者捕捉到一些潜在的问题,并提供更好的代码质量控制。-Wfatal-erros 编译遇到第一个错误就停止编译。-Werror= 指定特定的警告变成错误。定义了一个未使用的函数、标签、变量等。-Werror 将所有警告当作错误。-Wall打开所有的警告。

2023-09-02 18:56:48 20

原创 C++编程法则365天一天一条(8)const_cast去除cv限定

const_cast主要用于去除cv限定,且在C++提供的4个类型转换运算符里,只有const_cast可以去除cv属性。请注意,使用const_cast需要谨慎,并且在正确的情况下使用。滥用const_cast可能导致未定义的行为或逻辑错误。num 的值还是5,并没有修改成1。

2023-08-25 23:04:43 144

原创 C++编程法则365天一天一条(7)static_cast强制类型转换用法剖析

static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。本节介绍static_cast操作符。其使用方法如下:target-type为目标类型,即static_cast返回的类型,由用户指定。只有以下转换可以使用static_cast:static_cast操作符用于执行向下转换(downcast)。在指定条件下,当目标类型(target-type

2023-08-22 23:45:52 786

原创 git基础教程(24) git reflog查看引用日志

git reflog命令是用来恢复本地错误操作很重要的一个命令,所以在这里对它进行一下整理。

2023-08-20 10:19:36 702

原创 C++模板元编程(14) 函数模板参数和引用叠加的几条规则

在上述代码中,函数模板 foo 接受一个参数为 const T& 类型的引用。在第一个调用中,P 是 const T& 类型,A 是 T& 类型。在上述代码中,函数模板 foo 接受一个参数为 T& 类型的引用。在调用 foo 时,A 需要被替换为所引用的类型,这个很容易理解,引用不会传递,A退化成所引用的类型。当函数模板参数和引用结合时,让人十分头疼,就如果发生化学反应一样,产生意想不到的结果,今天将所有的规则穷举如下。在第二个调用中,P 和 A 都是 const T& 类型,没有额外的调整。

2023-08-19 20:49:10 116

原创 C++模板元编程(12)模板在使用时的一些限制

对于不参与模板参数推断的函数参数(例如,如果相应的模板参数已经明确指定),它们将根据通常的重载解析规则进行隐式转换以匹配对应的函数参数类型。),那么参数就不会参与模板参数推断,而是进行隐式转换以匹配我们指定的类型(在这个例子中,不会发生任何转换,因为类型已经匹配)。同样地,对于转换函数,我们不能明确指定模板参数,因为转换函数的调用通常是隐式的,不需要函数名。总的来说,这些特殊的函数(重载的运算符、转换函数和构造函数)的调用方式使得我们无法明确指定模板参数。在 C++ 中,模板参数通常在函数名后指定,例如。

2023-08-19 16:00:45 115

原创 C++模板元编程(5)函数模板参数的获取途径

可以在特定的上下文中显式指定函数模板的模板参数,包括调用函数表达式、函数地址取址、函数引用初始化以及成员函数指针形成等。显式指定(Explicitly Specified): 直接在模板函数调用时指定模板参数。函数模板可以在定义时指定默认的模板参数,如果调用时没有显式指定,将会使用默认值。今天我们来聊聊函数模板参数的获取途径,即模板参数可以通过哪些渠道获得类型。当调用函数时,编译器可以从函数实参中推导出函数模板的模板参数。

2023-08-19 14:01:42 137

原创 glog体验第一天(0)glog介绍和安装

该命令将自动安装glog库及其相关依赖,并提供bin和doc目录的可执行文件、文档等资源。如果一切正常,应该会看到当前安装了glog库的版本号、维护者信息和其他相关参数。

2023-08-18 22:57:37 169

原创 C++模板元编程(7)模板参数替换(Template argument substitution)

模板参数替换(Template argument substitution):在函数模板实例化的过程中,模板参数会被替换为实际的参数类型或值。这个替换过程称为模板参数替换。它发生在编译时,根据函数调用时传递的实际参数类型或值来替换函数模板中的模板参数。注意和模板参数推导这个概念区分开来。模板参数推导(Template argument deduction):当我们调用一个函数模板时,编译器会尝试推导出模板参数的具体类型。这个推导过程称为模板参数推导。

2023-08-18 00:52:18 173

原创 安卓源码分析(1)Runnable可执行接口

此外,Runnable为一个类提供了一种在不继承Thread的情况下仍然保持活动状态的方式。一个实现Runnable的类可以通过实例化一个Thread对象并将自身作为目标传递来运行,而无需继承Thread类。Runnable 从名字上就可以理解,实现了该接口的类,具备runnable的能力,而所谓的runnable能力,也不过是java约定的,具有run方法。你可以说,拥有fly接口的类,是flyable的,这些都是我们强加上去的概念。这个接口为所有期望在actie时执行代码的对象提供一个共同的协议。

2023-08-16 01:16:23 105

原创 面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型

在消息驱动的架构中,组件之间的交互是通过发送和接收消息来实现的。总的来说,消息驱动和事件驱动都是有效的编程模型,用于实现组件之间的通信和协作。消息驱动更关注消息的发送和接收,适用于强调消息的内容和类型的情况;在事件驱动编程中,程序的执行顺序是由事件的发生和相应的处理决定的,而不是按照传统的顺序执行。在消息驱动的模型中,系统中的各个组件(或对象)通过发送和接收消息进行通信和协作。事件驱动编程是一种编程范式,它以事件的发生和相应的处理为核心,通过订阅和响应事件来实现程序的逻辑控制。

2023-08-15 00:21:22 168

原创 安卓源码分析(11)observable+lifecycle-aware的数据存储类Livedata

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者,从而避免了内存泄漏和不必要的 UI 更新。遵循其他应用组件(如 activity、fragment 或 service)的生命周期怎么理解呢?LiveData 本身作为数据,它是没有生命周期的,它在这里。

2023-08-13 22:05:57 232

原创 安卓源码分析(10)Lifecycle实现组件生命周期管理

Android Lifecycle 是一种用于管理 Android 组件(如 Activity 和 Fragment)生命周期的架构组件。Lifecycle 提供了一种在组件生命周期变化时触发相应操作的方式,以帮助开发者编写更加健壮和可维护的代码。Android 组件的生命周期包括多个阶段,如创建、启动、恢复、暂停、停止和销毁。在每个阶段,组件可以执行特定的操作,如初始化界面、加载数据、保存状态等。使用 Lifecycle 可以将与组件生命周期相关的操作集中到一个地方,并确保这些操作在正确的时机被调用。

2023-08-13 19:00:17 143

原创 shell从入门到精通(21)运行环境讨论

在调用时,shell会扫描自己的环境,并为每个找到的名字创建一个参数,自动标记为导出给子进程使用。执行的命令会继承环境。任何执行的命令继承的环境包括shell的初始环境,其值可以在shell中被修改,减去通过 unset 和 ‘export -n’ 命令删除的任何键值对,再加上通过 export 和 ‘declare -x’ 命令添加的任何内容。换句话说,通过在命令前添加参数赋值语句,可以临时修改该命令执行时所使用的环境变量的值。这些赋值语句只会影响该命令所见的环境,不会影响其他命令或函数的环境。

2023-08-12 14:31:53 135

原创 shell从入门到精通(19)特殊变量

`$0`是一个特殊的变量,在Shell中用于展开为当前Shell或Shell脚本的名称。它在Shell初始化时进行设置。

2023-08-12 01:12:31 179

转载 Visual Studio 2022安装与使用教程

安装完成后会自动弹出以下窗口,根据你要使用Visual Studio所做的事情选择不同的功能集和工作负载,同时选择安装路径(建议使用默认安装路径)。我们也可以在搜索栏输入Visual Studio 2022的前几个字母,就会出现我们安装的Visual Studio 2022,单击就可以进入。为了方便,我们可以右键点击,选择打开文件位置,将其发送到桌面快捷方式。重启之后,我们在桌面鼠标右键点击,可以看到多了一个使用Visual Studio打开,我们点击就可以进入Visual Studio。

2023-08-09 13:02:17 156

原创 C++模板元编程(6)函数模板参数推导(Template argument deduction)

参考:https://en.cppreference.com/w/cpp/language/template_argument_deduction。

2023-07-15 23:21:04 174

转载 C++模板元编程(19)变量模板用法与实战

变量模板的定义方式与函数模板或类模板类似,只是它定义的是一个变量。在这个例子中,pi是一个变量模板,它可以用于任何类型T。当你使用pi时,你得到的是一个double类型的π值。同样,pi将给你一个int类型的π值(在这种情况下,它将被截断为3)。变量模板的一个常见用途是定义常量。这个变量模板可以用于任何类型T。当你使用Pi时,你得到的是一个double类型的π值。同样,Pi将给你一个int类型的π值(在这种情况下,它将被截断为3)。

2023-07-15 14:03:53 126

原创 C++模板元编程(22)模板元编程基础设施大全

类模板提供了一种方便的方式,用于推导和转换类型,尤其是在模板编程中经常遇到需要解除引用修饰符并进行类型推导的情况下非常有用。是 C++ 标准库中的一个元编程类模板,它用于对类型进行推导和转换。的作用是移除类型的引用修饰符,并执行其他一些类型转换操作。模板可以从传入的数组类型中提取出其元素类型。模板根据以下步骤推导和转换类型。,根据第二个版本的重载,会将。,根据第三个版本的重载,会将。对于数组,将得到数组元素类型;对于函数,将得到函数指针类型;

2023-07-03 00:18:51 232

原创 C++模板元编程(20)std::enable_if源码解读以及应用

再进一步,用户在使用时,false和true可以替换成编译期常量表达式,形成一个编译器的判断,在符合某些条件时编译通过,不符合条件时编译报错,目的是在编译期拦截错误。使用enable_if的诀窍是,作为模板的非类型模板参数使用,使用其默认类型void即可,这样用户不用給该参数传值。这个偏特化版本略有不同,里面定义了类型type,这个type类型就是由模板参数的类型。一个通过返回值,一个通过默认模板参数,都可以实现校验模板参数是整型的功能。利用了偏特化的原理,对模板的第一个参数进行具体化,直接传递true。

2023-07-02 21:31:32 154

原创 C++模板元编程(21)SFINAE规则引入

这个例子里, 如果 T 没有 定义TYPE, 当没有 sfinae 的时候, 就会直接编译错误, 因为展开的结果不合法, 不过因为现在有 sfinae ,第一个展开发现不合法了不会立刻编译错误, 而是会尝试别的重载展开,当然,如果全部的重载函数都不匹配时,那就会报错了。通过SFINAE,我们能够使得模板匹配更为“精确”,即 使得一些模板函数、模板类在实例化时使用特殊的模板版本,而另外一些则使用通用的版本,这样就大大增加了模板设计使用上的灵活性。我们首先来了解模板元编程的一个基本规则:SFINAE,它是。

2023-07-02 18:12:14 234

原创 git基础教程(35)git pull拉取远端代码

执行后需要手动执行git merge合并分支,而git pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull使用给定的参数运行git fetch,并根据传入的选项调用git merge或者rebase将检索到的分支头合并到当前分支中。将远程主机origin的master分支拉取过来,与本地的brantest分支合并。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。本地没有任何修改,仅仅是落后于远程,执行git pull后,快速前进到远程仓库。

2023-06-05 01:07:18 2163

原创 git基础教程(18)git stash暂存本地修改

执行git stash,还可以像commit一样填写备注信息,也可以省略,git会按照固定格式自动生成,形如:stash@{0}: WIP on 分支名: fad1c85 该commit id的提交日志。想要还原stash的内容,直接git stash pop即可,会直接弹出stash的顶层内容,也就是最近一次stash的内容。需要注意的是,git stash只能stash被git tracked过的文件和文件夹,未被跟踪的文件和文件夹无法stash。当然,完整的写法其实是:git stash push。

2023-06-04 23:29:04 576

原创 C++编程法则365天一天一条(3)探索浮点数的存储方式

指数位(8 bits或11 bits):指数是以二进制补码方式存储的带符号整数值。对于单精度浮点数,小数位占用23个bits,最高位始终为1(因此可以被省略),其余22位则表示小数部分;对于双精度浮点数,小数位占用52个bits,最高位也是1,其余51位则表示小数部分。对于特殊值,其指数位全部置为1,而小数位全为0或一部分为0一部分为1。小数转二进制和整数转二进制一样,只不过每一位的权重从2的n次方变成2的-n次方。符号位(1 bit):规定为0表示正数,1表示负数。0.25:为2^-2,即为0.01。

2023-05-21 15:13:52 478

原创 C++编程法则365天一天一条(2)goto语句的一些坑

从自动变量的作用域退出(即跨越了自动变量的声明所在位置),比如从某个语句块的内部向外跳出,或者从一个函数的任何位置返回时,那么程序会按照它们创建时相反的顺序调用所有已定义析构函数的自动变量进行销毁操作。换句话说,C++编译器将按照变量定义的相反顺序调用自动变量的析构函数,以保证在变量结束其生命周期之前能够完成它们所需的清理工作(比如释放分配的内存等)。需要注意的是,上述规定仅适用于自动变量,在栈中分配内存的对象,对于静态变量或全局变量来说则不适用。换句话说,如果要从一个变量声明(例如、

2023-05-21 13:14:23 496

原创 C++编程法则365天一天一条(1)关于main函数你了解多少

简单来说,return 语句让程序从main() 函数中正常离开,并返回一个整型值作为程序的退出状态,同时会执行自动对象的析构函数。如果通过 std::exit 函数退出程序,则会立即停止程序的运行并退出。在执行 main() 函数中的 return 语句(或者在主函数结束时隐式返回)时,相当于正常离开该函数,并且会销毁所有自动存储期的对象,然后将return 语句的返回值传递给 std::exit调用。main() 函数是C/C++程序的入口函数,整个程序从此处开始执行。main函数不能当普通函数调用。

2023-05-21 01:37:53 382

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关注的人

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