自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 存储器管理单元MMU概述

在ARM系统中,存储器管理单元MMU主要完成以下工作:● 虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU就要实现从虚拟地址到物理地址的转换。● 存储器访问权限的控制。● 设置虚拟存储空间的缓冲的特性。页表(Translate Table)是实现上述这些功能的重要手段,它是一个位于内存中的表。

2024-04-14 17:27:03 545

原创 ISP图像处理pipeline简介1

它是用来干什么的呢?不同的ISP可能会以不同的顺序或方式应用这些步骤并且往往更加复杂,但一般包含这些步骤:3A(auto focus, auto exposure, auto white balance, 自动对焦, 自动曝光,自动白平衡),ISO增益,raw图片的各种处理,Demoasicing解马赛克,降噪,色彩空间转换,镜头和sensor校正,色彩校正,对比度和动态范围的调整,锐化,编码压缩等等。镜头是由透镜组成,由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真(包括形状,亮度,色彩)。

2024-04-13 22:54:13 1006

原创 MIL、SIL、PIL、HIL在环测试简介

在进行车载软件开发时经常会听到MIL、SIL、PIL和HIL等各种测试,它们都是什么意思呢?它们之间的区别是什么呢?

2024-03-17 21:16:56 933

原创 H264/265 SEI 简介

在音频和视频流中,补充增强信息(SEI)是插入到比特流中的附加数据,以传达额外的信息,这些信息可以与相关的音频和视频内容精确同步接收。在音视频内容的编码和传输过程中可以插入SEI。可以在SEI中添加各种类型的信息,例如相机或编码器的参数, 事件戳,隐藏式字幕,歌词,和版权信息。虽然标准定义了如何将 SEI 消息插入码流的语法和语义,但并不要求解码器能够处理此信息。因此,如果设备不支持 SEI 数据,则 SEI 数据可能会在内容分发链中的某个时间点被丢弃。

2024-03-17 18:01:33 1046

原创 H264/265编码参数2: Profile Level Tier

在H265编码器中,支持某一个Profile的编码器,并不要求它支持该Profile的所有特性,但是编码的码流必须符合HEVC的标准,才可被支持该Profile的解码器所解码。H265 Profile 的支持: 常用的三个Main profile,即常规8bit像素精度的Main profile,支持10bit像素精度的Main 10 profile和支持静止图像的Main Still Picture profile。H.264 规定了多种种档次,每个档次支持一组特定的编码功能,并支持一类特定的应用。

2024-03-10 16:59:35 906

原创 H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念。

2024-02-26 23:01:45 867

原创 视频编码码率控制

码率控制是编码器的一个重要模块,主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分,但是它并不是编码标准的一部分,也就是说,标准并没有给码控设定规则。我们平时用的编码器的码控都是编码器程序自己实现的。那码控的原理是什么呢?其实码控就是为每一帧编码图像选择一个合适的 QP 值的过程。我们知道当一帧图像的画面确定了之后,画面的复杂度和 QP 值几乎决定了它编码之后的大小。

2023-12-24 12:00:34 452

原创 camera同步信号

没读完一行就发送一个HSYNC信号,然后读取下一行。如果这些摄像头之间不进行时间同步,那么各个摄像头成像的时间就不一致,存在误差,会对后续的流程产生不良影响,比如融合感知的精度会受到很大影响。FSYNC:frame synchronization,帧同步信号,通常是从sensor外部输入的同步信号,用来控制sensor的曝光时机,即控制sensor在指定的时机曝光。一种可行的办法是让相机的每一帧都由外部FSYNC信号触发,即由外部host在同一时间统一给各个sensor发送同步信号来触发曝光。

2023-12-23 21:37:01 856

原创 camera曝光时间

针对曝光和readout这两个步骤,相机操作有两种常见的方法:“non-overlapped”的曝光和“overlapped”的曝光。曝光:曝光是图像传感器进行感光的一个过程,相机曝光时间,也就是快门速度,曝光即曝光时间控制,控制感光元件上总的光通量。对于面阵相机,它通常是每秒收集的帧数(帧/秒),而对于线阵相机,它是每秒收集的。由于人眼特殊的生理结构,如果被观看的图像的帧率高于16fps,则认为是连续的。有人问为什么我们在使用工业相机的时候,增加相机的曝光时间后,相机的帧率下降,而且下降得很严重。

2023-12-17 13:36:40 1578

