代码解析:安卓VHAL的AIDL参考实现

news2025/1/2 22:59:23

以下内容基于安卓14的VHAL代码。

总体架构

参考实现采用双层架构。上层是 DefaultVehicleHal,实现了 VHAL AIDL 接口,并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware,实现了 IVehicleHardware 接口。此类可模拟与实际硬件或车载总线交互的 VHAL 逻辑,并且特定于设备。供应商也可以视需要调整这一架构,重复使用同一 DefaultVehicleHal 类(扩展该类以覆盖某个方法),并提供自己的 IVehicleHardware 实现。

图1

DefaultVehicleHal 包含以下被认为适用于任何 VHAL 实现的通用逻辑:

  1. 实现 IVehicle 接口。
  2. 执行基本的输入检查,包括检查是否存在重复 ID。
  3. 为每个 binder 客户端的每个操作分配客户端对象(例如 GetValuesClient),并将每个对象添加到全局池。
  4. 管理异步回调逻辑,例如将待处理请求添加到待处理请求池。在我们收到结果时解决待处理的请求,或者在某个待处理的请求超时时返回错误。
  5. 序列化和反序列化 LargeParcelable(详见 ParcelableUtils.h)。
  6. 管理订阅(详见 SubscriptionManager.h)。
  7. 检查权限(详见 checkReadPermission 和 checkWritePermission 函数)。
  8. 定期调用 IVehicleHardware.checkHealth 并发送检测信号(详见 checkHealth 函数)。

IVehicleHardware 是一个通用接口,用于表示 VHAL 的硬件专用实现。IVehicleHardware 的参考实现是 FakeVehicleHardware,它使用内存中映射存储属性值,并且不与实际车载总线通信。其目的是在模拟器上运行,不依赖特定硬件。供应商实现不能直接使用它,而必须添加车载总线特定的逻辑。

调用时序

下面以setValues()接口为例进行说明:

FakeVehicleHardware实现了IVehicleHardware。

图2

PendingRequestHandler中有一个线程,一直在处理request。

图3

最终,FakeVehicleHardware将value写入VehiclePropertyStore::Record中保存。这里只是参考实现,所以没有实际发送给对手件,只是将数值存入VHAL。

图4

接口文件定义

HIDL VHAL中接口定义文件为types.hal,IVehicle.hal和IVehicleCallback.hal。

AIDL VHAL中,IVehicle .aidl和IVehicleCallback.aidl对应IVehicle.hal和IVehicleCallback.hal。

types.hal中的内容则是拆分到VehicleProperty.aidl,VehiclePropertyGroup.aidl, VehicleArea.aidl, VehiclePropertyType.aidl等等多个aidl文件中。其中VehicleProperty.aidl是用来添加信号ID的。

下面是VehicleProperty.aidl中一个原生的信号

HVAC_FAN_SPEED = 0x0500 + 0x10000000 + 0x05000000  + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32

信号ID的计算方式从types.hal中的或运算改为了更直观的加法,但信号ID的结构并没有发生变化,还是由4位的ID、VehiclePropertyGroup 、VehicleArea 、VehiclePropertyType 这4个部分组成。

默认值定义

HIDL VHAL中,定义默认值使用的文件为DefaultConfig.h,格式

        {.config = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED),

                    .access = VehiclePropertyAccess::READ_WRITE,

                    .changeMode = VehiclePropertyChangeMode::ON_CHANGE,

                    .areaConfigs = {VehicleAreaConfig{

                            .areaId = HVAC_ALL, .minInt32Value = 1, .maxInt32Value = 7}}},

         .initialValue = {.int32Values = {3}}},

AIDL VHAL中,定义默认值使用的文件为DefaultProperties.json,格式

        {

            "property": "VehicleProperty::HVAC_FAN_SPEED",

            "defaultValue": {

                "int32Values": [

                    3

                ]

            },

            "areas": [

                {

                    "areaId": "Constants::SEAT_1_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_1_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_CENTER",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                }

            ]

        },

interfaces\automotive\vehicle\aidl\impl\default_config\config\README.md在README文件中有对json的格式有具体说明。

附录

最后附上本文中plantuml流程图的代码:

图2:

@startuml
'https://plantuml.com/sequence-diagram
'AIDL setValue

autonumber

AIDL_Client -> DefaultVehicleHal: setValues
DefaultVehicleHal -> FakeVehicleHardware: setValues
FakeVehicleHardware -> PendingRequestHandler: addRequest

@enduml

图4:

@startuml
'https://plantuml.com/sequence-diagram

autonumber

PendingRequestHandler -> PendingRequestHandler: handleRequestsOnce
PendingRequestHandler -> FakeVehicleHardware: handleSetValueRequest
FakeVehicleHardware -> FakeVehicleHardware: setValue
FakeVehicleHardware -> VehiclePropertyStore: writeValue
@enduml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过 Ansys Electronics Desktop 中的高级仿真优化 IC 设计

半导体行业继续通过日益复杂的集成电路 (IC) 设计突破技术界限。随着工艺节点缩小和电路密度达到前所未有的水平,电磁效应对设备性能和可靠性变得越来越重要。现代 IC 设计面临着来自复杂的布局相关耦合机制、信号完整性问题和功率分布问题的挑战,这些问…

Kafka数据迁移全解析:同集群和跨集群

文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景,分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景: broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践: 将需要新添加…

【OpenGL ES】GLSL基础语法

1 前言 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符(in、out、inout)、函数参数限定符等内容,另外提供了一个 include 工具,方便多文件管理 glsl 代码&a…

