Camera HAL ThreadManager概述

Camera HAL 多线程管理详解 本文摘要:Camera HAL 采用双线程管理体系(CAMX与CHI-CDK)实现高效并发处理。CAMX ThreadManager负责HAL内部及框架交互,采用线程池+任务调度机制,将节点处理、回调等封装为Job异步执行;CHI ThreadManager专注于OEM定制逻辑,支持异步/同步两种作业模式。两套系统通过函数指针解耦但共享地址空间,共同实现硬件流水线的强实时性。文章详细解析了两者的类层次架构、核心数据结构及典型应用场景,并提供了问题排查的代码切入点,为Camera HAL开发与性能优化提供指导 阅读详情

ThreadManager概述

一、概述

Camera HAL 中存在 两套独立的 ThreadManager 实现,分别服务于不同的框架层:

特性CamX ThreadManagerCHI ThreadManager
适用层CamX 核心框架CHI Feature2 框架
最大线程数1516
最大注册作业512256
最大运行时作业4096-
同步作业不支持支持(Sync Thread)
顺序添加不支持支持(addInOrder)
作业分割支持(isSplitable)不支持
序列化执行支持(isSerialize)不支持

二、CamX ThreadManager 架构

2.1 组件层次图

┌─────────────────────────────────────────────────────────────────┐
│                        ThreadManager                            │
│                     (对外 API 门面)                              │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │ JobRegistry  │  │   JobList    │  │     ThreadCore      │  │
│  │ 作业注册表    │  │  运行时作业池 │  │    线程核心引擎     │  │
│  └──────────────┘  └──────────────┘  └──────────────────────┘  │
│                                              │                   │
│                                    ┌─────────┐                  │
│                                    │JobQueue │                  │
│                                    │优先级队列│                  │
│                                    └─────────┘                  │
└─────────────────────────────────────────────────────────────────┘

2.2 核心数据结构

JobHandle 编码格式
┌─────────────────────────────────────┬─────────────────────────────┐
│     高 32 位: uniqueCounter         │     低 32 位: slot         │
│         (唯一标识计数器)             │      (注册表槽位索引)       │
└─────────────────────────────────────┴─────────────────────────────┘
RegisteredJob(已注册作业族)
struct RegisteredJob {
    JobFunc     funcAddr;           // 作业函数地址
    CHAR        name[128];          // 作业名称
    JobCb       flushDoneCb;        // Flush 完成回调
    JobPriority priority;           // 优先级 (Critical/High/Normal)
    BOOL        isSerial;          // 是否序列化执行
    UINT32      uniqueCounter;     // 唯一计数器
    UINT32      slot;              // 注册表槽位
    UINT32      jobCount;          // 挂起作业数
    UINT32      inflightCount;     // 正在执行数
    UINT32      holdCount;         // 等待中的作业数
    UINT32      submittedCount;    // 已提交待执行数
    FlushStatus flushStatus;       // Flush 状态
    RuntimeJob* pFirstJob;          // 链表头
    RuntimeJob* pLastJob;           // 链表尾
    UINT32      cameraId;          // 相机 ID
};
RuntimeJob(运行时作业)
struct RuntimeJob {
    UINT64      hJob;                      // 作业族句柄
    CHAR        name[256];                 // 作业名称
    JobCb       stoppedCb;                 // 停止回调
    VOID*       pData[MaxDataPartition];   // 数据分区数组
    BOOL        isSplitable;               // 是否可分割
    BOOL        isBlocking;                // 是否阻塞执行
    UINT32      numPartitions;             // 数据分区数
    JobStatus   status;                    // 作业状态
    UINT32      slot;                      // JobList 槽位索引
    Semaphore*  pJobSemaphore;             // 阻塞信号量
    RuntimeJob* pNext;                     // 下一个串行作业
};
作业状态机
                 ┌───────────────────────────────────────────────┐
                 │                                               │
    ┌─────────┐  │  ┌─────────┐  ┌─────────┐  ┌─────────┐      │
    │Submitted│──┼─>│  Ready  │──>│On Hold  │──>│Stopped  │      │
    └─────────┘  │  └─────────┘  └─────────┘  └─────────┘      │
        入队      │  可执行       等待前置作业    Flush 停止       │
                 │                                               │
                 └───────────────────────────────────────────────┘

2.3 各组件职责