原创 camera卷帘快门(Rolling Shutter)与全局快门(Global Shutter)

首先来看一下什么叫快门:快门是照相机用来控制感光元件有效曝光时间的装置。可以理解为光线要想打到相机传感器上必经的一道门。如果快门关着,那么光线进不去,感光元件就无法曝光;门开了,光线进来了,感光元件开始曝光,开始成像。从结构上来划分,快门可以分为机械快门和电子快门。机械快门在单反上用的比较多,就是挡在感光元件前面的幕帘。如下图所示与机械快门相对的是电子快门,也称电磁式快门。

2023-12-16 17:06:47 1229

原创 图像特征提取-角点

图像特征图像特征要有区分性,容易被比较。一般认为角点,斑点等是较好的图像特征特征检测:找到图像中的特征特征描述:对特征及其周围的区域进行描述。

2023-12-13 22:56:16 396

原创 H264码流结构

视频编码的码流结构是指视频经过编码之后得到的二进制数据是怎么组织的,或者说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数据是一帧图像,哪一块数据是另外一帧图像。而我们在工程开发中,需要对编码后的数据进行一些解析,以便用于之后的打包。同时我们在打包时也需要判断当前一帧图像数据它的开头和结尾在哪。

2023-12-10 23:22:42 797

原创 H264视频编码原理

本文主要介绍h264编码的基本原理

2023-12-09 16:53:27 763

原创 __attribute__中的constructor和destructor--如何让程序退出时调用指定函数

那么问题来了,假设同一进程中使用你这个的组件不止一个,比如A,B两个独立模块都要使用,甚至A和B都不知道对方的存在,它们最开始都要调用x_init, 这个只要在内部实现做好保护,x_init多次调用,并发调用也能hold得住。假设你在开发一个基础组件x,然后你设计了一个x_init接口用来初始化这个组件,相应地你设计了一个x_deinit来去初始化。如果A不调deinit, 到B退出时,B也不知道还有没有人在使用x, 所以B也没有调deinit, 最后导致的结果可能就是资源泄漏。如果是C语言怎么办?

2023-10-30 23:24:58 98

原创 YUV编码格式解析

或者说,对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。2:1水平降采样, 意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。YUV 4:2:0 是指水平和垂直 Y 各取样两个点,UV 各只取样一个点,水平的取样比例是 2:1,重直的取样比例 2:1,也就是。这些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采样。

2023-10-29 22:18:07 206

原创 拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列由柯达的布莱斯·拜尔发明,拜尔阵列将更多的像素用于绿色,而不是红色和蓝色,因为人眼对绿色更敏感。但这张照片,每个像素只有rgb中的一种颜色,每个像素还缺少其它两个颜色分量,效果如下图3所示。典型的图像传感器(例如我们在数码相机中使用的图像传感器,主要有CCD, CMOS)由许多单独的光电传感器组成,所有这些传感器都会捕获光线。如果想要获得不同颜色的光,最直接的做法是加入不同颜色的滤镜,从而滤出 RGB 三个通道的颜色。这个覆盖层可以理解为一个过滤层,每种类型的过滤器通常只允许一种颜色的光线的通过。

2023-10-29 17:32:56 1023

原创 linux实时性分析

操作系统的实时性是指执行一个特定任务的时间是确定的和可预测的,这个任务执行时限需要考虑任何的情况,包括最恶劣的情况。或者说操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果,也就是指任务执行的及时性。这里以车辆紧急制动为例,这个任务的响应时间就是车载系统收到紧急制动指令到真正实施紧急制动这个动作所需的时间,我们当然希望这个时间是确定的而且是及时的,即需要保证在最恶劣的情况下也能保证在一定的时间内完成,否则车企可能就要上热搜了。

2023-04-16 22:39:28 1214 1

原创 linux共享内存的使用

介绍Linux共享内存接口及使用示例

2022-12-25 18:16:13 1360

原创 多线程并行归并排序算法实现

排序优化工程实现

2022-12-08 10:04:45 267

原创 TCP/IP 错误号

Linux, UNIX 系统上的常见 TCP/IP 错误符号

2022-12-05 15:32:29 970

原创 QML ListView组件解析

QT QML组件介绍

2022-08-07 23:10:14 1875

转载 C++面试关于类的一些常见问题

什么是虚函数?什么是纯虚函数?虚函数:被 virtual 关键字修饰的成员函数,就是虚函数。#include <iostream>using namespace std;class A{public: virtual void v_fun() // 虚函数 { cout << "A::v_fun()" << endl; }};class B : public A{public: void v_fun()

