自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 音频方面的一些硬件常识

DMA是高效数据搬运的"搬运工",解放CPUI2S是音频数据的"传输协议",定义格式和时序适合普通立体声应用通过TDM技术扩展通道数,适合专业音频Multi-Channel I2S提供高通道数的物理接口,DMA负责高效搬运大量音频数据,CPU专注于高层音频处理和解码,共同实现高质量、实时的音频体验。这种架构不仅用于音频,类似的设计思想也广泛应用于其他数据流处理场景,如视频流、网络数据包、传感器数据采集等。

2025-12-16 10:33:41 469

原创 软件工程师补充芯片相关知识

特性Power Rail本质关时钟信号关电源供应电源供应网络本身目的降低动态功耗消除动态+静态功耗分配和输送电源电压实现层级RTL/门级,自动系统级,需特殊单元物理设计(布局布线)省电效果中等(只省动态)极强(全消除)不直接省电,是供电基础唤醒延迟极短(1个周期)很长(几千周期)不适用设计复杂性低高非常高(影响芯片成败)类比停掉生产线传送带拉掉整个工厂电闸工厂的输电网和电线Power Rail是“路”是“交通信号灯”(让车流停止),是“收费站闸口”(直接把路封了,彻底没车)。

2025-12-16 10:22:21 558

原创 关于DDR的一些科普

Channel第一级,通常在内存控制器层面。现代系统支持双通道、四通道等。每个通道是独立的数据通路和地址命令总线。你拥有的内存条会安装到不同的通道上,这提供了最顶层的并行性。Rank属于同一个通道内的结构。一个物理内存条(DIMM)上可以有一颗或多颗DRAM芯片。这些芯片并联在一起,共同组成一个数据位宽(如64位)的实体,就是一个Rank。同一个通道内可以有多个Rank(通过片选信号CS_n选择)。访问不同Rank的数据比访问同一Rank内不同Bank的延迟稍高,但可以隐藏预充电等操作。Bank这是。

2025-12-16 10:12:50 522

原创 池化技术的概括

malloc/free 或 new/delete 每次都可能涉及内核调用、锁竞争、碎片整理。对象池 + 线程池 → 避免线程/对象频繁创建销毁带来的锁竞争。:提前分配一批资源,然后重复使用,而不是每次都动态申请和释放。:减少分配/释放的开销、避免内存碎片、提升性能、降低延迟。:分配一块固定大小内存 / N 个对象 / M 个线程。:记录空闲资源、在池满/空时可能扩容或等待。大量小对象频繁申请/释放容易造成碎片。:高频率创建/销毁资源的场景。池化可以直接从预分配的块里拿。:从池里拿一个空闲资源。

2025-11-18 17:44:49 607

原创 NEON intrinsic 的命名

→ 128-bit 寄存器(4 个 float)→ 64-bit 寄存器(2 个 float)所有 NEON intrinsic 函数都以。→ vector duplicate(复制)从内存连续加载一组向量。

2025-11-18 17:32:54 362

原创 使用NEON指令集进行优化

以上是对卷积的优化。如果你一次只处理一个元素:需要 16 次 mul需要 16 次 add需要 16 次 loadCPU 负担重NEON 版本一次处理 4 个元素:4 次 load → 1 次 vld1q4 次 mul → 1 次 vmulq4 次 add → 1 次 vaddq🚀。

2025-11-18 17:29:03 157

原创 OpenMP使用

只需加入:-fopenmp。

2025-11-18 16:57:53 479

原创 关于xrun

period_size 越大 → 每次 IRQ 间隔越长 → 应用必须在 IRQ 前读取 period,否则可能丢帧。当 buffer 空时,DSP 依然写入数据 → buffer 中至少有一个 period 存数据。buffer 空 = 应用没读 → 不会丢数据 → 没有 underrun。buffer 满 = 新数据来不及写 → overrun → 数据丢失。buffer 越大 → 容忍应用读取慢 → 减少 overrun。buffer 满 = 写阻塞 → 不会丢数据。新数据来不及写 → 被丢弃。

