Audio DSP boot 过程
在智能手机或智能手表等SoC上通常有一块专门的audio DSP(简称ADSP)来做音频处理。要做音频处理,ADSP首先要被boot起来。本文以CEVA BX2为例来讲讲ADSP的boot过程。
在上篇文章(Audio DSP 链接脚本文件解析)里讲过链接脚本里用关键字ENTRY来设定程序的入口,且这个入口在crt0.c里会用到。ADSP boot过程在crt0.c里也有涉及。先看看crt0.c里有什么,然后再讲ADSP的boot。图1给出了crt0.c开始的几行示例代码。

图 1
上图中crt0.c是用简单汇编写的。最上面是在链接脚本里用关键字ENTRY来设定的程序入口,即 __cxd_inttbl_start。下面是几种场景下的入口地址,主要包括boot时的入口地址(图中定义为0x10,即boot时ADSP从地址0x10处开始运行,然后调函数_boot)、发生中断时的入口地址(图中定义为0x60,即发生中断时ADSP从地址0x60处开始运行,然后调函数_critical_handler)、产生异常(exception)时的入口地址(图中定义为0x70,即产生异常时ADSP从地址0x70处开始运行,然后调函数_common_handler)。
回到boot过程。整个SoC中AP最先起来,ADSP是被AP boot起来的。AP boot ADSP前要做一些准备工作,比如把ITCM的内容拷进ITCM里(ASIC设计时AP可以读写ADSP的ITCM,从ADSP看ITCM的起始地址是0x0,从AP看ADSP的ITCM起始地址被映射成另外一个值)。AP做完准备工作后,写寄存器,让ADSP从boot的起始地址0x10处运行,这样ADSP就从0x10处运行,开始boot过程了。前文写的,从0x10处运行时开始调_boot函数。_boot函数里首先把DTCM的内容拷进DTCM里等,最后调用大家熟悉的main()函数。Main函数里有一系列操作,包括cache相关的、中断控制单元(interrupt control unit, ICU)的相关的、IPC相关的、RTOS相关的等。可以用图2的流程图表示,需要说明的是cache、ICU和IPC没有先后顺序的,谁先谁后都可以,RTOS是一定要放在最后的。下面一一来介绍。