ffmpeg之播放一个yuv视频

播放YUV视频的步骤 初始化SDL库: 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。操作:调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 创建窗口用于显示YUV视频: 目的:…

复习打卡大数据篇——Hadoop MapReduce

目录 1. MapReduce基本介绍 2. MapReduce原理 1. MapReduce基本介绍 什么是MapReduce MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。 MapRed…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…

el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)

好的&#xff0c;我来帮你分析前端为什么只能展示 10 条数据&#xff0c;以及如何解决这个问题。 问题分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 组件中&#xff0c;pageSize 的值被设置为 10&#xff1a;<el-pagination:current-page"current…

单片机与MQTT协议

MQTT 协议简述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布 / 订阅&#xff08;publish/subscribe&#xff09;模式的 “轻量级” 通讯协议&#xff0c;该协议构建于 TCP/IP 协议上&#xf…

Debian-linux运维-docker安装和配置

腾讯云搭建docker官方文档&#xff1a;https://cloud.tencent.com/document/product/213/46000 阿里云安装Docker官方文档&#xff1a;https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance 天翼云常见docker源配置指导&#xff1a;htt…

使用Docker-compose部署SpringCloud项目

docker编写dockfile遇到的问题&#xff1a; 需要在docker-compose.yml文件下执行命令 docker-compose.yml文件格式的问题 1和2处空2格&#xff0c;3处空1格&#xff0c;4为本地配置文件目录&#xff0c;5为docker容器的目录&#xff0c;version为自己安装的docker-compose版本 …

KG4Diagnosis 分层多代理的医疗诊断框架,结合大模型与知识图谱构建,覆盖362种常见疾病

KG4Diagnosis 分层多代理的医疗诊断框架&#xff0c;结合大模型与知识图谱构建&#xff0c;覆盖362种常见疾病 论文大纲理解1. 提出背景是什么&#xff1f;2. 概念的性质是什么&#xff1f;是什么导致这个性质&#xff1f;3. 请举一个正例、一个反例&#xff0c;对比4. 请使用类…

【LLM综述】29种大模型Prompt Engineering技术

note 从零样本&#xff08;Zero-shot&#xff09;提示到最新进展的各种提示技术&#xff0c;包括推理和逻辑链&#xff08;Chain-of-Thought, CoT&#xff09;提示、自动链式思考&#xff08;Auto-CoT&#xff09;提示、自我一致性&#xff08;Self-Consistency&#xff09;提…

【黑马头条训练营】day02-黑马头条-App端文章展示

目录 描述app端首页从请求到数据显示的全部流程 描述文章微服务的组成及首页展示业务与实现 自己编写文章微服务关键逻辑 描述app端首页从请求到数据显示的全部流程 浏览器请求我们的app端 会通过nginx请求到我们app前端 app端输入手机号和密码 点击登录 请求 会到我们的…

DBeaver 咋手动配置sqlite 驱动

目录 1 问题2 下载 1 问题 离线安装了DBeaver 数据库软件&#xff0c;现在需要使用这个数据库打开sqlite 数据库&#xff0c;但是提示没有 驱动&#xff0c;那么我们就需要手动下载驱动&#xff0c;在这个软件里面导入 2 下载 https://repo1.maven.org/maven2/org/xerial/sql…

Linux 的历史与发展:从诞生到未来

Linux 的历史与发展&#xff1a;从诞生到未来 1. 起源之前&#xff1a;操作系统的历史背景 在 Linux 问世之前&#xff0c;操作系统的发展经历了多个重要阶段&#xff0c;这些阶段为 Linux 的诞生奠定了基础&#xff1a; 1940-1950 年代&#xff1a;计算机初期 早期计算机如 [[…

八爪鱼easyspider:

参考我的上一篇博客&#xff1a; scraper插件与软件&#xff0c; 主八爪鱼&#xff0c;easyspider 1&#xff0c;八爪鱼&#xff1a; 同时注意数据横向还是纵向&#xff0c;但是不好操作 二&#xff0c;easyspider&#xff1a; 其中1/2是不需要用户登入的&#xff0c;第3个…

算法基础一:冒泡排序

一、冒泡排序 1、定义 冒泡排序&#xff08;英语&#xff1a;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序&#xff08;如从大到小、首字母从A到Z&#xff09;错误就把他们交换过来。 …

llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~

实际问题场景&#xff1a; 使用llamafactory进行微调qwen2.5 7B和14B的大模型时&#xff0c;会出现out of memory的报错。尝试使用降低batch_size&#xff08;原本是2&#xff0c;现在降到1&#xff09;的方式&#xff0c;可以让qwen2.5:7B跑起来&#xff0c;但时不时会不稳定…

七牛云—对象云存储Kodo(详解,文件上传和下载)

文章目录 七牛—对象云存储Kodo1.1 介绍1.2 使用注册账号创建bucket空间查询accessKey/secretKey查看官网SDK1.3 SpringBoot中使用七牛云上传引入依赖(在官方SDK文档中有)引入工具类servie层controller层postman测试下载引入工具类域名查询controller层七牛—对象云存储Kodo 1…

概率统计与随机过程--作业8

推导题 试给出图1中所有关于Z{e}与变量a条件独立的变量。 编程题 有一个美国医生使用Bayes网络诊断胸部疾病&#xff0c;其掌握的数据信息如图2所示&#xff0c;其中包括&#xff1a; 有50%的病人吸烟&#xff08;smoking&#xff09;&#xff0c;1%患有肺结核(Tuberculosis…