JobRegistry(作业注册表)
  • 职责:
    • 管理所有已注册的作业族
    • 提供注册/注销接口
    • 维护作业计数统计(jobCount/inflightCount/holdCount/submittedCount)
    • 实现 Handle 编解码
class JobRegistry {
    RegisteredJob   m_registeredJobs[512];    // 作业族数组
    BOOL            m_registeredSlots[512];   // 槽位占用标记
    UINT32          m_counter;               // 唯一计数器
    Mutex*          m_pRegistryLock;         // 注册表锁
    Mutex*          m_pFlushJobSubmitLock;    // Flush 与提交的同步锁
};
JobList(运行时作业池)
  • 职责:
    • 提供 RuntimeJob 对象的分配/回收
    • 使用空闲链表管理可用槽位
    • 避免频繁的内存分配/释放
class JobList {
    RuntimeJob  m_jobList[4096];           // 运行时作业数组
    JobSlot     m_freeList[4096];          // 空闲链表
    UINT32      m_freeHead;                // 链表头
    UINT32      m_freeTail;                // 链表尾
    UINT32      m_jobOccupancy;            // 当前占用数
};
ThreadCore(线程核心)
  • 职责:
    • 创建/销毁工作线程
    • 管理优先级队列
    • 分发作业执行
    • 处理 Flush/Sync 操作
    • 集成健康监控
class ThreadCore {
    JobQueue    m_jobQueues[3];            // Critical/High/Normal 三个优先级队列
    ThreadConfig m_workers[15];            // 工作线程配置
    Condition*  m_pReadOK;                 // 线程唤醒条件变量
    volatile BOOL m_stopped;               // 停止标志
    volatile BOOL m_jobPending;            // 新作业标志
};
JobQueue(优先级队列)
  • 职责:
    • 实现作业入队/出队
    • 支持条件出队
    • 队列加锁保护

2.4 核心流程

创建流程
ThreadManager::Create()
    └─ new ThreadManager()
    └─ Initialize()
        ├─ new JobRegistry() -> Initialize()
        ├─ new JobList() -> Initialize()
        └─ new ThreadCore() -> Initialize()
            └─ StartThreads()
                └─ 创建 numThreads 个工作线程
注册作业族流程
ThreadManager::RegisterJobFamily()
    └─ JobRegistry::RegisterNewJob()
        ├─ 检查是否已注册
        ├─ 查找空闲槽位
        ├─ 填充 RegisteredJob 结构
        └─ 生成 JobHandle (counter << 32 | slot)
提交作业流程
ThreadManager::PostJob(hJob, stoppedCb, ppData, isSplitable, isBlocking)
    └─ ThreadCore::AcceptNewJob()
        ├─ JobList::AcquireJobEntry() // 分配 RuntimeJob
        ├─ 处理作业分割(isSplitable)
        ├─ JobQueue::Enqueue()        // 加入优先级队列
        └─ Trigger()                  // 唤醒工作线程
            └─ m_pReadOK->Broadcast()
工作线程执行流程
ThreadCore::WorkerThreadBody()
    └─ DoWork(threadIndex)
        while (!m_stopped) {
            // 等待新作业
            m_pReadOK->Wait()
            
            // ProcessJobQueue
            ProcessJobQueue(threadIndex)
                ├─ 从高优先级队列开始取作业
                ├─ JobQueue::CheckAndDequeue()
                │   ├─ 检查 Flush 状态
                │   ├─ 检查 Serial 依赖
                │   └─ 返回符合条件的作业
                ├─ 健康监控处理
                └─ DispatchJob(pJob)
                    └─ func(pData) // 执行作业函数
        }
Flush/Sync 流程
ThreadManager::FlushJobFamily(hJob, pUserData, isBlocking)
    └─ ThreadCore::SyncOrFlushJob(hJob, pUserData, isBlocking, FlushRequested)
        ├─ JobRegistry::StartSyncOrFlush()
        │   ├─ 设置 flushStatus = FlushRequested
        │   └─ 设置 blockFlush = TRUE
        ├─ 唤醒所有工作线程处理剩余作业
        ├─ JobRegistry::WaitForSyncOrFlush()
        │   └─ pFlushSemaphore->Wait()
        └─ JobRegistry::CheckAllFlushDone()
            ├─ 检查 inflight count == 0
            ├─ 调用 flushDoneCb
            └─ Signal() 释放等待者

