share memory 小结(qualcom )

2023-11-06

QUALIOMM 的AP和MODEM之间的share memory通过把共享内存的空间分成N个不定长的数据块,其中SMEM_HEAP_INFO记录每个数据块的地址信息,是否已经分配等,(只能一个宿主先分配),当然SMEM_HEAP_INFO 本身也是一个数据块。各个宿主CPU用这些数据块依照对应的数据结构进行通信,包括PROC_COMM,smem_find,以及建立在特殊数据块上的循环缓冲区smd通道,还有建立在特定通道的函数调用RPC。

共享内存两个基本点:

 1、在本身内存内记录分配信息;

 2、互斥访问或数据一致性;

 3、如果要快速相应要加相互中断通知(可选)。

地址空间的映射和管理:

SMEM_HEAP

*  All types of SMEM usage are defined in smem_mem_type.

*  The enumeration order inside smem_mem_type is not mapped as the exact order.  Refer to smem_buf_data_tbl[] for exact order of each enumeration.

*  smem_buf_data_tbl[] is declared as the size of each allocated smem_mem_type in static heap.

*  smem_get_offset() is called to count offset for each smem_mem_type in static heap when in runtime.

*  For more detail, refer to smem_boot _init().

typedef enum

{SMEM_MEM_FIRST,

SMEM_MEM_PROC = SMEM_MEM_FIRST,

SMEM_FIRST_FIXED_BUFFER = SMEM_MEM_PROC,

SMEM_HEAP_INFO,

……………………

}smem_mem_type;

将1M的share memory分为N个条目。最终实际固定了每个条目的起始地址和长度。(AP端linux kernel的smd.c的smem_alloc2分配函数,可知不能用通常意义上的alloc,只是简单的动态的在尾部曾长数据块,不能真正意义的回收内存空间;总共1M的共享内存,其中64个smd通道占用了64*8K大部分空间)。

struct smem_shared {
    struct smem_proc_comm proc_comm[4];
    unsigned version[32];
    struct smem_heap_info heap_info;
    struct smem_heap_entry heap_toc[SMD_HEAP_SIZE];//SMD_HEAP_SIZE = 512
};

这个结构对齐到share memory的起始地址,就是1M共享内存空间的映射。第一个条目proc_comm,其中包括最终要的条目heap_info.这个条目记录了1M share memory的每个条目的起始地址和长度。

上述结构中包含的struct smem_heap_info记录整个SM空间的分配情况,当前的申请地址和剩余空间。

struct smem_heap_entry是记录每个条目的地址空间信息,这是一个最多能记录512个条目地址信息的数组,通常是根据smem_mem_type条目号来寻找地址信息。


AP和MODED等通信的几种策略机制:

1、在底层数据块层次的使用是PROC_COMM,主要是最底层次的处理器间通信,不建议扩展。主要是CPU各路电源,时钟,重启等高优先级的问题。每个处理器只占4个字节。代码实现见msm_proc_comm(),就是写两个字节,发中断给CPU,等待回应。


2、另外一个是smem_alloc, smem_get_entry, smem_find.对我们目前来说,主要应用是在MODEM端写一些结构的数据到SHARE_MEMORY,AP端在合适的时候去取。这部分代码在MODEM分配内存,从AP传递,其中的几个内存管理函数比如smem_alloc是对我们屏蔽的(不能真正意义上的回收free)。注意一般是MODEM端从AP传递,反向传递不建议。


3、下面是建立在smem_alloc这个机制上的SMD,就是循环缓冲区,一端不停的写,另一端不停的读。类似于进程间通信,对上层包装成串口驱动一样的设备。实现机制同样是写数据和中断。读数据回调上层的注册函数,实现代码smd.c。使用SMD机制通道的接口是串口驱动类似的接口,smd_open ,smd_read, smd_write, smd_read_avail,可参考smd_nema.c.比如smd_open("GPSNMEA",&nmea_devp->ch,nmea_devp,nmea_notify);其中nmea_notify是有数据要读的回调函数。在nmea_notify里面去看smd_read_avail多少可读,然后smd_read去读,写就直接调用smd_write.

目前SMD有36组通道,一般成对是使用,一个MODEM向AP,一个AP向MODEM,目前有GPS,DS,DIAG,BT,RPC等使用。

SMD循环缓冲区的应用较多,可在kernel中搜索smd_open,如下:

smd_open("SMD_DIAG",&ctxt->ch,ctxt,smd_diag_notify);

smd_open(p->chname,&p->ch,dev,smd_net_notify);