2025-11-18 16:44:27 240

原创 关于audio的古老的笔记3

在注意:这里的 frame 指的是“声道打包后的最小单位”,例如 stereo 16bit → frame = 2*2 bytes = 4 bytes。

2025-11-18 11:24:17 334

原创 关于audio的古老的笔记2

参数物理意义DMA 每消耗 period_size frames,就触发一次 IRQring buffer 中 period 的个数,用于双缓冲或多缓冲ring buffer 总容量示例:period_size = 240 frames period_count = 2 buffer_size = 480 frames sample_rate = 48000 Hz latency = 480 / 48000 = 0.01 秒 = 10ms。

2025-11-18 11:19:00 519

原创 关于audio的古老的笔记

如果你在设备上做性能分析 /测延迟 (audio latency) 时,可以根据这些配置算理论延迟。:压缩格式(如 mp3 / AAC /其他 DSP 编码)播放,把压缩交给 DSP 处理,用 fragment 而不是 PCM 连续写。:超低延迟 (超实时) 模式,通常用于 no-IRQ /特殊 use-case,但 buffer 比较大 (总帧数高) 保证稳定。:期望很低延迟,buffer 小 (period 小, count 少),适合对实时性要求高(比如游戏音效、UI 音效)

2025-11-18 10:47:04 572

原创 C2ComponentStore

接口定义(Google AOSP,抽象类)。:厂商实现(Qualcomm,继承并实现 C2ComponentStore,用于硬件 codec)。其他厂商(联发科 MTK、三星 Exynos 等)也会有自己的或,逻辑类似。面向 HAL,封装 AIDL/HIDL,提供 API 给 framework 使用。就像「钥匙」,能打开 HAL 的 codec 工厂和组件。CCodec面向 Stagefright/MediaCodec 层,是 Codec2.0 的插件。内部依赖去真正调用 HAL。

2025-08-21 22:29:32 1004

原创 OMX_UseBuffer和OMX_AllocateBuffer的区别

你(客户端)分配内存,然后交给 OMX 使用。OMX 组件自己分配内存,你只拿到指针。OMX 自己调用malloc或 ION(甚至 gralloc)来分配内存你只拿到 buffer header,内部 buffer 归组件所有你先分配好内存(如malloc()),然后告诉 OMX 用这块内存组件不会再调用自己的分配器,而是直接使用你提供的 buffer使用让事情简单,使用提高性能和灵活性,但你要管理好 buffer 生命周期与内存属性。可被 DMA 或 IOMMU 访问(ION 或物理地址)

2025-08-06 08:19:23 659

原创 IntraRefreshVOP是什么

IntraRefreshVOP 是一种特殊的帧内刷新方式,通常用于 MPEG-4 或特定硬件平台上,能在不插入完整 I 帧的前提下刷新一部分帧内容为帧内编码,从而达到节省码率和提升抗误码能力的目的。如你使用的是 Qualcomm 平台,并看到这个参数出现在 HAL 或 OpenMAX 中,可能是历史兼容逻辑或者平台特定优化路径。

2025-08-06 08:07:08 3519

原创 QOMX_INDEXEXTRADATATYPE.nIndex

中的一些枚举值,这些值用于配置视频编码器在每帧输出中附带的,以便后续模块(如帧处理器、播放器、网络传输等)可以获取更多关于帧的信息。这些是(QOMX - Qualcomm OMX),在使用 Qualcomm 视频编码器(如 Snapdragon 平台)时非常常见。

2025-08-06 07:58:15 676

原创 OMX_IndexParamVideoIntraRefresh(output port)

帧内刷新是一种视频压缩技术,用于替代频繁插入完整的 I 帧,以降低码率波动,同时还能让码流具备较好的错误恢复能力(例如在网络丢包时)。编码器按照固定顺序周期性地将一些宏块(macroblocks)刷新为帧内编码(类似于局部 I 帧)。:通常是视频编码器的输出端口(即 compressed stream output)。综合使用两种策略,有更强的鲁棒性,但可能稍微增加编码复杂度。编码器根据图像内容或错误概率判断哪些宏块需要帧内刷新。枚举值),用于配置视频编码器的。:指定帧内刷新方式,下面详细解释。