2.5 CamX 特有特性

作业分割(Job Splitting)
// PostJob 时可以指定 isSplitable = TRUE
// 系统会将 ppData 数组中的每个分区作为独立子作业执行
// 所有子作业完成后视为整个作业完成

m_pCore->AcceptNewJob(hJob, stoppedCb, ppData, 
    TRUE,  // isSplitable
    isBlocking, maxExecTime, pJobName);
序列化执行(Serialization)
// 注册时指定 isSerialize = TRUE
// 同一家族的作业必须串行执行
// JobQueue::CheckAndDequeue 会检查:
//   - 如果上一个作业仍在执行,则当前作业进入 OnHold 状态
//   - 只有前驱作业完成后,后继作业才能进入 Ready 状态
阻塞调用(Blocking)
// PostJob 时指定 isBlocking = TRUE
// 调用方会阻塞等待作业完成

// ThreadCore 会为该作业创建 Semaphore
pJob->pJobSemaphore = Semaphore::Create();
// 作业执行完成后 Signal
pJob->pJobSemaphore->Signal();
// 调用方 Wait
pJob->pJobSemaphore->Wait();

三、CHI ThreadManager 架构

3.1 组件结构

CHI ThreadManager 没有将组件拆分为独立的类,而是将所有逻辑集成在 CHIThreadManager 类中。

class CHIThreadManager : public IMonitorClient {
    ChiRegisteredJob  m_registeredJobs[256];    // 已注册作业数组
    ChiThreadConfig    m_workers[16];           // 工作线程配置数组
    std::deque<ChiRuntimeJob*> m_pq;            // 全局异步作业队列
    std::array<..., 50> m_inflightJobs;         // HMS 监控的进行中作业
};

3.2 核心数据结构

ChiRuntimeJob(运行时作业)
struct ChiRuntimeJob {
    UINT64         hJob;            // 作业句柄
    VOID*          pData;           // 作业数据
    UINT64         sequenceNum;     // 序列号
    ChiJobStatus   status;          // Submitted/Stopped/Invalid
    BOOL           isSync;          // 是否同步作业
    ChiJobPriority priority;        // Default/Critical
    UINT32         threadId;        // 执行线程 ID(Sync 作业)
    UINT64         execStartTime;   // 执行开始时间
    UINT64         maxExecTime;     // 最大执行时间
    pid_t          pid;             // 进程 ID
    pid_t          tid;             // 线程 ID
};
ChiRegisteredJob(已注册作业族)
struct ChiRegisteredJob {
    JobFunc                  funcAddr;         // 作业函数地址
    CHAR                     name[255];        // 作业名称
    BOOL                     isSync;           // 是否同步作业
    BOOL                     isUsed;           // 槽位是否占用
    UINT64                   hRegister;        // 注册句柄
    volatile UINT32          inFlight;         // 进行中作业数
    volatile UINT32          jobPending;      // 队列中是否有作业
    JobFlushStatus           flushStatus;      // Flush 状态
    Condition*               pSyncJobCondn;    // Sync 线程条件变量
    Condition*               pFlushOK;        // Flush 完成条件
    Condition*               pSyncOK;         // Sync 完成条件
    Mutex*                   pQueueLock;       // 主队列锁
    Mutex*                   pHelperPQLock;    // 辅助队列锁
    BOOL                     addInOrder;       // 是否按序添加
    UINT64                   sequenceCounter;  // 序列号计数器
    UINT32                   cameraId;         // 相机 ID
    ChiThreadConfig          worker;           // Sync 线程配置
    std::deque<ChiRuntimeJob*> pq;             // 主作业队列
    std::deque<ChiRuntimeJob*> helperPQ;       // 辅助作业队列(乱序时使用)
};
ChiThreadConfig(线程配置)
struct ChiThreadConfig {
    UINT32                   threadId;        // 逻辑线程号
    OSThreadHandle           hWorkThread;     // 系统线程句柄
    JobFunc                  workThreadFunc;  // 线程入口函数
    VOID*                    pContext;        // 上下文指针
    Mutex*                   pQueueLock;      // 队列锁
    ChiThreadStatus          status;          // 线程状态
    BOOL                     isUsed;          // 是否被 Sync 作业占用
    Condition*               pJobCondn;       // 唤醒条件变量
    JobHandle                hJob;            // 关联的作业句柄
    std::deque<ChiRuntimeJob*>* pq;          // 关联的作业队列
};