smd_open("GPSNMEA",&nmea_devp->ch,nmea->devp,nmea_notify);

smd_open("SMD_RPCCALL",&smd_channel, NULL, rpcrouter_smdnotify);

smd_open(name,&info->ch,info,smd_tty_notify);//虚拟出tty设备给应用


4、最后是RPC(remote process call)远程函数调用。实现机制是建立在SMD通道之上的一个机制。使用SMD通道2,命名为RPCCALL,通道3RPCRPY。这个详见smd_rpcrouter_device.c 和smd_rpcrouter.c 。主要用法是,APP调用MODEM函数,其中可选项是MODEM端执行函数之后,是否回调APP的一个函数。在RPC中,留了一个OEM_RAPI 给我们扩展。RPC这个应用最多:

eg:AMSS 调用kernel上报电池电量在msm_battery.c中,

msm_rpc_register_client("battery",BATTERY_RPC_PROG,BATTERY_RPC_VER_2_1,1,msm_battery_cb_func);注册client端函数。对应AMSS的server端。

msm_rpc_register_XXX---->Smd_rpcrouter_client.c & Smd_rpc_router_server.c-----通过msm_rpc_write等函数接口--->smd_rpcroutr.c--->rpcrouter_smd_xprt.c---->smd_open().


另外,smd_rpcrouter.c中的rpcrouter_init---->msm_rpcrouter_init_devices(smd_rpcrouter_device.c)建立一个class_creae(THIS_MODULE,oncrpc)设备节点。smd_rpcrouter_device.c实现这个节点的write,read,pull,iotcl等标准操作。这些操作通过条用msm_rpc_write等同样调用smd_rpcrouter.c的接口。

应用层的vendor/qcom/proprietary/oncrpc/的liboncrpc.so操作这个驱动节点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