2022-05-28 13:15:45 224

原创 C++ define和const , typedef,inline 的区别

define 和 typedef 的区别原理:#define 作为预处理指令,在编译预处理时进行替换操作,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef 是关键字,在编译时处理,有类型检查功能,用来给一个已经存在的类型一个别名,但不能在一个函数定义里面使用 typedef 。功能:typedef 用来定义类型的别名,方便使用。#define 不仅可以为类型取别名,还可以定义常量、变量、编译开关等。作用域:#define 没有作用域的限制,只要是之前预定义过的宏,在

2022-05-28 12:20:36 200

原创 TCP TIME_WAIT相关的一些问题

问题1:CLOSE-WAIT 和 TIME-WAIT 的状态和意义在服务器收到客户端关闭连接的请求并告诉客户端自己已经成功收到了该请求之后,服务器进入了 CLOSE-WAIT 状态,然而此时有可能服务端还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务器在关闭连接之前将待发送的数据发送完成。TIME-WAIT 发生在第四次挥手,当客户端向服务端发送 ACK 确认报文后进入该状态,若取消该状态,即客户端在收到服务端的 FIN 报文后立即关闭连接,此时服务端相应的

2022-05-15 22:41:31 337

原创 c++内存布局

C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。堆:动态申请的内存空间,就是由 malloc 或new分配的内存区域,由开发者控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。内存泄露发生的区域。全局区/静态存储区(.bss 段和 .data 段):存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分

2022-05-14 23:22:17 798

原创 c++/c程序编译过程

编译过程分为四个过程:编译(编译预处理、编译、优化),汇编,链接。编译预处理:处理以 # 开头的指令;编译、优化:将源码 .cpp 文件翻译成 .s 汇编代码;汇编:将汇编代码 .s 翻译成机器指令 .o 文件;链接:汇编程序生成的目标文件,即 .o 文件,并不会立即执行,因为可能会出现:.cpp 文件中的函数引用了另一个 .cpp 文件中定义的符号或者调用了某个库文件中的函数。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序 .exe 文件。链接分为两种:静态链接:代码

2022-05-14 23:16:37 170

原创 查找数组中的第K个最大元素或者数组中最大的k个元素,C++解法

题目给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4题解思路是维护一个长度为k的最小堆,堆顶是这个堆中的最小的元素;对数组的每一个元素进行遍历,如果堆元素小于k或者当前遍历的元素大于堆顶元素,那就让当前元素入堆,然后再弹出一个最小的元素

2022-05-02 16:26:33 1320

原创 我所理解的CPU中断

什么是中断假设你在玩王者荣耀,突然一个电话过来…, 这就是中断!对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可

2022-03-06 16:37:09 4133 6

原创 C++标准中的左值和右值

我们知道,C++ 里有左值和右值。但是标准里的定义实际更复杂,规定了下面这些值类别(value categories):它们的释义如下:lvalue: 左值,是通常可以放在等号左边的表达式rvalue:右值,是通常只能放在等号右边的表达式glvalue:generalized lvalue,广义左值xvalue: expiring lvalue,将亡值prvalue:pure rvalue,纯右值我们暂且抛开这些概念,只看其中两个:lvalue 和 prvalue。左值 lvalue 是

2022-03-02 00:02:45 649

原创 C++ 为什么要使用weak_ptr及其使用场景

我们知道std::shared_ptr会共享对象的所有权,但是有一些场景如果有一个像std::shared_ptr但是又不参与资源所有权共享的指针是很方便的。换句话说,是一个类似std::shared_ptr但不影响对象引用计数的指针。不参与资源所有权就意味着不会对资源的生命周期产生影响,有利于对象之间的解耦。举个一个不太恰当的例子,A和B相互加了微信,假设我们用一个指针来指向自己的微信朋友,如果是shared_ptr,那么A和B的生命周期是相互影响的,而实际上我们并不希望这种强绑定,比如假设B注销了账户,

2022-03-01 00:35:46 1459

原创 C++:enable_shared_from_this和shared_from_this的作用