3.3 CHI 特有特性

同步作业(Sync Job)
// 注册时指定 isSync = TRUE
// 系统会为该作业族创建独立的线程

CHIThreadManager::CreateSyncThread(rRegJob)
    ├─ 创建专用 Condition (pSyncJobCondn)
    ├─ 配置 ChiThreadConfig
    └─ ThreadCreate() 创建独立线程

// 同步作业线程独立于线程池,专门处理该作业族
顺序添加(addInOrder)
// 注册时指定 addInOrder = TRUE
// 作业必须按 sequenceNum 递增执行
// 乱序到达的作业会暂存到 helperPQ

CHIThreadManager::AddToHelperQueue(pJob)
    ├─ 如果 sequenceNum <= sequenceCounter + 1
    │   └─ 直接加入主队列
    └─ 否则
        └─ 加入 helperPQ 并排序

CHIThreadManager::PostJob(hJob, pData, sequenceNum)
    ├─ AddToHelperQueue(pRuntimeJob)
    └─ 如果 helperPQ 头部可接受
        └─ 移入主队列并触发执行
双队列模型
┌─────────────────────────────────────────────────────┐
│                 CHIThreadManager                     │
│                                                      │
│  ┌─────────────────────────────────────────────┐    │
│  │            异步线程池 (m_workers)           │    │
│  │                                              │    │
│  │   m_pAsyncCondn ──> 唤醒所有异步线程        │    │
│  │                                              │    │
│  │   ┌────────────────────────────────────┐    │    │
│  │   │  全局异步队列 (m_pq)              │    │    │
│  │   │  ┌───┐ ┌───┐ ┌───┐              │    │    │
│  │   │  │Job│ │Job│ │Job│ ...          │    │    │
│  │   │  └───┘ └───┘ └───┘              │    │    │
│  │   └────────────────────────────────────┘    │    │
│  └─────────────────────────────────────────────┘    │
│                                                      │
│  ┌─────────────────────────────────────────────┐    │
│  │     Sync 线程(每个 Sync 作业族独立)       │    │
│  │                                              │    │
│  │   pSyncJobCondn ──> 唤醒指定 Sync 线程     │    │
│  │                                              │    │
│  │   ┌────────────────────────────────────┐    │    │
│  │   │  每个作业族独立队列 (regJob.pq)    │    │    │
│  │   │  ┌───┐ ┌───┐ ┌───┐              │    │    │
│  │   │  │Job│ │Job│ │Job│ ...          │    │    │
│  │   │  └───┘ └───┘ └───┘              │    │    │
│  │   └────────────────────────────────────┘    │    │
│  └─────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

3.4 CHI 核心流程

创建与启动
CHIThreadManager::Create(ppInstance, pName, numThreads)
    └─ new CHIThreadManager(numThreads)
    └─ Initialize(pName)
        ├─ 创建 Mutex/Condition 同步原语
        └─ StartThreads()
            └─ 创建 numThreads 个异步工作线程
注册流程
CHIThreadManager::RegisterJobFamily(jobFunc, name, phJob, isSync, addInOrder)
    ├─ 加锁 m_pRegisteredJobLock
    ├─ 检查是否已注册
    ├─ 查找空闲槽位
    ├─ 初始化 ChiRegisteredJob
    │   ├─ 创建 Condition/Mutex
    │   ├─ 设置 isSync / addInOrder
    │   └─ 生成 hRegister (Handle)
    ├─ 如果 isSync == TRUE
    │   └─ CreateSyncThread() // 创建专属线程
    └─ 设置 flushStatus = Noflush
工作线程执行
CHIThreadManager::DoWork(pConfig)
    while (status != Stopped) {
        while (status != Stopped && 
               (isUsed && !jobPending || !isUsed && !m_jobPending)) {
            pJobCondn->Wait();  // 等待新作业
        }
        
        // ProcessJobQueue
        ProcessJobQueue(pConfig)
            ├─ 遍历 pq 中的作业
            ├─ 检查 flushStatus
            │   ├─ FlushRequested -> 弹出作业并释放
            │   └─ Noflush/SyncRequested -> DispatchJob
            ├─ MonitorAndDispatchJob (如果启用 HMS)
            │   ├─ 记录执行时间
            │   ├─ 加入 inflight 集合
            │   ├─ func(pData)
            │   └─ 从 inflight 集合移除
            └─ DispatchJob (无 HMS)
                └─ func(pData)
    }
