在智能手机或智能手表等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. 字节流:FileInputStream和FileOutputStream的使用

    /** * 测试FileInputStream和FileOutputStream的使用 * * 结论: * 1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 * 2. 对于非 ...

  2. 创建多线程的方式二:实现Runnable接口

      /** * 创建多线程的方式二:实现Runnable接口 * 1. 创建一个实现了Runnable接口的类 * 2. 实现类去实现Runnable中的抽象方法:run() * 3. 创建实现类的对 ...

  3. Kevin pg walkthrough Easy

    第二个window 靶机 尝试访问 80 web界面 然后是个登录界面 我尝试admin admin 登录成功 发现版本 发现了exp https://www.exploit-db.com/explo ...

  4. ctfshow--web14 sql注入利用``的清奇的绕过

    输入c=3就会跳出来这个url 复制并访问,看这个页面应该是sql注入 有注释可看,看看他过滤了哪些东西 点击查看代码 if(preg_match('/information_schema\.tabl ...

  5. C# Newtonsoft.Json JObject常用方法

    1.创建-用匿名对象创建 JObject JObject ob = JObject.FromObject(new { RPT_ID = "getList", pageSize = ...

  6. [记录点滴] OpenResty中Redis操作总结

    [记录点滴] OpenResty中Redis操作总结 0x00 摘要 本文总结了在OpenResty中的操作,与大家分享,涉及知识点为Openresty, Lua, Redis. 0x01 操作记录 ...

  7. C盘扩展卷碰到的那些事-->不是同一块物理磁盘操作扩展卷是有坑的

    自己电脑上面用过win10系统资源管理器扩展卷的功能,用过几次都成功扩容了磁盘空间,简单说一下原理: 就是将剩余未分配的磁盘空间划给要扩展的磁盘. 这天公司的电脑C盘老是红色提示空间不足,那就扩充容量 ...

  8. 5分钟搞定!用比扬云SD-WAN远程访问飞牛NAS全攻略

    作为一个NAS重度用户,我最近遇到了一个头疼的问题:如何在外部安全地访问家里的飞牛NAS?经过一番摸索,我发现比扬云SD-WAN是个不错的解决方案,今天就来分享我的实战经验. 一.为什么选择比扬云SD ...

  9. 基于GD32的简易示波器

    基于GD32的简易示波器项目学习 根据立创训练营项目:[简易数字示波器设计(入门版) - 立创开源硬件平台(https://oshwhub.com/course-examples/yi-qi-yi-b ...

  10. thymeleaf的手动渲染HTML模板

    thymeleaf的手动渲染HTML模板 长河 2018-11-14 11:18:10  6833  收藏 2 分类专栏: Springboot 版权 现在很多公司都在thymeleaf作为前端的显示 ...