深入理解RILD 知识点笔记

qcril:第1章 RILD及Qcril初始化流程 第1章 RILD及Qcril初始化流程 Rild是android提供的框架,位置位于AP侧(AP主处理器),对接Phone进程和BP侧modem。(BP从处理器) 图1 双卡手机在phone进程中会有2个phone的实例对应各个卡槽,相应的RILD进程也会有2个,phone和RILD之间通过Socket保持连接,各卡槽之间的操作互相独立。 高通用qcril+qm... 阅读详情

int p; //这是一个普通的整型变量

int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针  

int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组    -------整型数组

 

int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 ---指针数组

int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针----数组指针

int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.

int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据

Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针     -------------p函数指针 本质是指针变量

而 int * p(int) 指針函数 p本质是一个函数。函数返回类型是某一类型的指针

int *(*p(int))[3]; //从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数

以上去掉p就是p 的类型

 


在来点复杂的

void (*(*f[])())()

分析如下

    f[]数组,数组包含类型是指针,指针指向的内容是函数,返回类型是指针,指向函数名,函数返回类型是void

 

最后分析rild中使用   hardware/ril/rild/rild.c

const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
const RIL_RadioFunctions *funcs;

static struct RIL_Env s_rilEnv = {
    RIL_onRequestComplete,
    RIL_onUnsolicitedResponse,
    RIL_requestTimedCallback,
    RIL_onRequestAck
};

typedef struct {
    int version;        /* set to RIL_VERSION */
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
} RIL_RadioFunctions;

void *dlHandle = dlopen(rilLibPath, RTLD_NOW);


rilInit =(const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))
        dlsym(dlHandle, "RIL_Init");

funcs = rilInit(&s_rilEnv, argc, rilArgv);

包含头文件: #include <dlfcn.h> 

dlopen

功能:打开一个动态链接库 

函数定义: void * dlopen( const char * pathname, int mode );      void *则为“无类型指针”,void *可以指向任何类型的数据
函数描述: 在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。 
mode:分为这两种 
  RTLD_LAZY 暂缓决定,等有需要时再解出符号 
  RTLD_NOW 立即决定,返回前解除所有未决定的符号。 
  RTLD_LOCAL 
  RTLD_GLOBAL 允许导出符号 
  RTLD_GROUP 
  RTLD_WORLD 

返回值: 
  打开错误返回NULL 
  成功,返回库引用 
  编译时候要加入 -ldl (指定dl库) 

dlsym

功能:根据动态链接库操作句柄与符号,返回符号对应的地址。

函数定义:void*dlsym(void* handle,const char* symbol)

函数描述:dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。

handle是由dlopen打开动态链接库后返回的指针,symbol就是要求获取的函数或全局变量的名称。

dlclose

 dlclose()用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。


rilInit 函数返回类型是指向结构体RIL_RadioFunctions,dlsym 返回类型转化为指向rilInit指针,"RIL_Init"代表的rilLibPath动态库的函数名称,所以返回RIL_Init 函数引用

hardware/ril/reference-ril/reference-ril.c

const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
{
    //......
    while ( -1 != (opt = getopt(argc, argv, "p:d:s:c:"))) {
        switch (opt) {
            case 'p':break;
            case 'd':break;
            case 's':break;
            case 'c':break;
            default:return NULL;
        }
    }

    //..........

    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);

    return &s_callbacks;
}

getopt 获取命令行参数 -p -d -s -c 参数后面的值(间隔space)单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg 

umask

#include <sys/stat.h>

umask函数为进程设置文件模式创建屏蔽字,并返回以前的值

umask(S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);

函数原型 mode_t umask(mode_t cmask);

cmask是由下表列出的9个常量中的若干个按位“或”构成的

S_IRUSR       用户读

S_IWUSR      用户写

S_IXUSR       用户执行

S_IRGRP       组读

S_IWGRP      组写

S_IXGRP       组执行

S_IROTH       其他读

S_IWOTH      其他写

S_IXOTH       其他执行

C类型转换

任意类型(整型、长整型、浮点型等)的数字转换为字符串

1. itoa():将整型值转换为字符串
2. ltoa():将长整型值转换为字符串
3. ultoa():将无符号长整型值转换为字符串
4. gcvt():将浮点型数转换为字符串,取四舍五入
5. ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点
6. fcvt():指定位数为转换精度,其余同ecvt()

字符串转换为任意类型(整型、长整型、浮点型等)。

1. atof():将字符串转换为双精度浮点型值  ascii
2. atoi():将字符串转换为整型值
3. atol():将字符串转换为长整型值
4. strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字
5. strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字
6. strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字

 

    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);

pthread_attr_init

如果设置线程属性,必须在pthread_create 之前使用pthread_attr_init.

pthread_attr_t 结构体包含 是否绑定,是否分离,堆栈地址,堆栈大小,优先级信息

默认属性是 非绑定 非分离 默认1M大小堆栈 优先级和进程一样