Sync/Flush 流程
CHIThreadManager::Sync(hJob, timeout)
    └─ SynchronizeBody(hJob, SyncRequested, timeout)
        ├─ 加锁
        ├─ 如果 addInOrder,处理 helperPQ
        ├─ 检查是否有进行中的作业
        ├─ 设置 flushStatus = SyncRequested/FlushRequested
        ├─ 触发所有相关线程处理剩余作业
        │   ├─ AsyncTrigger(TRUE) // 广播所有异步线程
        │   └─ SyncTrigger(rRegJob) // 唤醒 Sync 线程
        ├─ 等待所有作业完成
        │   └─ pFlushOK->TimedWait(timeout)
        └─ 重置 flushStatus = Noflush

四、两套实现对比

4.1 架构差异

维度CamX ThreadManagerCHI ThreadManager
设计模式组件化(Registry/List/Core/Queue 分离)单体式(所有逻辑在一个类中)
队列模型3个优先级队列 + 链表全局队列 + 每作业族独立队列
线程模型纯线程池(无专属线程)线程池 + Sync 专属线程
作业调度优先级 + 序列号FIFO + 可选顺序
序列化支持(isSerialize)不支持
作业分割支持(isSplitable)不支持

4.2 适用场景

CamX ThreadManager 适用于:

  • 需要作业并行执行的场景(如图像处理)
  • 需要优先级调度的场景
  • 需要序列化保证的场景
  • 需要作业分割的场景

CHI ThreadManager 适用于:

  • 需要同步作业族独立线程的场景
  • 需要严格顺序执行的场景
  • Feature2 层的算法处理

4.3 API 映射

功能CamXCHI
创建Create(ppInstance, name, numThreads)Create(ppInstance, name, numThreads=50)
注册RegisterJobFamily(func, name, flushCb, priority, isSerialize, phJob, cameraId)RegisterJobFamily(func, name, phJob, isSync, addInOrder, cameraId)
提交PostJob(hJob, stopCb, ppData, isSplitable, isBlocking, maxTime, name)PostJob(hJob, pData, seqNum, maxTime, priority)
注销UnregisterJobFamily(hJob)UnregisterJobFamily(hJob)
FlushFlushJobFamily(hJob, userData, blocking)FlushJob(hJob) (内部调用)
SyncSyncJobFamily(hJob)Sync(hJob, timeout)
恢复ResumeJobFamily(hJob)ResumeJobFamily(hJob) (需实现)

五、关键设计总结

5.1 线程安全

  • 所有共享数据访问都有 Mutex 保护
  • 状态标志使用原子操作
  • Condition 变量用于线程间通知

5.2 健康监控集成

  • 两套实现都继承 IMonitorClient
  • 支持作业超时检测
  • 支持暂停/恢复监控
  • 通过 OnScanAllJobs 上报失败作业

5.3 性能优化

  • 对象池模式(JobList 预分配 RuntimeJob)
  • 条件变量通知(避免忙等待)
  • 优先级队列(重要作业优先执行)
  • 批量唤醒(Broadcast vs Signal)

5.4 容错设计

  • Flush/Sync 超时机制
  • 作业停止回调
  • 状态机保护(非法状态转换检查)
  • 资源泄漏保护(析构函数中清理所有资源)
Android CameraService详解 本文系统解析了Android Camera架构,从五层架构(应用层到厂商实现层)到核心数据流,重点分析了拍照请求的生命周期和异步处理机制。关键模块如RequestThread、BufferQueue等的工作原理及典型问题(如相机打开失败、预览卡顿、拍照模糊)的排查方法被详细探讨,并提供了具体的日志分析和调试命令。文章构建了一个立体化的Camera系统知识体系,涵盖从理论到实践的完整链路。 阅读详情

相关推荐

安卓新奇玩机工具全攻略____针对三星 Tecno和Infinix等外版手机移除frp与MDM验证工具操作【三十】

本文介绍一款可移除三星、Tecno、Infinix等品牌手机FRP及MDM锁定的Windows便携工具,支持信息读取、ADB启用、FRP解除及三种MDM绕过方法。界面简洁,功能清晰,已汉化便于使用。需注意部分功能可能触发杀毒报警,联网工具或随时间失效,严禁用于非法用途。