share memory 小结(qualcom ) 的相关文章

  • Storm简介

    场景 伴随着信息科技日新月异的发展 信息呈现出爆发式的膨胀 人们获取信息的途径也更加多样 更加便捷 同时对于信息的时效性要求也越来越高 举个搜索场景中的例子 当一个卖家发布了一条宝贝信息时 他希望的当然是这个宝贝马上就可以被卖家搜索出来 点
  • Redis学习记录(二)

    redis命令 基本命令 心跳命令 ping 读写键值命令 set get DB切换 select 数据库切换 查看数据库中的key数量 dbsize 删除当前库中的数据 flushdb 删除所有库中的数据 flushall 退出客户端命令
  • 【语义分割】DFANet -- Deep Feature Aggregation for Real-Time Semantic Segmentation

    efficient inferrence speed and high accuracy with high resolution Architecture DFANet从整体上可看做是encoder decoder结构 包括四个部分 th
  • sklearn中的XGBClassifier参数详解

    前言 1 Xgboost简介 Xgboost是Boosting算法的其中一种 Boosting算法的思想是将许多弱分类器集成在一起 形成一个强分类器 因为Xgboost是一种提升树模型 所以它是将许多树模型集成在一起 形成一个很强的分类器
  • Linux内核模块管理(查看、添加和删除)

    Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动 一般这些驱动都是用模块的形式加载的 使用模块的形式保存驱动 可以不直接把驱动放入内核 有利于控制内核大小 模块的全称是动态可加载内核模块 它是具有独立功能的程序 可以被单独
  • Java多线程问题--wait()和notify()

    本文内容部分引自 Java多线程编程核心技术 感谢作者 代码地址 https github com xianzhixianzhixian thread git 介绍wait 和notify 的使用以及注意事项 1 wait 方法是Objec
  • 图像相似度的评价指标 : FID(Fréchet Inception Distance)

    FID Fr chet Inception Distance 是用来计算真实图像与生成图像的特征向量间距离的一种度量 如果FID值越小 则相似程度越高 最好情况即是FID 0 两个图像相同 实际计算 参考链接 https machinele
  • 一个石头剪刀布游戏的python解法

    一个石头剪刀布的python解法 import random game 石头 剪刀 布 随机生成一个1 3之间的数 random digit random randint 1 3 输入你猜测的数 num int input 请输入1 2 3
  • RHEL5.6 下安装并测试openCV1.0.0(----成功----)

    一 首先去openCV官网下载openCV1 0 0版本 貌似需要翻墙后才能下载 二 解压源码包并安装 configure without python enable shared prefix opt opencv make make i
  • C++ 多线程 报错invalid use of non-static member function

    创建一个类test class test public void func std cout lt lt test main函数多线程调用test test t new test std thread th t gt func 编译报错 G
  • visual studio用环境变量设置目录

    visual studio里可以用环境变量来指定包含目录等目录
  • 程序的动态特性

    程序的动态特性 大多数情况下 程序的功能是在编译的时候确定下来的 称之为静态特性 而如果程序的功能是在运行时才确定的称为动态特性 动态特性是面向对象语言最强大的功能之一 它在语言层面上支持程序的可扩展性 动态特性 由C 虚函数 抽象基类 动
  • 基于朴素贝叶斯的垃圾分类算法(Python实现)

    一 模型方法 本工程采用的模型方法为朴素贝叶斯分类算法 它的核心算法思想基于概率论 我们称之为 朴素 是因为整个形式化过程只做最原始 最简单的假设 朴素贝叶斯是贝叶斯决策理论的一部分 所以讲述朴素贝叶斯之前有必要快速了解一下贝叶斯决策理论
  • 【Android Studio】配置国内镜像源(利用hosts)

    之前我写过直接用国内镜像的IP地址端口进行配置国内镜像的 如下链接 Android studio配置国内镜像源 但是这种方法不一定在每台电脑上的每次配置都行得通 因此给出第二种方法 给系统文件 hosts 添加国内的镜像 虽然 可能 也不一
  • 云服务器 ECS > 快照 > 快照概述

    快照概述 更新时间 2020 07 01 20 40 29 编辑我的收藏 本页目录 应用场景 快照类型 计费 使用限制 优势 相关操作 联系我们 阿里云快照可以为所有类型的云盘创建崩溃一致性快照 是一种便捷高效的数据容灾手段 常用于数据备份
  • Qt自定义sink风格按钮

    为了满足工作中控件多样性的要求 一些控件的风格需要通过重写画家事件的方式进行自定义 实现sink风格按钮的效果图如下 纯代码实现思路 产生按钮下沉的效果是利用了视觉误差原理 通过更改背景颜色以及图标的位置 呈现出按钮动态改变的效果 按钮未按
  • 【Sonar技术债务解】Null pointers should not be dereferenced

    SonarLint Null pointers should not be dereferenced A NullPointerException could be thrown getReauestAttributes0y can ret
  • 计算机桌面颜色怎么换,电脑桌面字体颜色怎么改

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 电脑桌面字体颜色修改的方法是 1 首先 打开电脑 在桌面空白处点击鼠标右键 点击 个性化 点击打开 2 在窗口中选择 窗口颜色 点击打开 3 在窗口中选择 高级外观设置 点
  • Ubuntu18.04安装ROS+gazebo9

    https blog csdn net qq 35683407 article details 106064918 1 安装ros Ubuntu18 04选择ROS Melodic 教程网址 http wiki ros org cn mel
  • 如何排查 IDEA 自身报错?

    这个问题是 2023 年 7 月 26 日遇到的 当时还是 IDEA 2023 1 4 结果文章还没写完 7 月 27 日自动给更新了 IDEA 2023 2 问题估计解决了 所以 本文就简单提一下 IDEA 自身报错的排查方法 规避 解决