2025-08-06 07:46:17 396

原创 Default node,Bypassable node,Inplace node

这几个术语(Default Node、Bypassable Node、Inplace Node)是指。

2025-07-23 09:58:26 442

原创 使用错误的 gralloc usage flag甚至会掉帧

Gralloc(Graphics Allocation)是 Android HAL 中用于 GPU/Camera/Display/Codec 等模块分配图形 buffer 的服务。这些 buffer 的用途千差万别,所以需要使用一组标志()告诉 gralloc:谁会访问这个 buffer(CPU 还是 GPU 还是硬件 codec)?怎么访问(读?写?频繁?偶尔?是否需要物理连续内存?是否用于 DMA?缺少正确的。

2025-07-23 09:36:05 486

原创 CHI定制

Pipeline 决定了一帧图像是怎么被处理的,比如:是否经过 IPE / BPS / FD / JPEG 节点是否分成多个输出路径(例如 Preview + Snapshot)

2025-07-23 08:38:54 432

原创 多camera同步

层级同步目标实现机制Sensor 层同步快门采集HAL Session 层同步 Request同步提交、GroupID、DeferThreadCHI Usecase 层同步结果处理pipeline join、统一 output 拼接pacer/follower 模型虽然是来自 display,但它的思想在 camera 中同样存在,只是换了名字和实现机制。

2025-07-23 08:33:44 1435

原创 compare_exchange_weak详解

对于类型的变量atomic_var特点内容功能CAS(Compare And Swap):相等就替换类型weak允许虚假失败,适合 retry 循环关键参数expected是传引用,会在失败时被更新用途lock-free 数据结构(栈、队列、哈希表)和锁对比更高性能、更复杂、更容易出错常见错误忘了处理 expected 被修改、忽视内存序影响会自动更新expected// 读当前 head!// CAS 尝试替换 head为什么不重新load()也可以继续工作?

2025-06-26 10:54:16 1082

原创 C++内存序memory_order

C++ 原子操作提供,分别控制编译器和 CPU 如何对内存操作进行重排序优化,确保并发程序在多线程之间的行为可控、正确。

2025-06-25 14:21:26 973

原创 std::atomic_flag实现自旋锁

代码解释:这段代码实现了一个简单的自旋锁(spinlock),其中用到了,它是 C++ 提供的最轻量级的原子类型之一,专门用于实现自旋锁等低级同步原语。

2025-06-25 14:06:30 287

原创 两段快排代码

注意其中splice函数的作用:转移元素。

2025-06-18 16:33:16 207

原创 对future,promise,async,packaged_task的彻底理解

future的引入是为了解决thread并不提供直接接收返回值的机制的问题。的设计理念是:只负责调度和执行线程函数,不负责管理其结果。所以,如果你想要线程函数返回值,你需要使用 std::future配合 std::async或 std::promise来实现。

2025-06-18 10:48:13 372

原创 为什么 C++ 的 const 成员函数也要加锁?mutable 的使用详解

如果另一个线程正在调用 push(),你这边的 empty() 就可能访问到未同步的状态,从而导致数据竞争、未定义行为。// ✅ mutable 允许在 const 函数中加锁。std::mutex 是可变状态,需要 mutable 才能在 const 函数里使用;C++ 官方文档:mutable、std::mutex、std::lock_guard。你在 const 成员函数里调用它会报错,因为你不能修改非 mutable 成员。std::mutex::lock() 是非 const 的成员函数;

2025-06-18 10:00:49 581

原创 atomic的使用例子

这种情况下可以代替Mutex的使用(注释掉的部分)

2025-06-17 15:51:55 135

原创 深入理解 std::thread 参数传递中的引用问题:左值、右值、万能引用与 std::forward 的背后

深入理解 std::thread 参数传递中的引用问题:左值、右值、万能引用与 std::forward 的背后。std::move 是强制右值,std::forward 是条件转发。std::thread 默认复制参数,传引用要用 std::ref。std::ref 和 std::forward 的实际意义。

2025-06-17 14:54:59 431

原创 线程函数传参的陷阱

以上这个代码的问题解释如下:这是一个。

2025-06-17 14:38:50 664

原创 td::thread my_thread(background_task()); std::thread my_thread((background_task()));的区别

写法实际含义是否正确声明了一个函数❌ 错误调用函数并传给✅ 正确花括号方式,避免解析歧义✅ 正确。

2025-06-17 11:20:23 174

原创 多线程协作问题(面试问题)

目标是使用三个线程,让它们依次打印数字 1、2、3,并且循环这个过程。今天才知道,之前某司面试的时候我根本没写对。

2025-06-11 15:05:14 117

原创 FrameLength和Shutter

项目说明Shutter 单位✅ 行(lines)LineTime 单位✅ 时间,= LineLength / PCLK✅ 就是总曝光时间FrameLength = Shutter 是否可行?❌ 不推荐:没有 margin 会导致读取问题实际做法。

2025-06-06 09:27:19 217

原创 erase-remove idiom介绍

lists是一个vector类型的变量。remove_if。

2025-06-03 10:52:04 194

原创 unordered_map的遍历方法

注意strings的类型不是指针。

2025-06-01 09:06:16 191

原创 unordered_map增加元素的接口学习

方法会自动创建 key 吗?是否覆盖已有 key?是否构造 value?推荐用途✅ 是✅ 是✅ 默认构造后赋值简洁更新或插入❌ 否❌ 否✅ 构造后判断仅插入❌ 否❌ 否✅ 直接构造原地插入性能更优❌ 否❌ 否✅ 仅必要时构造高效插入。

2025-06-01 08:42:41 454

原创 gralloc的layer count字段

项目行为gralloc 分配时设置GPU/Display HAL 处理按层访问内存、分别渲染、或者合成Camera HAL 处理多帧捕捉,按 layer 拆开处理本质:layer count > 1 只是一种优化手段,让一次分配的内存能承载更多数据,减少多次分配和管理的开销。属性来源说明layerCountAOSP 原生表示一个 buffer 包含几个图层(非帧数)高通是否定制否(字段原生支持),但可能有定制用法会结合使用场景(如 Camera、VR)做一些定制处理常见用途。

2025-04-29 11:27:58 830

原创 __iomem不能解引用(deref)

为什么不能直接 ?因为 MMIO 区域可能:访问延迟:不像 RAM,可以缓存 + 快速访问副作用强:写入某寄存器会触发中断、DMA 等不支持缓存 / 缓冲操作 会加上 + ,确保顺序和正确性

2025-04-21 16:54:58 208

原创 MMIO、IOMAP 和 IOMMU 总结

MMIO 是将外设的寄存器映射到内存地址空间中的一种机制,使得 CPU 可以像读写内存一样访问硬件寄存器。ioremap()是 Linux 内核提供的一个函数,用于将 MMIO 物理地址映射到内核虚拟地址空间,让驱动能用指针读写设备寄存器。IOMMU 是为设备提供地址转换的 MMU,作用是在设备访问内存(DMA)时,将其使用的虚拟地址(IOVA)翻译为实际的物理地址(PA)。

2025-04-21 16:46:06 1278

原创 volatile的进一步深入理解

特性volatile/ 加锁防编译器优化✅ 是✅ 是防 CPU 重排序❌ 否✅ 可选(acquire 等)保证原子性❌ 否✅ 是多线程下安全⚠️ 有条件✅ 是驱动开发适用✅ 非常适合❌ 不适合。

2025-04-18 17:06:33 334

原创 volatile 和 memory barrier 的组合用法

volatile是给编译器的提示,memory barrier 是给CPU的命令。“写完再标记”“先设寄存器 A,再设寄存器 B”“先检查条件,再做动作”

2025-04-18 16:55:18 496

空空如也

空空如也

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

TA关注的人

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