小马哥的专栏 51

Android AOP 的统一闸门与代价:Around 阻断、编译耗时与堆栈错乱

切面虽能集中横切逻辑,却打断了代码的因果链,导致问题难以追踪。本文通过语音关机误触发、空指针、点击无响应等案例,揭示切面滥用风险:proceed() 成唯一放行口,执行路径隐匿于字节码。提出“闸门”思想——在关键操作前加前置校验,分三种写法:完全替换、条件放行、参数清洗,强调proceed()仅一次放行,重试应由业务层处理。结合登录态、点击防抖等真实场景,说明注解+切面可实现声明式控制,但需注意作用域、生命周期与织入策略,避免全局变量干扰与内存泄漏。

mmsx990的博客 494

ArcGIS Pro中协同区位熵方法在商业选址分析中的应用

本文详细介绍了如何利用ArcGIS Pro中的协同区位熵方法进行科学的商业选址分析。该方法通过量化目标客户与竞争对手在空间上的关联程度,精准识别市场空白区与竞争红海,帮助决策者从“凭感觉”转向“用数据说话”,有效提升选址成功率和投资回报。

weixin_29214559的博客 355

【实操解决】PHP5.4~PHP7.3的 CVE-2026-109618与CVE-2026-109619问题

面对【CVE-2026-109618与CVE-2026-109619】,PHP版本太老又不太好升级的朋友可以试试这个方法

liuruiaaa的博客 414

基于LORA的双机通信的智能农业系统

通过LoRa模块与主机进行通信,监测环境中的温度、湿度、土壤湿度和光照强度等参数,并根据预设的自动控制逻辑或者手动指令控制继电器开关,从而调节风扇、加热器、水泵、喷雾器和灯光等设备,为植物提供适宜的生长环境。使用的Lora是大夏龙雀的感觉这个是我使用过的Lora里面最好用的,因为不用设置频道就可以直接透明传输,使用起来得心应手。就像两个单片机直接串口通信一样,缺点是异步串行,不能同时进行接收和发送。继电器灯亮模拟打开对应的风扇、水泵、灯、喷雾、加热。1.使用温度传感器测当前环境的温湿度。

ssjsjss的博客 1734

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的全过程。针对数据不满足正态性和方差齐性假设时,如何通过秩转换、回归调整残差,并最终利用Kruskal-Wallis检验完成组间比较。该方法为处理含协变量的非参数多组比较问题提供了清晰的实战解决方案,并探讨了其与标准Quade检验的异同及适用场景。

weixin_29306317的博客 352

运动相机上市前,Android 配套 App 还没上架,怎么给渠道和体验用户安装?

研发成功生成 APK,不代表它已经适合发给外部体验人员。内部开发包可以包含调试开关、测试服务器地址或临时日志配置;渠道测试包则至少需要完成一次基本放行检查。首先要确认应用身份,包括包名、签名、版本号和构建编号。后续版本如果签名不一致,可能无法覆盖安装;包名或环境不同,又可能在手机上出现两个看起来几乎一样的 App。测试人员若无法分辨,反馈时就很容易报错对象。其次要写清设备范围。运动相机企业可能同时测试多个型号或不同硬件批次,同名 App 也未必适用于全部设备。

Ruby_ss的博客 190

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1505

【MySQL】内置函数

但行好事,莫问前程

qq_42996461的博客 140

【即插即用模块】Transformer篇 | MICCAI 2025 | ReLULA:Q/K双ReLU线性注意力,既轻又准!

本文介绍了一种基于线性注意力的多实例学习模块(Lin-MIL),适用于高分辨率视觉任务。该模块通过转置计算顺序和使用ReLU激活,将计算复杂度从O(n²d)降至O(nd²),同时提升特征判别性。核心创新包括Q/K双ReLU激活、可学习温度系数和数值稳定归一化。实验表明,该模块在轻量化视觉任务中优于传统线性注意力和Mamba架构。代码实现了模块化矩阵乘法,支持即插即用替换ViT自注意力层。该模块特别适合计算病理学等需要处理大量图像补丁的任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 134

【车载以太网】Eth Stack Bringup