随机推荐

  • Java基础冷知识

    lt 一 gt 全局变量和局部变量的区别 1 位置不一样 全局变量存在类下面 局部变量存在方法里面 全局变量的生命周期和对象有关 局部变量的生命周期和方法有关 2 修饰符 全局变量是可以加修饰符的 局部变量不可以 3 默认值问题 全局变量只
  • nodeName、nodeValue和nodeType节点介绍

    nodeName 元素节点的 nodeName 是标签名称 大写 属性节点的 nodeName 是属性名称 文本节点的 nodeName 永远是 text 文档节点的 nodeName 永远是 document 注释 nodeName 所包
  • 百度地图数据可视化

    如何使用百度地图 前往官方文档进行一系列注册 主要是为了获取服务密钥 新建HTML文件 进行示例代码编写
  • C语言 队列

    目录 一 队列概念 二 基础数组队列 三 基础链表队列 四 数组队列 函数 五 链表队列 函数 一 队列概念 先进先出 后进后出 第一个元素无数据 数组队列长度 根据数组长度决定 链表队列长度 根据电脑内存决定 二 基础数组队列 inclu
  • APP上架需要的准备和流程

    一上架iOS应用市场前的准备 1 选择适合自己的苹果开发者账号 1 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang 单人使用 个人账号只能有一个开发者 1
  • IDEA 导入Spring源码:找不到InstrumentationSavingAgent

    错误如下 Error 26 38 java 找不到符号 符号 类 InstrumentationSavingAgent 位置 程序包 org springframework instrument 解决方法 导入项目时选择 Use local
  • 记录vue.config.js中配置代理(devServer)不生效的坑(跨域问题处理)

    前后端分离后 会遇到跨域问题 导致后端响应的数据被浏览器 拦截 前端无法接收 往往就会导致类似下面的问题产生 大意就是请求地址不同源 导致了跨域问题 解决方法 使用vue cli脚手架 在vue config js文件中配置代理服务器 从而
  • canvas视频截图

    const videoEle document createElement video console log videoEle gt videoEle videoEle src https cn ph new rad q s3 cn no
  • easyexcel使用教程-导出篇

    easyExcel使用教程 导出篇 开始准备工作 1 导入Maven依赖
  • 恒合仓库 - 用户管理、用户列表、为用户分配角色

    文章目录 用户管理 一 用户列表 1 1 实体类 1 1 1 分页实体类 1 1 2 用户信息实体类 1 2 业务实现 1 2 1 UserMapper 1 2 2 Service层 1 2 3 Controller层 1 2 4 效果图
  • 【Locomotor运动模块】攀爬

    文章目录 一 攀爬主体 伪身体 1 伪身体 的设置 2 伪身体 和 真实身体 为什么同步移动 3 伪身体 和 真实身体 碰到墙时不同步的原因 现象 原因 解决 二 攀爬 1 需要的组件 伪身体 Climbing Climbable及Inte
  • LeetCode5359.最大的团队表现值——小顶堆与PriorityQueue

    文章目录 引入 解法 引入 在本周周赛中 有这么一道题 公司有编号为 1 到 n 的 n 个工程师 给你两个数组 speed 和 efficiency 其中 speed i 和 efficiency i 分别代表第 i 位工程师的速度和效率
  • 谷歌新一轮裁员,云计算部门 50 人首当其冲

    By 超神经 内容一览 近日 谷歌云计算部门传出裁员消息 称为了调整对国际市场的关注 将进行小规模的人员调整 虽然具体人数尚未公布 但知情消息透露约有 50 人会受到波及 在 2020 年度首次裁员的背后 又反映了谷歌在云计算市场怎样的处境
  • R语言中变量命名规则与反引号的使用

    反引号是针对不符合命名规则的变量名 参数名使用的 那么什么是命名规则呢 变量名称可包含英文字母 数字 下划线和英文点号 句号 所以不能有中文 空格 存在哦 不能以数字或下划线开头 开头必须是英文字母或者点 可以以点号开头 但点号后面的符号不
  • Django项目实现9.1匹配系统出现AttributeError: ‘LocMemCache‘ object has no attribute ‘keys‘

    一般出现这种问题是代码的错误 不能将其作为字典使用 然而我仔细检查了代码报错行后没有发现错误 因为y总说的是用cache key函数 我突然想起早期使用python3manage py shell时候 在acapp下的manage py操作
  • 青春看似荒唐

    知道吗 下雨了 你喜欢的花开了 如此坚强 雨伞在 门把上 楼下送走了新娘 美丽 就像你一样 我曾如此奢望 一路风霜能与你分享 又害怕会这样 依赖着 直到有一天 我们不再疯狂 请不要失望 哪怕平淡收场 青春看似荒唐 没人会选择投降 我懂你的倔
  • 我的第一次面试

    就在昨天 我进行了第一次人生中第一次 以前也面试过 但是都是在学校内 去公司面试 首先他叫到我的时候我就很激动 我觉得我要紧张了 叫到我 我就跟着面试官进了一个房间 房间里面还有一个类似阳台那样一小块地方 一边是窗外 其他都是玻璃墙 我进去
  • 二叉树知识

    二叉树有两种主要的形式 满二叉树和完全二叉树 满二叉树 如果一颗二叉树只有度为0和度为2 并且度为0的节点都在同一层的二叉树就是满二叉树 这棵二叉树为满二叉树 也可以说深度为k 有2 k 1个节点的二叉树 完全二叉树 在完全二叉树 1 除了
  • 自动化测试框架selenium之webdriver

    目录 1 webwebdriver API 1 1 元素的定位 1 2 操作测试对象 1 3 添加等待 1 4 打印信息 1 5 浏览器的操作 1 6 键盘事件 1 7 鼠标事件 1 8 定位一组元素 1 8 多层框架的定位 1 8 多层窗
  • share memory 小结(qualcom )

    QUALIOMM 的AP和MODEM之间的share memory通过把共享内存的空间分成N个不定长的数据块 其中SMEM HEAP INFO记录每个数据块的地址信息 是否已经分配等 只能一个宿主先分配 当然SMEM HEAP INFO 本