轻进程概念,理解为内核进程,位于用户层和系统层之间,系统对线程资源的分配通过轻进程实现,如果设置绑定在轻进程,那个线程响应度高。

设置绑定状态的函数 pthread_attr_setscope 

绑定:PTHREAD_SCOPE_SYSTEM

非绑定 PTHREAD_SCOPE_PROCESS

线程的分离状态,用来决定如何结束自己 

设置参数的函数 pthread_attr_setdetachstate

非分离状态使用pthread_join 处理,才能释放资源,分离状态的线程,运行结束,自动释放
非分离:PTHREAD_CREATE_JOINABLE  

分离:PTHREAD_CREATE_DETACHED


如果设置线程分离状态,线程运行太快,在pthread_attr_init 之后,但是在pthread_create之前结束,那么此时创建线程,会得到错误线程号,需要避免,最简单的方法 执行pthread_cond_timewait 使得线程慢点跑,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

 

 

 pthread_cond_wait和pthread_cond_broadcast

int pthread_cond_broadcast(pthread_cond_t *cond)

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)

pthread_cond_t 函数将要等待的信号

 pthread_mutex_t 一个互斥锁,用于对信号量进行保护,防止多个线程同时对其进行操作

pthread_cond_broadcast 就是广播 信号

不懂看实例 https://blog.youkuaiyun.com/wangzhiyu1980/article/details/44227913

 

typedef 使用

typedef  已存在类型  新类型名称

typedef int size; 
​​​​​​​typedef unsigned int WORD;

size i = -4;
WORD word = 4

typdef 数组和指针

char str[10]; //定义 长度为10的字符数组
typedef char str[10];
//使用
str str1; //str 字符数组首地址


typedef char * pstr;
pstr p ;//指针

typedef 和函数 (ril 中使用的)

typedef void (*work_function_t)(void* arg);

work_function_t func;//代表指向这个类型的函数指针

函数指针 参数是无类型指针(可以强制转化为任意类型的指针,任何类型的指针都可以直接赋值给它,无需进行强制类型转换)

typedef 和 define的区别:

define 处理在预编译

typedef 在执行过程中

define 只是进行简单的字符串替换

typedef 是类似 定义

 

static 和java 的有区别

C 语言 static

static 初始化 变量,默认值0,但是作用域 本文件

修饰 函数 ,限定在本文件使用,默认是extern

C++的 static

修饰 变量和c 差不多

但是修饰函数不同, 实现的时候可以不用写static,只能访问静态成员,不需要实例就可以使用

 

 

RILD 启动与实现过程 1.在system/core/rootdir/init.rc中ril-daemon定义 Rild是Init进程启动的一个本地服务,采用了socket通讯这种通讯手段,是具体AT指令合成者与应答解析者 RILD管理框架,AT相关的xxxril.so动态链接库,以便适应不同的modem RILJ RILC modem #创建一个名为"ril-daemon"的进程,这个进程要执行的程序是/s 阅读详情

相关推荐

RILD - 第一章 - RILD流程概览

注:本文基于MTK Android N平台分析 参考: - 《深入理解Android:Telephony原理剖析与最佳实践》—杨清平 - 大神写的分析博客前言目前在负责Telephony模块,自己也想从上到下看下Telephony模块的相关代码流程。如此,就讲自己的总结的笔记保存于此,既可以随时查阅,也希望能帮助到有缘人。一、框架入口1.1 说明RILC主要分三块RILD,LibRIL,Ref

Quantai的博客 1997

Rild框架及流程

前言 个人学习过程总结 相关参考资料: 深入剖析 Android 系统_杨长刚/第 9 章 RIL 安卓 4.1 MTK 源码 整体框架 Rild 框架 RIL(Radio Interface Layer) 是上层程序使用地射频功能的接口层,它更像一个支持数据格式转换的 通道。 上层程序的 API 调用最终转换为底层射频能识别出的命令字符串,底层上报的字符串信息被翻译解释 后,又能被上层的程序...

wangjun7121的专栏 3300

RILD的启动流程图简介

RILD的启动流程,用流程图详细描述出来

Android 电话系统框架介绍

在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP。AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中:     {数组中的索引号,请求回调函数,响应回调函数}

kevinx_xu的专栏 9983

ANDROID rild详细介绍

详细描述rild实现的资料

Android教程之开机流程全面解析