摘要:本文基于AUTOSAR架构,详细介绍了在TC3xx硬件平台上实现EthStack Bringup的全过程。作者通过配置MCAL和Davinci工具,完成了EthTrcv、Eth、EthIf、EthSM和TcpIp等模块的集成,并解决了16字节内存对齐和以太网速率不匹配等问题。最终实现了PC端与开发板的Ping通,并通过WireShark验证了数据包收发。文章总结了调试中的关键问题与解决方案,强调了实践的重要性,为后续EthStack的深入分析奠定了基础。

qq_36056498的博客 168

Android歌词功能实现

因为歌词是逐行推进的。比如歌词时间是 0s、5s、10s,当前播放到12s,应该高亮的是"10s那行"(正在唱),而不是"0s那行"(已经唱过了)。方案每刷新一次就新建对象,对于逐字这种高频刷新场景,性能一般。@Override优势:不创建额外对象,只重绘,性能更好。易错点说明多时间标签不排序二分查找失效,必须按时间升序排序直接用smoothScrollToPosition不会居中,必须重写LayoutManager方法频繁notifyDataSetChanged。

2401_83326930的博客 226

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 242

Android 屏幕适配的前世今生

本文解析Android屏幕适配核心机制:分辨率决定物理像素数,逻辑密度(densityDpi)将dp转换为px,而图片内存占用取决于解码后像素尺寸与格式。同一张300×200 PNG放入drawable-mdpi目录时,系统按设备密度自动缩放——在3倍密度设备上解码为900×600,内存达前者的9倍。关键在于:内存由解码尺寸决定,非分辨率或文件大小。理解密度缩放、资源目录规则及Bitmap解码机制,是避免内存溢出、实现高效适配的核心。

trebleZ的博客 351

【即插即用模块】注意力篇 | TGRS 2025 | SCPP:独家复现!三特征多尺度注意力融合,涨点必备!

摘要:SCPP(Scale-aware Pyramid Pooling)是一种创新的多尺度特征融合模块,专为U型网络瓶颈设计。它通过局部特征提取(1×1卷积)、多尺度膨胀卷积(1/3/5膨胀率分支)和全局特征聚合(全局平均池化)三重结构,结合SE通道注意力机制和自适应加权融合,显著提升特征表达能力。实验表明,SCPP能有效解决边缘模糊和错误检测问题,在遥感图像分割等任务中表现优异。该模块支持即插即用,适用于各类需要多尺度特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 934

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RK3288 游戏盒子安卓 5.1 线刷包说明

适配乐檬miniStation、联想VXc10等RK3288平台游戏盒子,支持2GB RAM+16GB ROM。刷机后系统更流畅,界面简洁,兼容WiFi、蓝牙,可Root并安装多数安卓应用。使用Windows 10电脑,通过双公头USB线连接盒子OTG口,配合DriverAssistant驱动与RKDevTool/AndroidTool工具,加载update.img固件完成刷机。步骤包括安装驱动、按复位键通电识别设备、加载固件并升级,完成后自动重启,需验证网络与外设功能。详细工具包及固件资源见链接

weixin_39775340的博客 254

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android 系统级三个易错点:MockLocation 注入、重复启动与多进程初始化

系统入口常有多个,漏掉一个即成线上Bug。定位、启动、初始化三类问题本质相同:看似单一入口,实则多路径触发(如LocationProvider、Intent类型、进程独立)。处理时需以“多入口”为前提设计,避免状态错乱。例如模拟定位需注册所有可用provider,启动需响应各类Intent,初始化要防范子进程重复执行。核心原则:凡系统可主动唤起之处,皆应按多入口处理,否则必现隐性缺陷。

mmsx990的博客 411

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android Activity 启动时序与 Task 栈管理

Android Activity 启动时序遵循“先 start 新的,再 finish 旧的”原则,确保界面切换流畅无黑屏。生命周期回调顺序为:新 Activity 的 onCreate→onStart→onResume 优先于旧 Activity 的 onPause→onStop→onDestroy。通过 Intent Flag(如 CLEAR_TOP、CLEAR_TASK、NEW_TASK)和 launchMode(standard、singleTop、singleTask)可灵活控制任务栈行为,实现页

我怀里的猫的博客 146

Android 系统开机流程源码分析

事件关键日志及描述fork 出 system_server反射定位 SystemServer.main进入 system_server服务分三批开始起开始批量 fork App第一次拉桌面 FallbackHomeLauncher3 进程 forkDE 区开机广播CE 区解锁经典开机广播第二次拉桌面 Launcher3。