图 2
首先看cache。Cache就是内存缓冲区,速度快于外部memory,接近处理器。用cache来拉近外部memory和处理器之间的性能差异,提高整个系统的性能。Cache分为icache和dcache,icache用于code,dcache用于data。ADSP内部的ITCM和DTCM都很小,audio软件开发需要用到外部的memory(如DDR)来放一些非典型场景下的code和data,如果典型场景下的code和data ADSP内部memory放不下也要放外部memory上,因此ADSP需要cache来提高audio子系统的性能。Boot时需要对外部用到的memory配置一下cache属性。放code的memory配置一下icache属性,一般配成cacheable。放data的memory配置一下dcache属性。如果放的是常量等不需要核间交互的数据就需要配成cacheable,如果放的是需要核间交互的数据就需要配成uncachable。举例来说,某一块外部memory用于放AP发给ADSP的音频数据(AP先把音频数据放到指定的memory上,然后发IPC告诉ADSP起始地址和大小,ADSP收到IPC后就从指定地址上取音频数据),这块memory就要配成uncacheable。如果配成cacheable,当ADSP去取音频数据时,数据有可能还在cache里而不是在这块memory上,造成取到的数据是错误的。
中断相关的配置在ICU(interrupt control unit,中断控制单元)里。中断包括内部中断和外部中断。CEVA BX2内部中断共有9个(中断号是从0到8),比如定时器中断中断号为6,软中断中断号为8。外部中断支持分成几组,每组32个。通常外部中断不会超过32个,用一组就够了。外部中断号从9开始往上加。常见的外部中断包括IPC中断等。中断有中断向量表,表里放的是每个中断的中断服务程序(ISR)。中断服务程序通常很简洁,只有几行语句,包括清中断以及后续处理等。对于每个中断来说,会有些硬件配置,包括中断是电平触发还是沿触发。沿触发也包括是上升沿触发还是下降沿触发。在boot阶段要disable所有的中断,等boot完成再把需要使能的中断放开。前文crt0.c里讲到有几个不同场景下的入口地址,来中断就是其中之一。当有中断时,会从0x70处开始运行,调用_common_handler函数,在函数里会执行注册的中断服务程序。中断服务程序运行完后去做任务调度,执行优先级最高的那个任务。
IPC用于各个core之间的通信。IPC的本质是中断加ring buffer。一个core在跟另一个core通信前,先把要通信的数据以规定好的格式写进指定的ring buffer里,然后给对方发IPC中断。对方收到IPC中断后,从ring buffer里取出数据按照规定的格式做解析,完成一次完整的通信。对于IPC来说,boot时将各个IPC的中断服务程序注册到相应的中断向量表里,并enable这些中断。需要注意的是这些IPC中断在系统运行过程中是不能disable的。
最后看RTOS相关的。先是做RTOS的初始化,然后创建各种需要的task,如IPC task、idle task等。创建完各种task后,系统处于等待WFI(wait for interrupt)的idle task。
经过以上几步后ADSP 就算boot起来了。
Audio DSP boot 过程的更多相关文章
- Android手机上Audio DSP频率低 memory小的应对措施
我在前面的文章(Android智能手机上的音频浅析)中说过Android手机上有一块专门用于音频处理的DSP,它的特点是频率低(一般几百MHZ).内部memory小(通常不超过100k word).要 ...
- niosii boot过程
1 概述Nios II 的boot过程要经历两个过程. FPGA器件本身的配置过程.FPGA器件在外部配置控制器或自身携带的配置控制器的控制下配置FPGA的内部逻辑.如果内部逻辑中使用了Nios II ...
- 高通secury boot过程
整理内容网盘地址: 链接:https://share.weiyun.com/79c3920b4f2097d93b719b3149a7f3f9 (密码:4jm9cx) 相关内容网站: http://bl ...
- 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- Android 启动过程总结
SystemServer的启动 frameworks/base/services/java/com/android/server/SystemServer.java: run() 其中调用Activi ...
- DSP开发资源总结,经典书籍,论坛
OMAP4开发资源总结: 一.TI OMAP4官网介绍: http://www.ti.com.cn/general/cn/docs/wtbu/wtbuproductcontent.tsp?templa ...
- 初识DSP
初识DSP 1.TI DSP的选型主要考虑处理速度.功耗.程序存储器和数据存储器的容量.片内的资源,如定时器的数量.I/O口数量.中断数量.DMA通道数等.DSP的主要供应商有TI,ADI,Motor ...
- i.MX RT600之DSP调试环境搭建篇
恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作.不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核 ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- Android Audio Play Out Channel
1: 7嘴8舌 扬声器, 耳机, 和听筒 就是通过: audiomanager.setmode(AudioManager.MODE_IN_COMMUNICATION)audiomanager.setS ...
随机推荐
- mac环境安装Gradle及配置
mac环境安装Gradle及配置 说明# 最近在学习spring源码, 需要使用到gradle, 便从小白开始吧 ps: 基本按官方操作来完成的~ 前提# 从Gradle官网的安装指导可以 ...
- c++:-6
上一节学习了C++中的多态性:c++:-5,本节学习C++的函数模版.数据结构以及排序查找操作: 模版 函数模版 思考:如果重载的函数,其解决问题的逻辑是一致的.函数体语句相同,只是处理的数据类型不同 ...
- Groove Intermediate pg walkthrough
80端口web站点 dirsearch 没发现啥有用信息 感觉就是让我们突破登录框进后台的 https://github.com/ChurchCRM/CRM/issues/137 上网查到默认密码 登 ...
- 『Python底层原理』--CPython如何编译代码
前一篇我们介绍了CPython VM的运行机制,它基于一系列字节码指令来实现程序逻辑. 不过,Python字节码在完整描述代码功能上存在局限性,于是代码对象应运而生.像模块.函数这类代码块的执行,本质 ...
- 【SQL跟踪工具】SQL Profiler 跟踪器使用
阅读目录 什么是SQL Profiler 为什么要使用SQL Profiler 如何使用SQL Profiler 什么是SQL Profiler SQL Server Profiler 是一个功能丰富 ...
- Qwik-能帮你移出项目中99%的JS代码
本文分享自天翼云开发者社区<Qwik-能帮你移出项目中99%的JS代码>,作者:尹****勇 什么是 Qwik Qwik 是一款全栈SSR框架,它号称 -能帮你移出项目中99%的JS代码- ...
- 蝉联第一,天翼云电脑持续领跑中国DaaS市场!
近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...
- Maven配置多数据源
一.配置文件 修改maven配置文件,用户目录下.m2文件夹中的setting.xml,内容如下 <?xml version="1.0" encoding="UTF ...
- Magnet AXIOM使用+2024獬豸杯实战
Magnet AXIOM+2024獬豸杯实战 百度网盘链接 2024獬豸杯:https://pan.baidu.com/s/1t_6Fwl6RgmEtF0UXRfVD1A?pwd=j583#list/ ...
- SpringBoot 2.x 接入非标准SSE格式大模型流式响应实践 🚀
近期DeepSeek等国产大模型热度持续攀升,其关注度甚至超过了OpenAI(被戏称为CloseAI).在SpringBoot3.x环境中,可以使用官方的Spring AI轻松接入,但对于仍在使用JD ...