shared_from_this的作用是返回一个指向this指针的有效shared_ptr.class Y: public enable_shared_from_this<Y>{public: shared_ptr<Y> f() { return shared_from_this(); }}int main(){ shared_ptr<Y> p(new Y); shared_ptr<Y>

2022-02-26 23:18:54 1224

原创 C++:shared_ptr内存布局

使用shared_ptr构造的布局:使用make_shared的布局:

2022-02-26 22:14:02 800

原创 C++ std::shared_ptr:为什么使用shared_ptr及其一些问题

C++11中的std::shared_ptr将两者组合了起来。一个通过std::shared_ptr访问的对象其生命周期由指向它的指针们共享所有权(shared ownership)。没有特定的std::shared_ptr拥有该对象。相反,所有指向它的std::shared_ptr都能相互合作确保在它不再使用的那个点进行析构。当最后一个std::shared_ptr到达那个点,std::shared_ptr会销毁它所指向的对象。就垃圾回收来说,客户端不需要关心指向对象的生命周期,而对象的析构是确定性的。

2022-02-20 23:19:41 2750

原创 RT-Thread控制台设备初始化

今天在研究RT-Thread日志模块ulog的时候发现最终log是通过控制台设备输出,控制台设备本质也是一个串口设备,于是就研究了一下串口设备。我们先来看一下log输出:rt_device_t dev = rt_console_get_device();rt_uint16_t old_flag = dev->open_flag;dev->open_flag |= RT_DEVICE_FLAG_STREAM;rt_device_write(dev, 0, log, len);dev

2021-10-23 12:27:41 559

原创 C++ std::condition_variable::notify_one()与notify_all()

std::condition_variable的成员函数notify_one()与notify_all()是用来唤醒阻塞在wait()的线程。假如有多个线程调用condition_variable::wait()陷入休眠之后。condition_variable的实现中有一个等待队列来保存堵塞在它之上的线程。当其他线程调用notify_one()时,只唤醒等待队列中的第一个线程;其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()才会唤醒。如果是调用notify_all

2021-10-20 22:14:56 2693

原创 std::condition_variable::wait_for

使用示例,和wait的区别是wait_for可以设置一个超时时间#include <iostream>#include <atomic>#include <condition_variable>#include <thread>#include <chrono>using namespace std::chrono_literals; std::condition_variable cv;std::mutex cv_m;int

2021-10-20 21:31:55 2565

原创 C++ std::condition_variable::wait

std::condition_variable提供了两个等待函数:wait()和wait_for().条件变量是需要和一个互斥锁mutex配合使用,调用wait()之前应该先获得mutex,当线程调用 wait() 后将被阻塞,直到另外某个线程调用 notify_one或notify_all唤醒了当前线程。std::condition_variable::wait1.void wait( std::unique_lockstd::mutex& lock );2template< cl

2021-10-20 20:44:55 4517 3

原创 C++条件变量std::condition_variable

使用示例#include <iostream>#include <string>#include <thread>#include <mutex>#include <condition_variable> std::mutex m;std::condition_variable cv;std::string data;bool ready = false;bool processed = false; void worke

2021-10-20 20:09:35 155

原创 优先级反转问题

优先级反转假设当前有任务A,B,C优先级分别为1,2,3(注意优先级数字越低,优先级越高)。此时如果高优先级的任务A、B正在处于挂起状态,最低优先级任务C正在运行并通过获取互斥量M进入临界区处理。稍后A、B任务就绪了,A任务优先级最高所以获得运行权限,从而抢占了C任务,A任务运行也需要获取互斥量M,而此时发现互斥量M已经被任务C占有。所以A任务就挂起在互斥量M上,只能等待C任务释放互斥量M才能得以运行。接着由于B任务已经是就绪态,并且优先级高于任务C,因此任务B获得运行,直到B运行完后,才使得任务C获得运

2021-10-19 20:58:07 269

原创 OSAL操作系统抽象层

背景我们知道操作系统可以简单的分为内核和上层应用。其中内核是用来管理计算机的各种硬件资源和软件资源,比如内存资源,cpu资源,网络资源,还有各种外设资源等等。而应用程序就是调用计算机的各种资源来完成特定的任务,比如需要申请内存来保存数据,需要申请网卡资源来发送数据等等。当然应用程序需要某个资源时需要向内核发出申请。而内核会向应用程序提供一些接口来申请资源,这些接口称之为系统调用。当然一般应用开发不会直接调用系统调用,因为使用不方便,一般调用的是各种标准库的接口,比如glibc.标准库对系统调用进行了封装,

2021-10-10 19:30:57 6033

空空如也

空空如也

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

TA关注的人

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