qq_21874145的博客 293

认证卡在“网络”这一环:Android 设备出海,CTS 的 IPv6 门槛比想象中更硬

海域云在其适配 CTS 测试的方案中给出的数据是,优化路由后跨境延迟可低至 5–20ms,测试流程借助专线网络可缩短 30%–50%,并全面支持 IPv4/IPv6 双协议,与 CTS 对 IPv6 的硬性要求对齐。这类指标的具体数值会因地域和运营商环境而不同,但“路径可管、抖动收窄”的方向,对于需要长时间稳定运行的 CTS 套件而言,价值是直接的。对搭载 Android 系统的手机、平板、电视、机顶盒和智能手表而言,GMS 认证是进入欧美等主流渠道的通行证,而 CTS 是其中绕不开的兼容性门槛。

idcicp_com的博客 209

Gaea中配置如何更新

etcd 存储每个业务namespace的JSON配置:后端MySQL实例、读写分离、分库分表路由、账号限流;更新由gaea-cc做两阶段热更,先全部proxy预加载、全部成功再统一commit切换;proxy同时watch etcd,用于新节点启动和故障后自动同步配置,全程不需要重启proxy。

翔云 203

PHP2Shell(CVE-2026-109618 / CVE-2026-109619)——自编译 / 源码层方案

针对PHP内存溢出(OOM)漏洞(CVE-2026-109618/109619),核心修复为使用UnwindExit替代zend_bailout(),实现引擎级根治。仅PHP 8.2.35+等版本已内置该补丁;7.x及以下需手动移植最小缓解方案:禁用upload_progress回调、efree后置空指针、复位全局状态,并配合pm.max_requests=1。5.x无法移植完整修复,仅能通过编译期关闭关键路径与运行时隔离降低风险。

凯 393

安卓离线类美颜特效SDK

美型方向开放了瘦脸、大眼、窄脸、下巴、额头、鼻梁等多项面部形态调节参数,覆盖从日常轻美颜到上镜微调的不同需求。美摄科技推出的安卓离线类美颜特效SDK,把美颜、美型、滤镜、贴纸等核心处理能力部署在设备端,在无网络或弱网环境下也能完成实时渲染,为安卓应用提供一条兼顾体验与合规的端侧技术路径。对于正在寻找安卓端离线美颜特效能力的团队而言,美摄科技提供的是一条经过工程验证的端侧路径:美颜效果在设备本地完成,功能模块可按需组合,性能与包体积面向移动端实况进行设计,数据安全边界也因离线架构而更加清晰。

美摄科技 196

安卓调试助手:可用的安卓多设备投屏、日志查看与 APK 安装工具(附下载)

安卓调试助手是一款免安装、免费的Windows工具,集设备连接、APK安装、文件互传、日志查看与多设备投屏于一体。无需Android Studio或adb命令,支持无线扫码配对,一键完成调试全流程。适合开发者、测试人员及普通用户快速安装应用、获取闪退日志、传输文件与多屏对比,提升安卓调试效率。

H5开发技术 182

android 16实现权限默认授予

本文分析Android 16默认授予权限机制在部分设备失效的原因,通过定位系统级授权代码实现强制赋权,并提出避免清除数据后权限重置的解决方案。针对低于Android 14的版本,提供兼容性处理方案,结合权限演进历程与开发最佳实践,确保应用在不同版本上稳定获取所需权限。

通信侠的博客 283

图解 Android 系统架构:从 App、Framework、HAL 到 Linux 驱动

本文梳理了Android系统中从应用到硬件的调用链路,通过“职责、进程、接口”三问解析App、Framework、System Service、JNI、Binder、HAL与内核驱动的关系。强调Android并非串行调用,而是分层协作:应用通过Manager调用Framework,经Binder跨进程访问系统服务(如cameraserver),再由HAL抽象硬件接口,最终通过系统调用触达内核驱动。关键在于区分普通调用、JNI(语言桥接)、Binder(进程通信)与系统调用(内核交互)四类机制,揭示现代AOS

weixin_47540149的博客 279
上一篇: Camera HAL PerformanceManager概述
下一篇: Camera HAL 多线程管理详解
DU_YULIN
博客等级 码龄12年 369粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值