在智能手机或智能手表等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 过程的更多相关文章

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

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

  2. niosii boot过程

    1 概述Nios II 的boot过程要经历两个过程. FPGA器件本身的配置过程.FPGA器件在外部配置控制器或自身携带的配置控制器的控制下配置FPGA的内部逻辑.如果内部逻辑中使用了Nios II ...

  3. 高通secury boot过程

    整理内容网盘地址: 链接:https://share.weiyun.com/79c3920b4f2097d93b719b3149a7f3f9 (密码:4jm9cx) 相关内容网站: http://bl ...

  4. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  5. Android 启动过程总结

    SystemServer的启动 frameworks/base/services/java/com/android/server/SystemServer.java: run() 其中调用Activi ...

  6. DSP开发资源总结,经典书籍,论坛

    OMAP4开发资源总结: 一.TI OMAP4官网介绍: http://www.ti.com.cn/general/cn/docs/wtbu/wtbuproductcontent.tsp?templa ...

  7. 初识DSP

    初识DSP 1.TI DSP的选型主要考虑处理速度.功耗.程序存储器和数据存储器的容量.片内的资源,如定时器的数量.I/O口数量.中断数量.DMA通道数等.DSP的主要供应商有TI,ADI,Motor ...

  8. i.MX RT600之DSP调试环境搭建篇

    恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作.不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核 ...

  9. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  10. Android Audio Play Out Channel

    1: 7嘴8舌 扬声器, 耳机, 和听筒 就是通过: audiomanager.setmode(AudioManager.MODE_IN_COMMUNICATION)audiomanager.setS ...

随机推荐

  1. cpa-财务成本管理

    1.财务管理基本原理 2.财务报表分析和财务预测 3.价值评估基础 4.资本成本 5.投资项目资本预算 6.债券.股票价值评估 7.期权价值评估 8.企业价值评估 9.资本结构 10.长期筹资 11. ...

  2. react之state两种不同的写法

    我发现 state 有两种不同的写法 在构造器 constructor 中是这样的 有 this. constructor(props){//参数必须要有 super(props); this.sta ...

  3. 云数据库MySQL多人协同开发实践

    本文分享自天翼云开发者社区<云数据库MySQL多人协同开发实践>,作者:不知不觉 随着云计算技术的快速发展,云数据库作为云计算的重要组成部分,为企业提供了高效.灵活和可靠的数据存储和管理服 ...

  4. Python pika消费Rabbit MQ数据,慢消费引起的connection reset问题

    问题描述 使用python pika框架,从Rabbit MQ消费数据时,遇到了connection reset的错误,错误内容如下: Traceback (most recent call last ...

  5. Q: 远程ssh登录不上

    1.密码没有问题 .2.防火墙没有禁用端口.3.ssh服务已安装且开启一般是ssh配置文件问题打开ssh配置文件 vim /etc/ssh/sshd_config ################## ...

  6. OI 博弈论若干模型总结(Genshing)

    OI博弈论的若干模型 OI 不是知识竞赛. 平等博弈是完全信息的(知道双方目标及操作收益),交替行动的,知道当前局面和转移的,平等(决策和当前状态操作者无关)的. 不平等博弈和上面一致,但是有一方更加 ...

  7. Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]

    跑路:绝佳倍增好题,思路是化 \(2^k\) 为 \(1\) ,倍增起预处理作用. 最近不知道是撞了什么运,前一脚看的是绿题,写完之后交一发,发现直接被 lxl 升蓝了,血赚. 思路:Floyd 首先 ...

  8. 流程控制之for循环练习画三角形

    package com.yeyue.struct; public class TestDemo { public static void main(String[] args) { //打印三角形 5 ...

  9. .Net 6 配置日志

    前言   .Net 6 与之前的配置有点不一样了记录下日志配置方式. 当前日志以Serilog为例,.Net 6 的日志由内置的Logger获取,然后可以交给Serilog|NLog等框架处理, 框架 ...

  10. swiper8.x在vue中的wtf

    首先我是想开启鼠标滚动的效果,在官网上发现如下说法 引入就引入吧,引入路径还不说,在网上看其他教程发现路径是 引入完了,怎么办呢,又不会了,官网没有教程,网上的教程全是关于vue-awesome-sw ...