- 博客(117)
- 收藏
- 关注
原创 IPC核间通信底层原理:以PL320为例
讲到IPC可能很多同学想到的是InterProcess Communication进程间通信,但是本文主要是讲另一种Inter-processor communication,处理器间通信,也叫核间通信,名字很像不要搞混。core必须获取邮箱才能发送消息。为此,core将其一个 Channel ID 写入 Mailbox Source Register,然后再次读取 Mailbox Source Register 以检查写入是否成功。
2024-09-01 11:29:27 916
原创 清除系统缓存提高写盘速度的tips
当内存中存储了大量数据缓存时,系统的可用内存会减少。在内存资源紧张的情况下,执行 echo 3 > /proc/sys/vm/drop_caches 可以清理内存中的页缓存、目录项缓存(dentries)和 inode 缓存,从而释放出更多的内存空间供程序使用。如果系统即将进行新的数据缓存或处理操作,尤其是涉及大量数据的处理任务时,清理缓存可以释放内存,为后续操作提供更多的可用内存。这个命令部分的作用是通过向 /proc/sys/vm/drop_caches 文件写入一个值,来指示内核清理特定的内存缓存。
2024-08-26 17:09:54 1067
原创 C语言自动生成宏定义枚举类型和字符串
ErrorStrings:通过宏展开生成的字符串数组,数组中的每个元素对应一个错误码的字符串表示。GENERATE_STRING:宏定义,用于将枚举值转换为字符串。GENERATE_ENUM:宏定义,用于生成枚举值。ERROR_LIST:宏定义,用于列举所有错误码。
2024-08-21 14:22:24 280 2
原创 SerDes camera简介
随着图像处理技术的长足进步,高端嵌入式视觉相机被开发出来,并广泛用于边缘AI,机器人、智能交通系统、自动购物系统,监控系统等各种现代嵌入式设备。camera常用的接口是MIPI高速接口,MIPI的传输距离受限,传输距离过大容易导致信号质量不佳,影响图像数据的传输,所以经常会使用到serdes,以增加传输距离,在车载领域更加常见。USB摄像头大多数使用USB2.0协议,传输带宽在480Mbps,直接通过USB数据线连接到电脑,其优点是即插即用,无需复杂的驱动,但缺点是连接不稳定,容易断开,传输带宽也比较低。
2024-08-18 18:05:31 921
原创 链接库文件体积优化工具篇:bloaty
笔者之前参与过一个嵌入式智能手表项目,曾经碰到过这样一个问题:手表的flash大小只有2M,这意味着只能在上面烧录2M大小的代码。随着开发不断进行,代码越写越多,编译出来的bin也越来越大。最后bin大小超过了2M, 就没法烧写了,很尴尬。最后只能想办法精简代码,当然这是在不影响功能的前提下精简代码。那如何精简代码呢?我们自然会想到先看看哪里的代码最多,比如使用的各个so的大小,so里边哪个源文件最大,源文件里边哪一个函数最耗空间等等,先做一个统计分析,然后再看一下怎么优化。那这个统计如何进行呢?
2024-05-26 23:18:10 640
原创 ISP图像处理pipeline简介2
上一篇文章介绍了ISP pipeline中的3A和镜头传感器校正。现在继续介绍pipeline中的其它流程。上一篇文章主要讲了镜头,sensor相关的处理流程,pipeline接下来的一步是颜色插值。sensor直接输出的图片是raw格式,需要经过isp处理之后才是平时常见的JPEG等格式的图片。
2024-04-20 17:32:55 1208 2
原创 存储器管理单元MMU概述
在ARM系统中,存储器管理单元MMU主要完成以下工作:● 虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU就要实现从虚拟地址到物理地址的转换。● 存储器访问权限的控制。● 设置虚拟存储空间的缓冲的特性。页表(Translate Table)是实现上述这些功能的重要手段,它是一个位于内存中的表。
2024-04-14 17:27:03 675
原创 ISP图像处理pipeline简介1
它是用来干什么的呢?不同的ISP可能会以不同的顺序或方式应用这些步骤并且往往更加复杂,但一般包含这些步骤:3A(auto focus, auto exposure, auto white balance, 自动对焦, 自动曝光,自动白平衡),ISO增益,raw图片的各种处理,Demoasicing解马赛克,降噪,色彩空间转换,镜头和sensor校正,色彩校正,对比度和动态范围的调整,锐化,编码压缩等等。镜头是由透镜组成,由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真(包括形状,亮度,色彩)。
2024-04-13 22:54:13 2056
原创 MIL、SIL、PIL、HIL在环测试简介
在进行车载软件开发时经常会听到MIL、SIL、PIL和HIL等各种测试,它们都是什么意思呢?它们之间的区别是什么呢?
2024-03-17 21:16:56 3083
原创 H264/265 SEI 简介
在音频和视频流中,补充增强信息(SEI)是插入到比特流中的附加数据,以传达额外的信息,这些信息可以与相关的音频和视频内容精确同步接收。在音视频内容的编码和传输过程中可以插入SEI。可以在SEI中添加各种类型的信息,例如相机或编码器的参数, 事件戳,隐藏式字幕,歌词,和版权信息。虽然标准定义了如何将 SEI 消息插入码流的语法和语义,但并不要求解码器能够处理此信息。因此,如果设备不支持 SEI 数据,则 SEI 数据可能会在内容分发链中的某个时间点被丢弃。
2024-03-17 18:01:33 2209
原创 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 1471
原创 视频编码码率控制
码率控制是编码器的一个重要模块,主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分,但是它并不是编码标准的一部分,也就是说,标准并没有给码控设定规则。我们平时用的编码器的码控都是编码器程序自己实现的。那码控的原理是什么呢?其实码控就是为每一帧编码图像选择一个合适的 QP 值的过程。我们知道当一帧图像的画面确定了之后,画面的复杂度和 QP 值几乎决定了它编码之后的大小。
2023-12-24 12:00:34 611
原创 camera同步信号
没读完一行就发送一个HSYNC信号,然后读取下一行。如果这些摄像头之间不进行时间同步,那么各个摄像头成像的时间就不一致,存在误差,会对后续的流程产生不良影响,比如融合感知的精度会受到很大影响。FSYNC:frame synchronization,帧同步信号,通常是从sensor外部输入的同步信号,用来控制sensor的曝光时机,即控制sensor在指定的时机曝光。一种可行的办法是让相机的每一帧都由外部FSYNC信号触发,即由外部host在同一时间统一给各个sensor发送同步信号来触发曝光。
2023-12-23 21:37:01 2738
原创 camera曝光时间
针对曝光和readout这两个步骤,相机操作有两种常见的方法:“non-overlapped”的曝光和“overlapped”的曝光。曝光:曝光是图像传感器进行感光的一个过程,相机曝光时间,也就是快门速度,曝光即曝光时间控制,控制感光元件上总的光通量。对于面阵相机,它通常是每秒收集的帧数(帧/秒),而对于线阵相机,它是每秒收集的。由于人眼特殊的生理结构,如果被观看的图像的帧率高于16fps,则认为是连续的。有人问为什么我们在使用工业相机的时候,增加相机的曝光时间后,相机的帧率下降,而且下降得很严重。
2023-12-17 13:36:40 1926
原创 camera卷帘快门(Rolling Shutter)与全局快门(Global Shutter)
首先来看一下什么叫快门:快门是照相机用来控制感光元件有效曝光时间的装置。可以理解为光线要想打到相机传感器上必经的一道门。如果快门关着,那么光线进不去,感光元件就无法曝光;门开了,光线进来了,感光元件开始曝光,开始成像。从结构上来划分,快门可以分为机械快门和电子快门。机械快门在单反上用的比较多,就是挡在感光元件前面的幕帘。如下图所示与机械快门相对的是电子快门,也称电磁式快门。
2023-12-16 17:06:47 2532 1
原创 图像特征提取-角点
图像特征图像特征要有区分性,容易被比较。一般认为角点,斑点等是较好的图像特征特征检测:找到图像中的特征特征描述:对特征及其周围的区域进行描述。
2023-12-13 22:56:16 440
原创 H264码流结构
视频编码的码流结构是指视频经过编码之后得到的二进制数据是怎么组织的,或者说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数据是一帧图像,哪一块数据是另外一帧图像。而我们在工程开发中,需要对编码后的数据进行一些解析,以便用于之后的打包。同时我们在打包时也需要判断当前一帧图像数据它的开头和结尾在哪。
2023-12-10 23:22:42 981
原创 __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 156
原创 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 323
原创 拜耳阵列(Bayer Pattern)和解马赛克简介
拜尔阵列由柯达的布莱斯·拜尔发明,拜尔阵列将更多的像素用于绿色,而不是红色和蓝色,因为人眼对绿色更敏感。但这张照片,每个像素只有rgb中的一种颜色,每个像素还缺少其它两个颜色分量,效果如下图3所示。典型的图像传感器(例如我们在数码相机中使用的图像传感器,主要有CCD, CMOS)由许多单独的光电传感器组成,所有这些传感器都会捕获光线。如果想要获得不同颜色的光,最直接的做法是加入不同颜色的滤镜,从而滤出 RGB 三个通道的颜色。这个覆盖层可以理解为一个过滤层,每种类型的过滤器通常只允许一种颜色的光线的通过。
2023-10-29 17:32:56 2685
原创 linux实时性分析
操作系统的实时性是指执行一个特定任务的时间是确定的和可预测的,这个任务执行时限需要考虑任何的情况,包括最恶劣的情况。或者说操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果,也就是指任务执行的及时性。这里以车辆紧急制动为例,这个任务的响应时间就是车载系统收到紧急制动指令到真正实施紧急制动这个动作所需的时间,我们当然希望这个时间是确定的而且是及时的,即需要保证在最恶劣的情况下也能保证在一定的时间内完成,否则车企可能就要上热搜了。
2023-04-16 22:39:28 1582 1
转载 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 270
原创 C++ define和const , typedef,inline 的区别
define 和 typedef 的区别原理:#define 作为预处理指令,在编译预处理时进行替换操作,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef 是关键字,在编译时处理,有类型检查功能,用来给一个已经存在的类型一个别名,但不能在一个函数定义里面使用 typedef 。功能:typedef 用来定义类型的别名,方便使用。#define 不仅可以为类型取别名,还可以定义常量、变量、编译开关等。作用域:#define 没有作用域的限制,只要是之前预定义过的宏,在
2022-05-28 12:20:36 260
原创 TCP TIME_WAIT相关的一些问题
问题1:CLOSE-WAIT 和 TIME-WAIT 的状态和意义在服务器收到客户端关闭连接的请求并告诉客户端自己已经成功收到了该请求之后,服务器进入了 CLOSE-WAIT 状态,然而此时有可能服务端还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务器在关闭连接之前将待发送的数据发送完成。TIME-WAIT 发生在第四次挥手,当客户端向服务端发送 ACK 确认报文后进入该状态,若取消该状态,即客户端在收到服务端的 FIN 报文后立即关闭连接,此时服务端相应的
2022-05-15 22:41:31 387
原创 c++内存布局
C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。堆:动态申请的内存空间,就是由 malloc 或new分配的内存区域,由开发者控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。内存泄露发生的区域。全局区/静态存储区(.bss 段和 .data 段):存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分
2022-05-14 23:22:17 877
原创 c++/c程序编译过程
编译过程分为四个过程:编译(编译预处理、编译、优化),汇编,链接。编译预处理:处理以 # 开头的指令;编译、优化:将源码 .cpp 文件翻译成 .s 汇编代码;汇编:将汇编代码 .s 翻译成机器指令 .o 文件;链接:汇编程序生成的目标文件,即 .o 文件,并不会立即执行,因为可能会出现:.cpp 文件中的函数引用了另一个 .cpp 文件中定义的符号或者调用了某个库文件中的函数。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序 .exe 文件。链接分为两种:静态链接:代码
2022-05-14 23:16:37 222
原创 查找数组中的第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 1447
原创 我所理解的CPU中断
什么是中断假设你在玩王者荣耀,突然一个电话过来…, 这就是中断!对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可
2022-03-06 16:37:09 4299 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 679
原创 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 1833
原创 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 1654
原创 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 3014
原创 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 667
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人