- 博客(32)
- 收藏
- 关注
原创 宏定义和内联函数的区别?
首先,内联函数的代码会被复制到调用它的地方,如果内联函数的代码很长,会导致可执行文件变大,影响程序的运行效率。宏定义是一种简单的文本替换方式,不会增加代码的长度,但是它不能进行函数调用的优化,因此有时候效率不如内联函数。而内联函数可以进行函数调用的优化,但是它的代码会被复制到调用它的地方,可能会增加可执行文件的大小。而内联函数是一种函数调用的优化方式,编译器会将内联函数的代码直接插入到调用该函数的代码中。在编译时,编译器会将max函数的代码直接插入到调用该函数的代码中,避免了函数调用的开销。
2024-08-01 15:27:31
375
原创 详解main函数参数argc、argv及如何传参
envp[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。二、第二个参数char* argv[] 是字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。argv[1]:指向执行程序名的第一个字符串,表示真正传入的第一个参数。argv[2]:指向执行程序名的第二个字符串,表示真正传入的第二个参数。argv[n]:指向执行程序名的第n个字符串,表示真正传入的第n个参数。规定:argv[n]为NULL时,表示参数的结尾。
2024-07-31 20:47:27
258
原创 自旋锁与互斥锁区别
自旋锁(Spinlock):当线程尝试获取一个已被占用的自旋锁时,它不会立即放弃CPU,而是原地循环(自旋),不断检查锁的状态,直到锁变为可用。因此,自旋锁在获取锁的开销较小,尤其是在锁很快就能被释放的场景下。互斥锁(Mutex):当一个线程试图锁定一个已经被其他线程持有的互斥锁时,该线程会被操作系统挂起(进入睡眠状态),并从运行队列移除,直到锁被释放,操作系统才会唤醒该线程,将其放回运行队列。互斥锁虽然在获取锁失败时会引入较高的上下文切换开销,但在锁等待时间较长时,可以让出CPU资源,避免资源浪费。
2024-07-31 19:40:34
447
原创 字符设备和块设备有什么主要区别?
块设备引入缓冲去的目的:为了提高块设备寿命,大家如果仔细观察的话就会发现有些硬盘或者 NAND Flash就会标明擦除次数(flash 的特性,写之前要先擦除),比如擦除 100000 次等。因此,为了提高块设备寿命而引入了缓冲区,数据先写入到缓冲区中,等满足一定条件后再一次性写入到真正的物理存储设备中,这样就减少了对块设备的擦除次数,提高了块设备寿命。比如我们最常见的点灯、按键、串口、IIC、SPI,LCD等等都是字符设备,这些设备的驱动就叫做字符设备驱动。三、字符设备与块设备的区别。
2024-07-31 11:38:30
379
原创 指针和引用的区别
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;但是引用则总是指向在初始化时被指定的对象,以后不能改变。指针本身的值(地址值)是以pass by value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,
2024-07-31 09:26:06
273
原创 new和malloc的区别(详细)
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。 那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不
2024-07-31 09:15:26
1550
原创 【C++】深拷贝&浅拷贝
在浅拷贝的构造函数中,会将源对象的地址直接赋值给目标对象,这样就会导致两个对象共享同一块内存,当其中一个对象被销毁时,会导致另一个对象的指针成员变量指向一块已被释放的内存,从而引发程序崩溃。我们可以看到,如果要进行浅拷贝,我们只需要将源对象的指针类型成员变量的地址复制给目标对象的指针类型成员变量即可,但是这样做有一个问题就是源对象和目标对象会共享指针指向的内存空间,当源对象被销毁时,目标对象持有的指针就会指向一块已经被释放的内存空间,从而导致程序崩溃,因此浅拷贝对这种类型的成员变量并不适用。
2024-07-31 08:44:33
746
原创 C语言中#pragma预处理指令的使用
pragma用于指示编译器完成一些特定的动作#pragma所定义的很多指示字是编译器特有的(后面的参数决定)#pragma在不同的编译器间是不可移植的预处理器将忽略它不认识的#pragma指令不同编译器可能以不同的方式解释同一条 #pragma指令到此这篇关于C语言中#pragma预处理指令的使用的文章就介绍到这了,更多相关C语言 #pragma预处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
2024-07-30 15:21:52
396
原创 extern “C“ 用法详细说明
首先,先看一下下面这个例子:图1 案例它到底有什么用呢,这样的问题会出现在面试or笔试中,我觉得作为一个学C++的童鞋,应该了解一下。下面我就从以下几个方面来介绍它:1、#ifdef _cplusplus/#endif _cplusplus 在介绍extern "C"之前,我们来看下#ifdef _cplusplus/#endif _cplusplus的作用。很明显#ifdef/#endif、#ifndef/#endif用于条件编译,#ifdef _cplusplus/#endif _cplusplu
2024-07-30 14:44:20
2213
原创 lambda表达式
Lambda表达式与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据。语法上,在“[]”包括起来的是捕获列表,捕获列表由多个捕获项组成,并以逗号分隔。Lambda有很多叫法,有Lambda表达式、Lambda函数、匿名函数,本文中为了方便表述统一用Lambda表达式进行叙述。分析:算法find_if()对指定范围内的每个元素调用该一元谓词,如果该谓词返回true,find_if()将返回一个指向相应元素的迭代器,指出找到了一个满足条件的元素。
2024-07-21 20:40:29
500
原创 进程和线程的区别和联系
1. 认识线程线程是进程的一个实体,它被包含在进程中,一个进程至少包含一个线程,一个进程也可以包含多个线程,线程是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程.早在80年代,由于进程的创建和销毁以及切换存在较大的空间开销,因此人们急需一种来减少资源的开销.于是便线程的概念便但诞生了..因此系统对于远远小于进程.
2024-07-16 20:35:35
842
原创 一文搞懂堆和栈的区别
0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式。(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆与栈1.1 栈简介栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码:int b;//栈//栈char *p2;//栈。
2024-07-16 18:10:33
632
原创 一文读懂 YUV 的采样与格式
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间。对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。
2024-07-15 22:12:45
920
原创 C++面试
(1) 派生类继承的函数不能定义为虚函数。虚函数是希望派生类重新定义。如果派生类没有重新定义某个虚函数,则在调用的时候会使用基类中定义的版本。(2)派生类中函数的声明必须与基类中定义的方式完全匹配。(3) 基类中声明为虚函数,则派生类也为虚函数重载 重写重定义重写发生在两个类之间重载必须在一个类之间重写分为两类:1虚函数重写 将发生多态2非虚函数重写 (重定义)重载:用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同函数重载发生在同一个类中。
2024-07-15 11:57:04
617
原创 Camera摄像头成像方向和LCD刷屏方向
备注:横屏手机会导致三方Camera应用(固定竖屏应用)的预览方向不正确,因为三方Camera应用只适配了竖屏情况,无法适配横屏情况,从而导致预览方向不正确。(A)竖屏手机:摄像头的安装角度需要配置成90(后摄)和270(前摄),使图像顺时针旋转从而得到正确的预览。(B)摄像头安装角度需要满足长边对长边,短边对短边(这里的长边对长边表示:摄像头长边对齐LCD屏的长边)(B)横屏手机:摄像头的安装角度需要配置成0(后摄)和180(前摄),使图像顺时针旋转从而得到正确的预览。(2)摄像头成像的小人头方向。
2024-07-14 22:58:35
558
原创 【Camera专题】Camera 预览花屏、分屏、卡屏,黑屏问题的总结分析【转】
pm89l6_S3会自身根据系统负载去动态改变电压, 当使用全尺寸输出的时候,系统负载大,所以能稳定到1.4V, 当使用200w尺寸输出的时候,系统负载小,S3自身会跳到1.2V。为啥全尺寸3264x2448(800w)输出,这路供电可以固定到1.4V,使用小尺寸1632x1224(200w)输出时,DVDD在1.2V到1.4V直接不停的跳。不同厂家的sensor,对时序的要求不一样,像OV5675对三路上电的时序就没有严格的要求,gc8034相对来说要严格一下。ov5675,只有XSHUDTN,
2024-07-14 21:42:22
727
原创 【Qcom Camera】Camx架构Chi External Node 三部曲之如何加载
较官方的定义:Node节点在Camx/Chi架构中至关重要,主要用于处理pipeline下发的request,最终的数据处理都是通过封装好的Node节点来进行的。简单来说Node用于数据处理;同时也可以是一些特殊的算法处理,比如EIS,FD,SW Remosaic等等。
2024-07-14 21:17:36
925
原创 linux用户空间下的锁介绍
信号量通常用于线程之间的通信和同步,允许一个线程在等待某个特定条件满足时被阻塞,而另一个线程可以在条件满足时通知等待的线程。与互斥锁不同,读写锁允许多个线程同时读取共享资源(只要它们是读操作),但只允许一个线程写入共享资源,一旦有一个线程试图执行写操作,其他所有线程都将被阻塞,直到写操作完成。总之,Linux用户空间的自旋锁是一种用于保护临界区的同步机制,通过忙等待方式尝试获取锁,适用于对临界区的竞争非常短暂的情况。总之,Linux用户空间的读写锁是一种强大的同步工具,用于管理共享资源的并发访问。
2024-07-13 10:52:23
672
原创 Android Camera简单整理(二)-Qcom HAL3 Camx架构学习
Android Camera简单整理(二)-Qcom HAL3 Camx架构学习。
2024-07-01 16:55:35
1090
原创 Android Camera简单整理(一)-Camera Android架构(基于Q)
Camera整体架构简单整理一.Android Camera整体架构简述1.1 Android Camera 基本分层1.2 Android Camera工作大体流程二. Camera App层简述三. Camera Framework层简述3.1 CameraServer初始化3.2 App调用CameraServer的相关操作四 Camera Hal3 子系统五. 下面需要梳理的重点-正在进行。
2024-06-30 23:05:59
1168
原创 高通camera:PDAF的配置与测试
确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。
2024-06-30 09:36:41
506
原创 PDAF原理简介_pfc电路工作原理图
由于shiled pixel一半被遮盖住,感光面积只有正常pixel感光能力的一半,所以感光能力要比正常的pixel感光能力弱,gainmap就是对遮蔽pixel做感光能力的补偿在这里插入图片描述。
2024-06-30 09:30:16
461
原创 V4L2驱动框架详解
V4L2在设计之初时,是要支持很多广泛的设备的,如声卡, display, FB, I2C, camera等.它们之中只有一部分在本质上是真正的视频设备,也是造成V4l2源码冗余的原因之一。kernel更新速度快,在display上有drm框架和framebuffer框架, 声卡上有ALSA框架. 目前V4L2主要用于camera驱动,本文也是通过camera驱动讲解V4l2内部原理。
2024-06-29 22:42:52
1544
原创 V4L2驱动框架详解
④ video_device->ioctl_ops: 设置成v4l2_ioctl_ops结构, 该结构体成员为应用层操作video_device_fd句柄的ioctl(VIDEOC_XXX) ,所回调的函数指针。我们配置/dev/video主要通过使用ioctl(VIDEOC_XXX), 命令宏如:VIDIOC_S_FMT, VIDIOC_G_FMT, VIDIOC_REQBUFS, VIDIOC_QUERYBUF, VIDIOC_DQBUF, VIDIOC_STREAMOFF。性能最高,实现起来复杂。
2024-06-29 21:34:43
778
原创 2.5、高通camera框架:初理解之三_HAL3.0简介_整理 待定
至此已经完成了一次向HAL3.0 Device发送一次完整的Request的请求。从最初Preview启动建立多个OutPutStream,再是将这些Stream打包成一个 mPreviewRequest来启动stream,随后将这个Request又转变为一个CaptureRequest,直到转为Capture list后交由RequestThread来处理这些请求。
2024-06-29 16:56:46
890
原创 两个sensor之间的硬件帧同步
3). 对于软件帧同步,主摄和辐摄的帧率相同的前提下,主摄和副摄的匹配最多有半帧的差距。7). sensor 曝光之后才会去出流,对于出第一帧来说,要等1.5帧左右才会出来,这个1.5帧就是做曝光等动,所以第一帧会出的慢。8). 帧同步信号线和SoF信号线是两个不同的信号,帧同步信号和SoF信号可以认为是同时出来的,但是严格来说,帧同步信号要稍快于SoF信号!1). 主sensor先出帧的,所以副sensor想追上主sensor同步起来,一般需要比master sensor的帧率快一丢丢;
2024-06-29 15:11:28
601
原创 CMOS Sensor 的一些基本概念,及曝光相关的计算
V_Blank:是指场消隐或称垂直消隐,如下帧结构示意图所示,假定曝光起始位置在图像的左上角,曝光完成一帧图像后,曝光位置要从图像的右下角返回左上角,开始新一帧的曝光,这一段时间间隔称为V_Blank。H_Blank:是指行消隐或称水平消隐,如下帧结构示意图所示,假定曝光起始位置在图像的左上角,对于逐行曝光的 sensor 来说,曝光从第一个像素开始,依次曝光直至这行的最后一个像素曝光结束,--- 积分时间是指曝光一帧所用的行数,那这一帧的绝对曝光时间就等于,曝光所用行数乘以曝光一行所用的时间。
2024-06-29 14:42:58
1910
原创 camera sensor的卷帘曝光
黄色区域是sensor处于感光的时间,蓝色区域是sensor每一行数据的输出时间,红色是曝光开始的时间。XHS是进行每个操作的最小时间单位。从时间先后来看,一幅图像是从第一行开始曝光,一个XHS之后,再从第二行开始曝光,依次类推。图像的第一行曝光结束后,进行输出,输出数据的时间是一个XHS,依此类推。对于卷帘曝光的sensor来说,工作原理是逐行曝光,每一行依次曝光,直到一帧画面曝光完成。
2024-06-29 14:41:02
359
原创 摄像头基础知识(三):HDR
行交织HDR一般是使用overlapped模式。即相机读出数据和下一帧曝光开始出现重叠的情况,在同一个时刻内,相机执行两个操作,导致在同样的单位时间内,在overlapped曝光模式下,可以采集到更多的图片,即相机的帧率更高。传统多帧HDR一般是使用non-overlapped模式,即每个图像采集的周期中,相机在下一个图像采集开始前,均要完成曝光/读出整个过程。原文链接:https://blog.csdn.net/wwws1994/article/details/128897528。
2024-06-28 15:19:48
445
原创 Camera mipi通信协议
MIPI(移动行业处理器接口),是的缩写。MIPI移动行业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准。分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI,其中是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。
2024-06-28 10:42:59
977
原创 camera sensor基础概念-1
TIMER_CLK:指的是PHY接口的操作频率,即摄像头传感器连接的PHY接口的时钟频率。在摄像头接口的上下文中,如 DPHY,TIMER_CLK 可能指的是物理层接口的操作频率,用于确定数据传输的速率。在您提供的文本中,描述了如何计算理想的设置时间(settleTimeNs),这是与传感器和物理层接口(PHY)的同步有关的一个参数。在微控制器或其他系统中,MCLK 作为系统主时钟,可能与 TIMER_CLK 有关联,后者可能是由 MCLK 分频得来的,用于定时器操作或特定功能的时钟控制。
2024-06-28 09:25:38
518
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人