智能手机(或智能手表)等用电池的电子设备对功耗比较敏感,因此不管是使用中还是待机时都要做低功耗处理来省电。前面的文章(智能手表音乐播放功耗的优化)讲了一款智能手表在播放音乐时的低功耗优化,这属于音频场景使用中的低功耗处理,智能手机上的处理也类似。本文讲讲没有音频场景使用时Audio DSP(下文简称ADSP)的低功耗处理。

没有音频场景使用时,ADSP的低功耗处理我处理过两种,一种是音频子系统(包含ADSP、SRAM等)没有PMU(power management unit,电源管理单元)的,另一种则是有PMU的。没有PMU单元的处理比较简单,就是没有音频场景使用时AP把ADSP下电,这样ADSP没任何功耗,但是当有音频场景使用时,AP首先去boot  ADSP(boot过程见文章 Audio DSP boot 过程),然后开始具体的音频场景。Boot需要一定的时间,比如十几毫秒。对于有PMU单元的音频子系统,则要通过PMU做低功耗处理。即ADSP在没有音频场景使用时进入低功耗模式(Low Power Mode, LPM),有音频场景在使用时,ADSP被唤醒,开始具体的音频场景。下面具体讲。

ADSP被boot起来后,如果没有音频场景在使用中,就会进入idle状态。虽然在idle状态,但是也会耗电的,有一定的底电流。对于有PMU的音频子系统,就会通过PMU来做无音频场景使用时的低功耗处理,让功耗降到最小。低功耗处理是硬件和软件相结合的来做。硬件相关的由ASIC做好了,软件是要做好PMU相关的寄存器配置以及相关的逻辑。

先看要做低功耗处理PMU有哪些寄存器要配置。首先是低功耗模式。低功耗有三个模式,分别是CLOCK_GATING , PLL_OFF , PWR_OFF 。 CLOCK_GATING是关clock, PLL_OFF是关PLL,PWR_OFF是ADSP下电,这三种模式是功耗依次变小。通常情况下,既然做低功耗了,肯定要把功耗做到最低,即PWR_OFF模式。其次是memory配置模式。memory的配置有两种,分别是SHUTDOWN和RETENTION。SHUTDOWN是彻底下电,memory里的内容没了。RETENTION是带电保持,memory里的内容还在。在低功耗模式配成PWR_OFF的情况下,如果memory配成SHUTDOWN,让ADSP再起来就跟boot过程完全一样了。所以memory要配成RETENTION,在ADSP进入低功耗模式后让memory里的内容还在,当ADSP被唤醒后可以快速的进入工作模式。需要配置RETENTION的memory包括audio SRAM, ITCM, DTCM等。最后是唤醒源的配置。ADSP进入低功耗模式后要能被唤醒,即从低功耗模式出来开始工作。唤醒源就是那些能唤醒ADSP的中断,通常配置的唤醒源有其他核的IPC(比如AP的IPC)、内置的timer等,ADSP收到这些中断后就会被唤醒,先走唤醒流程,然后开始工作。

再看相关逻辑的处理,主要包括两方面,一是判断是否要进低功耗模式,二是从低功耗模式出来的唤醒流程。ADSP不仅在没有音频场景使用时处于idle状态,在有音频场景使用时也是频繁的在active和idle状态间切换,而且大部分时间处于idle状态。以codec播放音乐为例,是靠Audio DMA(ADMA)中断来驱动音乐播放的。ADMA中断通常10毫秒一次,来一次ADMA中断就会让ADSP从idle状态变成工作状态。ADSP工作一两毫秒后,任务完成,又回到Idle状态,所以说ADSP在音频场景使用时大部分时间处于idle状态。在ADSP处于idle状态时要判断是否进低功耗模式,在有音频场景使用时不进,没有则要进。具体软件实现时采用投票机制。每种音频场景都有一票,当所有音频场景都投票可进低功耗模式时才进低功耗模式,否则不进。

唤醒流程是指ADSP被唤醒后的软件处理流程。前面的文章(Audio DSP boot 过程)说过ADSP被boot时有入口地址,同样被唤醒时也有入口地址(这个入口地址是ADSP被boot起来后由ADSP去配的),也是在ctr0.c里,如下图:

上图意思是ADSP把被唤醒的入口地址配成了0x80,ADSP被唤醒后就从0x80处开始运行,进入唤醒处理流程。唤醒处理主要有哪些内容呢?上文说过,低功耗模式时memory配的是RETENTION模式,进入低功耗模式后memory里的内容还在,即软件还在,要处理的就是跟硬件相关的。主要是因为ADSP进入低功耗模式后,ADSP下电了,跟硬件相关的配置都没了,需要重新配置一下。硬件的配置主要包括cache的配置,中断控制器的配置等。还有就是在ADSP进入低功耗模式前要记下有哪些中断没有被mask。ADSP被唤醒后,这些中断也要被配成unmask,保持与ADSP进入低功耗模式前的一致。这些说白了就是硬件的配置要还原成ADSP进入低功耗模式前的样子。ADSP收到的唤醒源中断把ADSP唤醒后,中断还pending在那,没被处理。当软件把中断使能后,立刻进入中断服务程序处理,并进而进入后续的处理流程。

下面就以手机先开机然后播放音乐为例看看整个过程,示意如下图:

1,  手机开机,ADSP被AP boot起来,做软硬件的初始化等。由于没有音频场景,ADSP先进idle,再进低功耗模式(LPM)

2,  要播放音乐,AP给ADSP发IPC,把ADSP唤醒,走音乐播放流程。在音乐播放过程中,每个loop内ADSP大部分时间处于idle状态,但是由于有音频场景在,不会进入LPM