本文详细讲述了Android的开机流程。分享给大家供大家参考,具体如下: 开机过程中无线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。这时候该做什么就做什么。 开机过程中无线模块的初始化过程: rild 调用参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数: const RIL_RadioFunctions *RIL_Init(

深入理解Android Telephony 之RILD机制分析

RILD负责modem和RILJ端的通信,信息分两种:unsolicited和solicited,前者是由modem主动上报的,诸如时区更新、通话状态、网络状态等消息,后者是RILJ端发请求并需要modem反馈的信息。RILJ与RILD之间的通信由主线程s_tid_dispatch负责监听,读取和分发,RILD与modem之间的通信由s_tid_mainloop和s_tid_reader负责写入和读

飞鸽传说的博客 3547

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 286

1.9 深入理解Vold和Rild

第9章 深入理解Vold和Rild 9.1 概述 本章将分析Android系统中两个比较重要的程序,它们分别是: Vold:Volume Daemon,用于管理和控制Android平台外部存储设备的后台进程,这些管理和控制,包括SD卡的插拔事件检测、SD卡挂载、卸载、格式化等。 Rild:Radio Interface Layer Daemon,用于智能手机的通讯管理和控制的后台进程,所有和手机通讯相关的功能,例如接打电话、收发短信/彩信、GPRS等都需要Rild的参与。 Vold和Rild都是Nat

外星人的杂货铺 1576

[arcgis插件]在批量出图时,如何把图层属性表以动态表格的形式插入到布局页面

在批量出图时,如何把图层属性表以动态表格的形式插入到布局页面。

坐听风雨 4562

Python读取Matlab v7.3数据

文章目录Matlab保存数据Python读取 v7.3 Mat Matlab保存数据 在matlab设置中,常规->MAT文件,选择MATLAB版本7.3或更高版本保存数据。 注意保存数据的文件名为 corre.mat,保存的数据数组为data; 后面python的读取中会用到这两个参数 Python读取 v7.3 Mat 先安装hdf5storage库,再使用以下代码,就可以读取到mat中的数据,注意 import hdf5storage import numpy as np dataDi

weixin_43121914的博客 1081

framework之深入理解Vold和Rild

Vold:用于管理和控制Android平台外部存储设备的后台进程,包括SD卡的插拔检测,挂载、卸载、格式化等等。 Rild:用于智能手机的通信管理和控制的后台进程,所有和手机通信相关的功能,如接打电话、收发短信、GPRS等。 Vold和Rild均为Native层,而MountService为java层。 Vold流程: Vold的NetlinkManager接收来自Linux kernel

ahjxly的专栏 2328

【3d打印】基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置

基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置(启庞Kp3s V1)

共享IT之美,共创机器未来 3192

深入理解android卷1 第8章:深入理解Vold和Rild

全称:Volume Daemon(卷管理守护进程)核心职责监听内核设备插拔事件(uevent)管理存储设备(SD卡、USB、OTG)挂载/卸载文件系统加密存储管理架构位置应用层(StorageManager)↓ BinderMountService(Java服务)↓ SocketVold(Native守护进程)↓ Netlink↓存储设备(SD卡、USB)全称:Radio Interface Layer Daemon(无线接口层守护进程)核心职责。

时代我西的博客 810

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 293

深入理解Android Telephony之RILD的启动

Android RILD

飞鸽传说的博客 3185

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 620

[深入理解Android卷一全文-第九章]深入理解Vold和Rild

由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在优快云博客中全文转发这两本书的全部内容。第9章  深入理解Vold和Rild本章主要内容·  介绍Vold。·  介绍Rild。本章涉及的源代码文件名称及位置下面是本章分析的源码文件名及其位置。·  Main.cppsystem/vold/Main.cpp·  Ne

Innost的专栏 8895

Keras神经网络可视化模块keras.utils.visualize_util的安装配置方法

本文介绍了如何安装和配置keras.utils.visualize_util模块,并提供了一个简单的示例演示如何使用该模块来可视化神经网络的结构。在上述代码中,我们首先定义了一个简单的神经网络模型,该模型具有一个输入层、一个隐藏层和一个输出层,其中隐藏层具有512个神经元,输出层具有10个神经元。运行上述代码后,我们将在当前工作目录下找到一个名为model.png的文件,它显示了神经网络的结构图。这种方式有效地展示了整个过程,让我们能够更好地理解神经网络的结构,方便对其进行改进和调试。

. 892

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入理解 Android 卷I - 第9章 深入理解Vold和Rild

第9章  深入理解Vold和Rild 本章主要内容 ·  介绍Vold。 ·  介绍Rild。 本章涉及的源代码文件名称及位置 下面是本章分析的源码文件名及其位置。 ·  Main.cpp system/vold/Main.cpp ·  NetlinkManager.cpp system/vold/NetlinkManager.cpp ·

莹波&微步 1240

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android4.4 RIL源码分析——RILD的启动过程

本文代码以Google原生AOSP Android 4.4为分析对象,与Google有些许差异,请读者知悉

东哥日记 1750

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入理解Android

《深入理解Android:卷I》前言 虽然前言位于书的最前面,但往往是最后才完成的。至今,《深入理解Android:卷I》的撰写工作算是基本完成了,在书稿付梓之前,心中却有些许忐忑和不安,因为拙著可能会存在Bug。为此,我先为书中可能存在的Bug将给大家带来的麻烦致以真诚的

华章IT官方博客 1811
上一篇: [live555] 从testRTSPClient.cpp PLAY 请求 四
下一篇: RIL 流程
杨尘心
博客等级 码龄10年 122粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值