3,  音乐播放结束,没有音频场景了,ADSP就从idle进入了LP模式。如果后续又有新的音频场景开始,ADSP又会给唤醒,开始新的音频场景。

过程清楚了后再看怎么调试。我把调试分成了两个阶段,第一阶段是ADSP刚被boot起来后没有音频场景的单步调试,第二阶段是带音频场景的联合调试。第一阶段主要分3步:

1,  ADSP被boot起来后,由于无活可干,会进idle,再通过配置寄存器让ADSP进入低功耗模式。通过读相关寄存器看ADSP是否能进低功耗模式。如没进,则要去调查原因,最终要进入低功耗模式。

2,  在ADSP进入低功耗模式后,AP给ADSP发一个IPC,看ADSP是否会被唤醒以及是否会进唤醒流程。同样如果ADSP没被唤醒或者没进唤醒流程,需要去调查,最终要能被唤醒以及进唤醒流程

3,  在唤醒流程中做上文说的一些处理,最后进IPC的中断服务程序。又无活可干,再进idle,再进低功耗模式。

上面这3步就把ADSP能进低功耗模式以及能被唤醒以及唤醒流程处理调好了。然后就是带音频场景的联合调试,期望结果是有音频场景时ADSP被唤醒,音频场景结束后ADSP又进低功耗模式。把每个音频场景都要调试一下后整个调试就算完成了。无音频场景的低功耗处理看上去没什么,但是从理解过程到完成调试是需要花一些时间的,因为它牵涉到硬件以及最底层软件的处理。

智能手机无音频场景使用时Audio DSP低功耗的处理的更多相关文章

  1. Android智能手机中各种音频场景下的audio data path

    上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景 ...

  2. Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法

    昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景 ...

  3. Java 中无返回值的方法在使用时应该注意的问题

    Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具 ...

  4. 【原】无脑操作:IDEA使用时,提示"8080端口被占用"的解决

    1.问题描述:IDEA使用时,提示"8080端口被占用" Description:    The Tomcat connector configured to listen on ...

  5. Android手机上Audio DSP频率低 memory小的应对措施

    我在前面的文章(Android智能手机上的音频浅析)中说过Android手机上有一块专门用于音频处理的DSP,它的特点是频率低(一般几百MHZ).内部memory小(通常不超过100k word).要 ...

  6. html5之音频、视频(video&audio)

    音频&视频 本篇为本人的学习笔记. 在Html5之前,浏览器对于视频和音频的处理并没有一个标准.因此在网页中看到的视频,都是通过第三插件的方式嵌入的,如:QuickTime.RealPlaye ...

  7. Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性

    使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...

  8. bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验

    bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验 (解决办法) http://blog.csdn.net/biedazhangs ...

  9. selenium + PhantomJS使用时 PhantomJS报错解决

    selenium + PhantomJS使用时 PhantomJS报错解决 在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: UserWarning: Sele ...

  10. 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力

    音频编辑服务(Audio Editor Kit)是华为为开发者开放的各类场景音频处理能力的集合,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务提供基础编辑.伴奏提取.空间渲染.变声降噪等 ...

随机推荐

  1. 面试题:Linux 系统基础 (二)

    Linux系统中的定时任务有哪些类型,它们是如何配置的? Linux系统中的定时任务主要有两种类型:Cron作业和at作业. 1.Cron作业: 使用crontab命令配置和管理. 配置周期性执行的任 ...

  2. 头晕的android SDK Manager and 找不到真机

    这张图很完美!可是出问题就头晕了. 问题场景:执行Andriod.bat出现下面界面后,然后跳出Andriod SDK的界面: android SDK Manager的界面就孤零零的几条记录挂在那里. ...

  3. .NET周刊【3月第3期 2025-03-16】

    国内文章 在 VisualStudio 一键 F5 启动调试 Roslyn 分析器项目 https://www.cnblogs.com/lindexi/p/18730521 本文将告诉大家如何在 Vi ...

  4. RAGflow搭建text-to-sql的AI研发助手

    一.概述 text-to-sql 技术允许用户通过自然语言提问,系统自动将其转换为 SQL 语句并执行,大大降低了数据查询的门槛,提高了工作效率. text-to-sql 技术在数据分析.智能客服.数 ...

  5. Python科学计算系列3—多项式操作

    1.因式分解 例1:分解下列多项式 代码如下: from sympy import symbols, factor x, y = symbols('x y') f = 3 * x ** 4 - 2 * ...

  6. dubbo源码解析-服务暴露与发现

    一.概述 dubbo是一个简单易用的RPC框架,通过简单的提供者,消费者配置就能完成无感的网络调用.那么在dubbo中是如何将提供者的服务暴露出去,消费者又是如何获取到提供者相关信息的呢? 二.dub ...

  7. JAVA基础之多线程三期--线程安全问题

    一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...

  8. 开发者专用部署工具PasteSpider的V5正式版发布啦!(202504月版),更新说明一览

    PasteSpider是一款以开发者角度设计的部署工具,支持把你的项目部署到Windows或者Linux服务器,支持5大模式Windows(IIS/Service),Linux(systemd),Do ...

  9. Mysql 常用时间函数(上)

    也是做数据分析嘛, SQL 必然是每天都要用的, 然后在分析中, 时间是数据分析中极为重要的部分, 可以说是承上启下或者是贯穿整个分析. 比如, 日, 周, 月, 季度, 年度 与之相对应的 环比, ...

  10. pyspark - 逻辑回归

    是在整理文件时, 翻到的, 感觉是好久以前的代码了, 不过看了, 还是可以的. 起码注释还是蛮清晰的. 那时候我真的是妥妥的调包man.... # 逻辑回归-标准化套路 from pyspark.ml ...