概述
文章目录
- 前言
- 一、DSP架构
- 二、内存管理
- 三、 多核并行处理
- 1.1、主从模式
- 1.2、数据流模式
- 四、多核同步
- 4.1、共享存储区变量
- 4.2、硬件信号量
- 五、Cache的使用
- 六、DMA的使用
- 七、一些编程tips
- 7.1 关键字
- 7.2 struct定义
- 7.3 存储
- 7.4 动态内存
- 7.5 编译器选项
- 八、八核固化
- 附录
前言
下面是本人关于ti/国产 6678DSP学习的一些心得,仅代表本人的理解,内容较为基础,部分内容来源于本人的硕士学位论文[论文地址https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C475KOm_zrgu4sq25HxUBNNTmIbFx6y0bOQ0cH_CuEtpsDD7U8egXseoJpMHXA3Wa05LW46_ax6rGgF-fcZKoE-z&uniplatform=NZKPT 论文DOI:10.27389/d.cnki.gxadu.2022.000259]及官方提供的技术手册。
一、DSP架构
6678芯片的主频最高可达1.2GHz,为了运行稳定,一般选择将主频设为1GHz。在1GHz的主频下,它的运算能力可以达到256GMAC/128GFLOPS,同时还支持单指令多数据流(SIMD)操作。它的总体架构如下图所示:
二、内存管理
6678的存储器主要由L1P、L1D、L2、MSM以及DDR3组成,其中L1P、L1D、L2是每个核私有的一片区域,MSM是八个核共享的一段4MB的空间,DDR3是外部挂载的扩展存储空间,存储器的架构如下图所示。
L1P是DSP取指流水线和一级存储控制器(L1)之间的接口,主要作用是直接向 CPU 提供指令。L1D是DSP数据和L1之间的接口,是与CPU具有相同工作频率且与CPU最接近的数据存储器。可以通过字节、半字、字、双字的读写完成对CPU存储指令的处理。L2是高级存储器和L1之间的接口,作为L1D和L1P的下一级存储器,既可以用来存放数据又可以用来存放程序。L2 SRAM中的数据可以通过使用在L1D/L1P Cache中存在的副本,减少对相同数据的重复读取,提高程序的运行效率。
L1P、L1D、L2均支持存储保护、带宽管理机制和低功耗控制等功能,且都可以通过修改相关寄存器,完成Cache/SRAM比例的配置。L1P可以将它的部分存储器配置成一路组相联的大小为4KB,8KB,16KB 或 32KB的Cache;L1D可以将它的部分存储器配置成两路组相联的大小为4KB,8KB,16KB 或 32KB的Cache;L2可以将它的部分存储器配置成四路组相联的大小为32KB,64KB,128KB,256KB或512KB的Cache。
MSM还提供了可被包括8个FT-M66x内核、DMA控制器等在内的所有主机访问的4MB的片上共享 SRAM,并可以处理上述主机的访问请求,完成请求仲裁。同时还可挂载DDR3以扩展外部存储空间。在时钟频率为1333MHz时,DDR可提供高达10.664GB/s的通信带宽;在1GHz的DSP主频下,MSMC可提供高达64GB/s的通信带宽。
对于上述提到的L1P、L1D、L2、MSMC、DDR等内存空间,均可以通过连接命令文件 (Linker Command Files,CMD 文件)对其重新划分。CMD文件主要由MEMORY和SECTIONS组成:MEMORY用来配置芯片存储器的区域,用户可以自行定义各存储器区域的起始地址和长度;SECTIONS用来指定段的存放位置,下图为某个cmd文件的配置。
-c为链接器选项,主要与变量的初始化时机有关,当选择-cr时,变量会在加载程序时进行初始化,当选择-c时,程序会在运行main函数前,自动完成变量的初始化。-heap和-stack为设置的堆和栈的大小,堆主要用来存放动态内存的数据,对于堆中存放的动态数组,需要用户通过malloc/calloche和free进行手动管理。栈则主要用来存放局部变量。本文将堆的大小设为了0x30000=192KB,将栈的大小设为了0x8000=32KB。
用户可以在MEMORY中配置芯片存储器的区域,以便更加高效合理利用DSP的内存区域。在编写MEMORY时需主要起始地址应在相应内存空间的区域之内,且总长度不能超过存储器的长度。以二级存储控制器L2为例,它在FT-M6678中内存的起始地址为0x00800000,总长度为512KB,512KB换算成十六进制为512*1024=0x80000,则它在内存中的地址区域为0x00800000-0x00880000。本文将L2划分为两个区域VECTORS和L2SRAM,前者用来存放中断向量表,后者一名来存放代码、变量等段数据。两个区域的总长度应不大于512KB,且都在L2所在区域内。因此,本文将VECTORS的起始地址设为0x00800000,长度为0x200,则它的地址区域为0x00800000-0x00800200,将L2SRAM的起始地址设为0x00800200,长度为0x7FE00,则它的地址区域为0x00800200-0x00880000。两片区域的总长度为512KB,且都在L2所在的区域内。此外,在分配存储器区域时,区域是一块连续的空间,不同的区域不能有交叉重叠。
用户可以在SECTIONS中指定段的存放位置,在SECTIONS中,前面的名称为段名,后面的名称为MEMORY部分用户自行划分的存储器区域,一般包含一下几个部分:
**vecs:**存放中断向量表,如本设计中即将使用的SRIO接口,在收到doorbell中断后,需要程序自行跳转至中断服务函数,这个过程由中断向量表来进行控制;
.text:存放二进制可执行代码和常量; .cinit:存放初始化的变量和常量; .sysmem:为动态申请的空间保留的存储区;
**.stack:**栈区,存放局部变量; .far:存放未初始化的far类型的全局和静态变量;
**.fardata:**存放显式初始化的非常数的全局和静态变量;
**.const:**存放初始化的字符串常量、far类型和const类型的全局变量和静态变量; .bss:存放未初始化的全局和静态变量;
**.data:**存放初始化的数据常量; .neardata:存放显示初始化的near类型的非常数全局和静态变量;
**.rodata:**存放初始化的near类型的全局和静态变量; .cio:存放C的I/O缓冲区;
**.switch:**存放switch语句的跳转表。
以上空间,均位于L2上,其中,还有一些本设计自定义的空间,位于MSMC上的.data_msmc段和位于DDR上的.data_ddr0段、.data_ddr1段。
合理的内存分配策略,有助于提高程序的运行效率。对于内存的分配,主要考虑存储器大小、存储器带宽两个方面。越靠近内核的存储器,带宽越高,数据的读取越快。对于DSP的存储器,L1最靠近内核,其次是L2,接着是MSMC,最后的DDR。对于收到的雷达回波数据,由于数据量较大,可将其放在距离内核较远的DDR区域上,在对数据进行算法处理时,可以将通过DMA将部分数据搬移至动态内存上,将动态内存所在的堆区放在L2,这样可以大幅度提升数据的处理速度。对于程序中一些共用的结构体和全局变量,可以将其放在MSMC上,八个核能共同访问的同时,还能提高数据的读取速度。特别地,可以使用DATA_SECTION和DATA_ALIGN关键字,将变量置于用户自定义的空间上。使用DATA_SECTION关键字指定目标区域,使用DATA_ALIGN关键字进行字节对齐操作,提高CPU的数据读取效率。
三、 多核并行处理
目前主流的多核并行任务处理模式主要有主从模式和数据流模式,接下来将对这两种处理模式进行分析。
1.1、主从模式
在主从模式中,人为地将8个FT-M66x内核分为主核和从核。一般将0核设为主核,1-7核设为从核,由主核负责对任务进行分配,完成流程控制。0核具备和FPGA建立SRIO通信的能力,FPGA通过SRIO接口向DSP发送回波数据,在数据发送完毕后,发送doorbell中断。0核触发doorbell中断后,进入中断服务函数,通过判断标志位,触发不同模式的成像算法。通过核号,将数据分为八份,八个核采用相同的算法处理不同的数据,每个核相互独立,适合处理非耦合性的数据。此种模式下数据处理时间可接近单核的八分之一,每个核采用的算法完全相同,易于工程实现。该模式下主从之间的关系如下图所示。
1.2、数据流模式
在数据流模式中,人为地将算法分为八个部分,每个核执行算法的一部分。该模式下,核间不是相互独立的,而是高度依赖的。核0在收到FPGA的doorbell中断后,开始算法处理。0核首先执行属于0核的任务,此时1-7核属于等待状态,0核执行完毕后,1核开始处理0核处理后的数据,此时2-7核处于等待状态,0核开始接收下一帧的回波数据并处理,依次循环,当0核收到第九帧的回波数据后,7核正好处理完第一帧的回波数据,并准备处理第二帧的回波数据。此种模式下,只要不断有数据进行处理,再处理完八帧数据后,数据处理的时间的单核的八分之一,但需要按照计算量,严格地对算法就行分割。该模式下各核与任务之间的关系如下图所示。
通过以上的分析发现,两种模式的数据处理时间都可近似达到单核的八分之一。对于主从模式,并非对所有数据都适用,需要行数据或列数据之间不存在耦合性,可以直接对数据进行分块处理;对于数据流模式,对任何数据的处理均适用,但数据流模式下,需要严格地将总算法按计算量分为八份,大大加剧了工程人员的工作量,工程实现较为困难。因此在DSP进行并行处理操作时,需要选用合适的并行处理模式。
四、多核同步
在主从模式下,需要对数据进行分块操作,八个核采用同样的算法对数据进行处理,在有些情况下,只有八个核都处理完后,才能进行下一步的算法处理,如本步对矩阵的行进行处理,下一步要对矩阵的列进行处理,只有八个核都完成对矩阵的行处理后,才能进行列处理。由于各种因素的限制,八个核不可能做到严格同时处理完,为保证下一步的正常进行,需要做一个同步处理,以提升程序的稳定性和保证程序的正确性。FT-M6678在工作时,可以支持实时操作系统SYS/BIOS,也可以在裸核状态下工作。对于操作系统和裸核,FT-M6678均提供了核间通信方式以完成多核同步:对于操作系统,可以采用消息中间件(Notify)同步、消息队列(Message Queue,MessageQ)、核间中断机制(Inter-Processor Communication,IPC)等方法;对于裸核,可以采用共享存储区变量、硬件信号量(Semaphore)等方式同步。考虑到SYS/BIOS操作系统的复杂性和不稳定性,在遇到问题时不易排查,一般常选择裸核的工作模式。接下来本节将主要对裸核模式下的共享存储区变量和硬件信号量两种同步方式做重点分析。
4.1、共享存储区变量
通过共享存储区变量实现多核同步的原理较简单。由本章3.2节可知,在FT-M6678的存储系统中,MSMC和DDR是两段公共的区域,八个核都可以进行访问。在进行多核通信之前,需要首先编写cmd文件,按照第1节的方法,通过MEMORY在MSM或DDR中开辟一段公共区域,然后在SECTIONS中完成段的映射,最后将结构体定义在该段上
typedef struct _Radar_FLAG_{
char sync_flag[8];
}RadarFlag_t;
extern RadarFlag_t RadarFlag;
#pragma DATA_SECTION(RadarFlag,".data_msmc");
#pragma DATA_ALIGN(data_msmc, 8);
RadarFlag_t RadarFlag;
我们在共享存储区的.datda_msmc段上定义了一个结构体,其中sync_flag是一个拥有8个元素的数组,每个核拥有一个元素,作为同步的标志位。具体的使用如下所示。其中CoreNum为0-7核的核号,初始化阶段,将sync_flag数组里的元素都置为0,执行完多核任务后,将sync_flag[CoreNum] 置为1,当检测到sync_flag数组里的所有元素都为1时,则将sync_flag[CoreNum]重新置为0,并开始进入下一步的多核处理任务,否则在while循环里等待,直到其它核的任务处理完。
multi_task0();
RadarFlag.sync_flag[CoreNum]=1;
while(!(RadarFlag.sync_flag[0]&RadarFlag.sync_flag[1]&RadarFlag.sync_flag[2]&
RadarFlag.sync_flag[3]&RadarFlag.sync_flag[4]&RadarFlag.sync_flag[5]&
RadarFlag.sync_flag[6]&RadarFlag.sync_flag[7]));
RadarFlag.sync_flag[CoreNum]=0;
multi_task1();
该方式虽然实现简单,但可能存在存储高速缓存一致性问题,关于这个问题,将在第5节进行详细分析,多个核对同一片区域读写可能会造成数据的读取失败而不能完成多核的同步。可以通过配置相关的MAR寄存器将某片区域配置不可Cache,并将结构体定义在这片区域上以解决这一问题。
4.2、硬件信号量
为多核系统提供一套互斥机制是必要的,可以有效防止多核对同一资源的竞争,而信号量则提供了这一机制。FT-M6678共提供了64个独立的信号量,每个FT-M66x核均可通过直接、间接或组合的方式对任意一个信号量进行访问以完成对共享资源的使用申请。直接方式是最简单的申请信号量的方式,如果信号量被占用,则返回当前正在使用该信号量的核号,如果信号量为空闲,则返回“0x01”。间接方式采用了辅助队列,在对信号量发起请求后,如果信号量被占用,则进入请求队列进行排队,持续等待一旦该信号量被其它核释放,处在队列最顶端的请求事件立即被允许,并占用该信号量,如果信号量为空闲,则直接获取该信号量。组合方式为直接方式和间接方式的混合,如果信号量空闲,则表现为直接方式,如果信号量被占用时,则表现为间接请求。三种方式的结果是相同的,因此接下来,将采用较为简单的直接方式对信号量的使用进行分析。
FT-M6678可以直接采用TI为TMS320C6678提供的信号量支持库,完成对信号量的操作。在使用之前,需要将csl_semAux.h包含到工程中,csl_semAux.h是信号量的头文件,里面包含了对各种信号量配置的应用程序编程接口,开发人员可以直接进行调用。在使用信号量时主要使用到了三个函数:CSL_semAcquireDirect(N)、CSL_semReleaseSemaphore(N)、CSL_semIsFree(N)。CSL_semAcquireDirect(N)是采用直接方式对第N个信号量进行申请,CSL_semReleaseSemaphore(N)是对第N个信号量进行释放,CSL_semIsFree(N)是判断第N个信号量是否处于空闲状态,空闲返回1,否则返回0,具体的使用如图4.3所示。在DSP上电后,首先释放掉需要用到的八个核各自需要用到的信号量,其它们处于空闲状态。在执行完多核任务后,各核申请编号为核号+1(不存在编号为0的信号量)的信号量,使用到的八个信号量处于被占用状态,之后进入while循环,判断各个核申请的信号量的状态,等到所有的信号量都处于被占用状态了,说明任务已执行完,进入下一步的任务,任务执行完后,各核释放编号为核号+1的信号量,之后进入while循环,在等待所有的信号量都被释放后,开始执行下一步任务。通过交替进行信号量的申请和释放,完成多核同步。
multi_task0();
CSL_semAcquireDirect(CoreNum+1);
while(CSL_semIsFree(1)|CSL_semIsFree(2)|CSL_semIsFree(3)|CSL_semIsFree(4)|
CSL_semIsFree(5)|CSL_semIsFree(6)|CSL_semIsFree(7)|CSL_semIsFree(8));
multi_task1();
CSL_semReleaseSemaphore(CoreNum+1);
while(!(CSL_semIsFree(1)&CSL_semIsFree(2)&CSL_semIsFree(3)&CSL_semIsFree(4)&
CSL_semIsFree(5)&CSL_semIsFree(6)&CSL_semIsFree(7)&CSL_semIsFree(8)));
multi_task2();
硬件信号量的实现也较为简单,可以直接调用官方的函数实现,相比于共享存储区变量,不会出现高速缓存一致性问题,准确率更高,具有显著的优势。因此本文采用硬件信号量并使用相对简单的直接方式来实现多核同步。
五、Cache的使用
在DSP中,不同存储器的工作主频不同,这就导致了存储器和处理器的性能之间存在了差异,当CPU在主频较低的存储器上读取数据时,需要等待一定的时钟周期,为解决存储器和处理器性能之间的矛盾,产生了Cache机制。Cache,即高速缓存存储器,通过在靠近内核的区域开辟一段专用的区域用于保存CPU经常访问的外部存储器的数据,当CPU再次对该数据进行访问时,CPU可以直接在Cache中取数,而不必再次去外部存储器中去取,减少了CPU的等待时间。L1、L2离内核较近,可以配置为Cache。因此在使用时,在程序中打开Cache,把经常使用的程序和数据放入Cache中,能在一定程度上提高程序的运行效率。
Cache的使用,解决了处理器和存储器工作频率不匹配问题,提高了程序的运行效率,但却会带来高速缓存数据一致性问题。Cache中保存的是存储器数据的拷贝,当DSP的某个核要修改某个数据时,改变的仅仅是Cache中数据的副本,存储器中的数据并未改变,当其它核读取该数据时,由于直接在存储器中读,因此数据并未更新,得到的是旧数据,这样就会得到错误的结果,这就是高速缓存数据一致性问题。
以核0为例,在某个时刻,Cache中保存了存储器中数据0x11223344的副本,在下一时刻,核0需要将存储器中的数据修改为0x55667788。由于Cache中存在存储器中数据的副本,因此省去了CPU去外部存储器寻找该数据的过程,直接将Cache中的数据修改为了0x55667788,而存储器中的数据并未更新。之后核1去存储器中读取数据,此时读取到的数据为0x11223344,数据读取错误。
在具体使用时,一般会用到两级缓存,一级缓存速度较快,但容量较小,二级缓存速度为一级缓存速度的一半,但是容量较大。如果目标数据在Cache中,每次CPU都可以直接在Cache中取数,那么Cache的命中率就会提高,程序的运行速率也会相应地提高。为了提高Cache的命中率,需要合理地配置二级缓存的大小。L1、L2均可全部配置为Cache,但是Cache空间并非越高越好。如果Cache的比例较高,会影响SRAM的空间,反而会降低程序的运算速率。因此应该根据计算的规模,合理地对Cache大小进行配置。当CPU要访问外部存储器中的数据时,会首先在L1中去寻找相应的数据拷贝,如果找到,则命中,否则去L2中寻找,如果还是无法命中,则接着去外部存储器中去找。在找到相应的数据后,先把数据读取到L2中,再读取到L1中,最后读取到内核中。考虑到L1的速度较快,空间也可以足以满足计算规模的需要,因此本设计将L1全部配置为Cache,L2将Cache大小配置为64KB,为计算预留一定的空间,L2其余的448KB的空间为SRAM,存放程序段以及其它相关段。采用官方提供的配置函数,具体配置过程下所示。
CACHE_setL1PSize (CACHE_L1_32KCACHE);
CACHE_setL1DSize (CACHE_L1_32KCACHE);
CACHE_setL2Size (CACHE_64KCACHE);
M66x提供了两种方式进行一致性维护,一种是硬件自动维护,另一种是手动软件维护。对于核内L2 SRAM与L1D Cache数据直接的一致性,硬件会自动维护。但是对于L2 SRAM与L1P Cache之间的一致性,外存(包括MSM和DDR3)与L1 Cache、L2 Cache之间的一致性,需要手动软件维护。对于手动软件维护,官方提供了三种操作:作废、写回、写回作废。下面对这三种操作进行简单介绍。
作废:将缓存块作废,Cache中的数据直接丢弃;
写回:将更新后的数据写回存储器,但数据仍留在Cache中;
写回作废:首先将更新后的数据写回存储器,之后丢弃Cache中的数据。
L1 Cache和L2 Cache均支持上述三种操作,既可进行块操作(即在某个范围内进行操作),又可进行全局操作(即在整个区域内进行操作)。对于具体的操作,官方提供了相应的函数,具体介绍如下所示。
CACHE_invL1p L1P块作废 块操作
CACHE_invL1d L1D块作废
CACHE_invL2 L2块作废
CACHE_wbL1d L1D块写回
CACHE_wbL2 L2块写回
CACHE_wbInvL1d L1D块写回作废
CACHE_wbInvL2 L2块写回作废
CACHE_invAllL1p L1P全局作废 全局操作
CACHE_invAllL1d L1D全局作废
CACHE_invAllL2 L2全局作废
CACHE_wbAllL1d L1D全局写回
CACHE_wbAllL2 L2全局写回
CACHE_wbInvAllL1d L1D全局写回作废
CACHE_wbInvAllL2 L2全局写回作废
注:由于L1P不存放数据,所以不存在数据写回操作。对于块操作,函数的有效输入参数有数据所在存储器的起始地址、数据长度;对于全局操作,函数无有效输入参数。
六、DMA的使用
由于回波的数据量较大,FPGA在采集到回波后,将其发送到DSP的DDR上。在实际运算中,为了提高运算速度,通常将待处理的数据搬移到L2中,处理完后,将结果搬回DDR,然后再处理下一组数据。对于数据的搬移,主要有三种方式:直接赋值、memcpy和DMA。、
对于直接赋值很好理解,就是使用“=”将DDR地址上的数据逐渐赋给L2上开辟的动态数组,但是DDR地址上的数据类型和L2动态数组的数据类型相同,这种逐点操作的方式,效率很低。
memcpy是C/C++中常用的数据拷贝方式,不需要额外的硬件参与,直接使用如下所示的函数就可将内存上的数据拷贝过去,对数据类型没有要求。其中dst为目的地址,src为源地址,len为需要拷贝的字节数。该种方式操作简单,但只能搬移连续地址上的数,且效率相对较低。
void *memcpy(void *dst, const void *src, size_t _n)
DMA(Direct Memory Access),即直接存储器访问,它的实现需要额外的硬件参与。FT-M6678在内部集成了DMA控制器,通过CrossNet总线,对内连接八个核内部各自的L1P、L1D和L2等存储器,对外连接了MSMC、DDR、SRIO、EMIF等存储器和外设。可以通过对DMA控制器的配置,可以完成对DSP不同存储器之间的数据交互。
DMA最多可以在三个维度上进行数据搬移,即acnt、bcnt和ccnt,但一般只需要用到两个维度的acnt、bcnt即可完成搬移,具体使用如下所示,其中ChannelNum为使用的DMA通道号,src为源地址,dst为目的地址,acnt为一次搬移的数据长度,bcnt为搬移重复的次数,srcBidx为每次搬移源地址跳变的长度,disBidx为此搬移目的地址跳变的长度。DMA对数据的搬移操作比较灵活,可以顺序搬移,也可以跳跃搬移。通过跳跃搬移,可以实现矩阵的转置等功能。DMA的操作相对独立,不需要CPU的参与,速度较快,适合大数据量搬移或地址有跳变的场合。
void DMA_transport_ab_region(int ChannelNum,Uint32 src , Uint32 dst, int acnt, int bcnt, int srcBidx, int dstBidx)
下面以矩阵转置为例,具体说明一下DMA的使用。DSP的内存空间是线性的,考虑到FPGA向DSP发送数据的过程是逐脉冲进行的,因此回波矩阵在DSP内存中常按距离向存储。在数据处理过程中,会涉及到对矩阵方位向的处理,需要将矩阵的存储方式由距离向存储转换为按方位向存储,这就涉及到了矩阵的转置问题,通过八核完成矩阵转置的过程如下图所示。
完成矩阵转置关键的步骤为通过地址的跳跃取数将矩阵每行的数据取出,并按顺序存储于新地址。考虑到直接通过循环赋值的方式较为繁琐,且效率较低,因此可以采用DMA方式完成矩阵的转置。假设矩阵为浮点型实数矩阵,距离向点数为nrn,方位向点数为nan ,将第n行数据转置至第n列时,DMA搬移的源地址为起始地址加上n4个字节的偏移量,目的地址为起始地址加上nnrn4个字节,每次源地址跳变nrn4个字节,目的地址跳变4个字节,重复nan次。考虑到八核的并行,假设每个核的核号为CoreNum ,则在同一时刻各核处理的数据行号为CoreNum*nrn/8+n ,其中0<n<nrn/8 。对于复数矩阵的转置,原理与其相同,这里不做过多介绍。
在使用DMA搬移数据前,要首先使用DMA_Init_region(1)打开相关通道,在搬移数据后,要使用waitDMAover_region(1)等待搬移完成中断,在DMA使用完毕后,使用DMA_Close_region(1)进行关闭。当然,DMA的打开和关闭也可以置于程序的最开始和结尾,但个人更倾向于置于使用前和使用后,个人习惯罢了。
七、一些编程tips
7.1 关键字
volatile
使用volatile关键字后,使用-o3编译选项,编译器也不会对该变量的访问做任何优化,用来声明一些 全局变量。
(1)凡是2个线程共享的全局变量就需要使用volatile关键字。
(2)凡是某个内存地址的内容随时可能被外部硬件环境改变就需要使用volatile关键字。
restrict
使用restrict关键字,程序员告诉编译器确保在指针定义范围内对象指针只能被这个指针访问。
void floatVectorExp_2(float * restrict arrayIn, float *restrict array)
{
}
确保指针arrayIn,array的指向对象不会在存储器上交叠,不会出现数据依赖,一个指针的写操作不会影响另一个指针的读操作。
nassert
_nassert的作用是告诉编译器地址已经边界对齐。在for循环之前使用。
例:_nassert((int)input1 % 8 == 0)
8字节对齐
const
const修饰符用来定义任何变量或者数组,确保数据值不变。
在用作函数参数时,const只能用于修饰输入参数,采用指针传递,加上const关键字可以防止函数体内部对该参数进行修改,起到参数保护的作用。
例:
float RealVectorSum(const float *restrict x,const int nx)
{
}
UNROLL
UNROLL编译指示用于指定编译器循环需要被展开多少次。除了MUST_ITERATE和PROB_ITERATE外,在UNROLL编译指示与for,while,do-while循环之间不能有其他声明。
例: #pragma UNROLL(n)
编译器展开循环,导致存在原来循环的n份拷贝。配合MUST_ITERATE编译指示告诉循环最小可能循环迭代数、最大可能循环迭代数、循环倍数。
MUST_ITERATE
使用MUST_ITERATE编译指示,可以保证循环执行特定的次数。
例1:告诉编译器循环并执行正好10次,
#pragma MUST_ITERATE(10,10);
for(i=0; i<conut;i++)
{
}
例2:告诉编译器循环并执行8—48之间,且循环次数变量为8 的倍数(8,16,24,32,40,48)
#pragma MUST_ITERATE(8,48,8);
for(i=0; i<conut;i++)
{
}
7.2 struct定义
typedef struct
{
float month;
float day;
float year;
}Date;
extern volatile Date birthday;
若将该结构体放在DDR3中
#pragma DATA_SECTION(birthday, ".dataDDR");
#pragma DATA_ALIGN(birthday, 8);
volatile Date birthday;
说明:
typedef struct : 声明新的结构体类型 Date :新的类型名 不是结构体变量名
Birthday : 结构体变量名
关键字 volatile 必须加上
.dataDDR 定义为DDR3中的段
7.3 存储
matlab中以uint8形式存储成 .bin格式的文件,载入的时候以8bit或者16bit的形式载入,内存中的结果会因为某种格式的对齐方式而出现扩展(四个字节来表示一个实际字节)。
如果载入的时候以32bit或者64bit的形式载入,结果无扩展。
如果实际数据为
10 00 E0 D0 00 00 FF FF 30 F0 30 20 00 FF 00 00
则以32bit或者64bit的形式载入,以Hex 8 bit 格式,数据显示为(实际存放)
10 00 E0 D0 00 00 FF FF 30 F0 30 20 00 FF 00 00
以Hex 16 bit 格式,数据显示为(并不是实际存放,低位在前,高位在后)
0010 D0E0 0000 FFFF F030 2030 FF00 0000
以Hex 32 bit 格式,数据显示为(并不是实际存放,低位在前,高位在后)
D0E00010 FFFF0000 2030F030 0000FF00
以Hex 64 bit 格式,数据显示为(并不是实际存放,低位在前,高位在后)
FFFF0000D0E00010 0000FF002030F030
char sss[64];
sss[0] = *((char*)0x80000000); // 第一个字节
sss[1] = *((char*)0x80000000+1); // 第二个字节
float aaa[8];
aaa[0] = *((float*)0x80000000); // 取 0x80000000这个地址开始的四个字节
aaa[1] = *((float*)0x80000000+1*4); //取 0x80000004这个地址开始的四个字节
小端格式:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中;
例:32bit宽的数0x12345678,放在内存(0x4000)中
内存地址 0x4000 0x4001 0x4002 0x4003
数据 0x78 0x56 0x34 0x12
大端格式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中;
例:32bit宽的数0x12345678,放在内存(0x4000)中,
内存地址 0x4000 0x4001 0x4002 0x4003
数据 0x12 0x34 0x56 0x78
7.4 动态内存
动态内存位于堆区,一般将堆区映射至L2空间上。在计算过程中,考虑到L2的带宽较大,因此常江一些变量置于L2中。可采用malloc/free进行动态内存的申请与释放,具体使用格式如下:
float *temp1 = (float *)malloc(nrn_m*2*size_float);
free(temp1);
在上述语句中,使用malloc申请了一个nrn_m*2大小的存放浮点型数的动态数组,在使用完毕后通过free进行了释放,在使用完毕后,请务必要进行释放,否则有可能会导致内存泄露。
7.5 编译器选项
C6000编译器提供了一些程序优化的编译选项,合理地进行配置,可以达到提高程序运行效率的目的。接下来将对其中常见的优化选项进行介绍。
直接开优化选项-O(Optimization level)是最简单直接的程序优化手段。它提供了四个等级的优化选项,分别是-O0、-O1、-O2、-O3。他们各自的功能如下:
-O0:属于寄存器级的优化,它的优化功能包括精简控制流和表达式,为程序中声明的变量分配寄存器,将程序中未用到的代码删除,调用程序中的内联函数(Inline
function)。
-O1属于局部级的优化,它的优化功能在-O0级的基础上增加了对本地拷贝或局部变量的使用,将未使用到的变量赋值和局部相同的表达式删除。
-O2::属于函数级的优化,它的优化功能在-O1级的基础上增加了循环优化和软件流水,在循环中使用指针增加的形式代替对数组的引用,删除了全局相同的表达式及未使用到的变量赋值。
-O3:属于文件级的优化,它的优化功能在-O2级的基础上增加了对带有返回值但未使用返回值的函数的精简,删掉了对文件中所有未使用的函数,并对小函数进行内敛优化和进行SIMD操作。
在程序优化前,要选择上述几个选项之一。在选择-O2、-O3时,程序不是顺序执行的,程序在进行流水线操作和循环优化时,编译器会把自认为无用语句去掉,但实际使用中,这些可能是有用的(-O0和-O1选项无此问题)。针对此问题,可以同时使用-g选项避免此问题,但这样会造成程序运行效率的下降,降低了优化效果。另外,也可以改变程序的编写方式,如使用volatile关键字修饰相关变量,限制其对相关语句的优化。首先需要通过调试确定哪些关键变量被优化掉了,之后使用volatile关键字修饰这些关键变量。使用volatile关键字配合-O2/-O3的方式对程序的优化效果相比于未进行软件流水的-O0/-O1方式更为高效,此外还有以下几个常用的编译器选项。
**-mt选项:**告知编译器程序未使用混叠技术,即在对同一个对象进行访问时,未使用两种及以上的方式进行访问,如两个指针对同一个对象进行访问,可以使编译器更好地完成对程序的优化。
-pm选项,属于程序级的优化,它允许编译器在整个工程的角度结合源文件对程序进行优化,它将所有的源文件整合到同一个文件中去优化,通常和-O3配合使用。
**-ms选项:**对代码尺寸进行优化,共有四级优化,但会牺牲程序的性能。一般会使用-ms0和-ms1选项,-ms2或-ms3一般适用于很少执行的代码或对代码尺寸有很高要求的情况。
**-g选项:**使能符号调试和汇编语句调试。通过程序编译生成的“.out”文件中的行号和符号信息,可以在C语言级别对程序进行分析调试。但是该选项会限制C语言程序的优化,通常与-mt和-O3联合使用,既可以进行符号调试,又能在最大程度上对程序进行优化。
一般而言,-O3选项为保证程序结果的正确性,需要对程序逐变量逐语句去分析,要付出较高的代价。对于-pm和-g选项,常与-O3配合使用。对于-mt选项,需要在确保程序中未使用混叠技术时才可以开。经过综合考虑,最终对整个程序的编译选择-O2和-ms1选项,并对关键变量使用volatile关键字修饰。个人偏爱的编译选项如下所示,在这种编译选项下,既保证了较好的优化性能及程序的正确性,又减少了工作量,降低了程序的开发难度。
八、八核固化
多核启动时如需要将程序分配在 L2 SRAM 存储空间,cmd 文件配置地址不要使用 L2 SRAM 的私有地址,必须使用共享 L2 SRAM 地址,如表8.1所示。
因为8个核的L2 SRAM的私有地址都是叫0x00800000,如在boot时, 8 个核的应用工程都分配在 0x00800000 地址上,用 hex6x.exe 生成的
8 个核的头地址都是 0x00800000,在启动时 RBL 读到 0x00800000 的地址认为是 core0 的 L2 SRAM 的地址,故将会将 core1~core7 启动数据都搬移到 core0 的 L2 SRAM 中,故启动失败。
表8.1 M6678 各核逻辑地址对应表
模块 32 位逻辑地址
Core0 L2 SRAM 0x10800000
Core1 L2 SRAM 0x11800000
Core2 L2 SRAM 0x12800000
Core3 L2 SRAM 0x13800000
Core4 L2 SRAM 0x14800000
Core5 L2 SRAM 0x15800000
Core6 L2 SRAM 0x16800000
Core7 L2 SRAM 0x17800000
上述逻辑地址均在cmd中修改,核0-核7的cmd文件可参考Multi_core_0- Multi_core_7下的cmd文件。以核0为例,核0中L2的32位逻辑地址为0x10800000,则程序修改如下:
核7中L2的32位逻辑地址为0x17800000,则程序修改如下:
与此同时,在核0的cmd开头还要加上如下语句,具体为啥,我也不知道,ft技术支持要求的:
核0中,中断向量表vecs.asm中,程序的入口改为initial,同时将initial.asm加入到工程中,initial.asm主要是控制八个核程序的运行,具体原理我也不清楚,官方提供的。
生成.out:
将八个核生成的.out文件放在Multi_Core_Boot_v3tool文件夹下:
之后运行spiboot_multi_8cores_noddr.bat,生存bootimage_nor.dat,假设该文件的第一行数据为1651 9 0C000000 0 1606 1,则该头文件内容的头部含义如下:
1651 9 0c000000 0 1606 1
固定标识 数据类型 基地址 数据 数据长度 1606*4 固定标识
注意:因为在本例中应用工程使用的是 CCS5.5,所以通过工具链生成的.dat 文件的头部信息为“1651 9 0C0000000 1606 1”。如使用 CCS6.0 加载此.dat,请将上述头部信息改为 1651 9 0C0000000 0 1606 5”,因为 CCS 版本对“32-Bit
Hex-C 数据格式”的代号可能不同,所以使用不同的 CCS 版本要将.dat 文件的头部格式要改为“32-Bit Hex-C 数据格式”对应代号。
生成bootimage_nor.dat文件后,加载M6678_SPI_NorFlash_v1.3程序,在该程序中,bootimage_nor.dat的数据长度修改SIZE大小,之后程序运行即可完成固化。
附录
内存地址映射
00000000 007FFFFF 00000000 007FFFFF 8M Reserved
00800000 0087FFFF 00800000 0087FFFF 512K Local L2 SRAM
00880000 00DFFFFF 00880000 00DFFFFF 5M+512K Reserved
00E00000 00E07FFF 00E00000 00E07FFF 32K Local L1P SRAM
00E08000 00EFFFFF 00E08000 00EFFFFF 1M-32K Reserved
00F00000 00F07FFF 00F00000 00F07FFF 32K Local L1D SRAM
00F08000 017FFFFF 00F08000 017FFFFF 9M-32K Reserved 01800000 01BFFFFF
01800000 01BFFFFF 4M C66x CorePac Registers
01C00000 01CFFFFF 01C00000 01CFFFFF 1M Reserved
01D00000 01D0007F 01D00000 01D0007F 128 Tracer_MSMC_0
01D00080 01D07FFF 01D00080 01D07FFF 32K-128 Reserved
01D08000 01D0807F 01D08000 01D0807F 128 Tracer_MSMC_1
01D08080 01D0FFFF 01D08080 01D0FFFF 32K-128 Reserved
01D10000 01D1007F 01D10000 01D1007F 128 Tracer_MSMC_2
01D10080 01D17FFF 01D10080 01D17FFF 32K-128 Reserved
01D18000 01D1807F 01D18000 01D1807F 128 Tracer_MSMC_3
01D18080 01D1FFFF 01D18080 01D1FFFF 32K-128 Reserved
01D20000 01D2007F 01D20000 01D2007F 128 Tracer_QM_DMA
01D20080 01D27FFF 01D20080 01D27FFF 32K-128 Reserved
01D28000 01D2807F 01D28000 01D2807F 128 Tracer_DDR 01D28080 01D2FFFF 0
01D28080 0 01D2FFFF 32K-128 Reserved
01D30000 01D3007F 01D30000 01D3007F 128 Tracer_SM
01D30080 01D37FFF 01D30080 01D37FFF 32K-128 Reserved
01D38000 01D3807F 01D38000 01D3807F 128 Tracer_QM_CFG
01D38080 01D3FFFF 01D38080 01D3FFFF 32K-128 Reserved
01D40000 01D4007F 01D40000 01D4007F 128 Tracer_CFG
01D40080 01D47FFF 01D40080 01D47FFF 32K-128 Reserved
01D48000 01D4807F 01D48000 01D4807F 128 Tracer_L2_0
01D48080 01D4FFFF 01D48080 01D4FFFF 32K-128 Reserved
01D50000 01D5007F 01D50000 01D5007F 128 Tracer_L2_1
01D50080 01D57FFF 01D50080 01D57FFF 32K-128 Reserved
01D58000 01D5807F 0 01D58000 0 01D5807F 128 Tracer_L2_2
01D58080 01D5FFFF 01D58080 01D5FFFF 32K-128 Reserved
01D60000 01D6007F 01D60000 01D6007F 128 Tracer_L2_3
01D60080 01D67FFF 01D60080 01D67FFF 32K-128 Reserved
01D68000 01D6807F 01D68000 01D6807F 128 Tracer_L2_4
01D68080 01D6FFFF 01D68080 01D6FFFF 32K-128 Reserved
01D70000 01D7007F 01D70000 01D7007F 128 Tracer_L2_5
01D70080 01D77FFF 01D70080 01D77FFF 32K-128 Reserved
01D78000 01D7807F 01D78000 01D7807F 128 Tracer_L2_6 Memory Map
Summary (Sheet 2 of 7) Logical 32-bit Address Physical 36-bit
Address Bytes Description Start End Start End
01D78080 01D7FFFF 01D78080 01D7FFFF 32K-128 Reserved
01D80000 01D8007F 01D80000 01D8007F 128 Tracer_L2_7
01D80080 01DFFFFF 01D80080 01DFFFFF 512K-128 Reserved
01E00000 01E3FFFF 01E00000 01E3FFFF 256K Telecom Serial Interface Port
0 01E40000 01E7FFFF 01E40000 01E7FFFF 256K Reserved
01E80000 01EBFFFF 01E80000 01EBFFFF 256K Telecom Serial Interface Port
(TSIP) 1 01EC0000 01FFFFFF 01EC0000 01FFFFFF 1M +256K Reserved
02000000 020FFFFF 02000000 020FFFFF 1M Network Coprocessor (Packet
Accelerator, Gigabit Ethernet Switch Subsystem and Security
Accelerator) 02100000 021FFFFF 02100000 021FFFFF 1M Reserved
02200000 0220007F 02200000 0220007F 128 Timer0
02200080 0220FFFF 02200080 0220FFFF 64K-128 Reserved
02210000 0221007F 02210000 0221007F 128 Timer1
02210080 0221FFFF 02210080 0221FFFF 64K-128 Reserved
02220000 0222007F 02220000 0222007F 128 Timer2
02220080 0222FFFF 02220080 0222FFFF 64K-128 Reserved
02230000 0223007F 02230000 0223007F 128 Timer3
02230080 0223FFFF 02230080 0223FFFF 64K-128 Reserved
02240000 0224007F 02240000 0224007F 128 Timer4 02240080 0224FFFF 0
02240080 0 0224FFFF 64K-128 Reserved 02250000 0225007F 0 02250000 0
0225007F 128 Timer5 02250080 0225FFFF 0 02250080 0
0225FFFF 64K-128 Reserved 02260000 0226007F 0 02260000 0
0226007F 128 Timer6 02260080 0226FFFF 0 02260080 0
0226FFFF 64K-128 Reserved 02270000 0227007F 0 02270000 0
0227007F 128 Timer7 02270080 0227FFFF 0 02270080 0
0227FFFF 64K-128 Reserved 02280000 0228007F 0 02280000 0
0228007F 128 Timer8 02280080 0228FFFF 0 02280080 0
0228FFFF 64K-128 Reserved 02290000 0229007F 0 02290000 0
0229007F 128 Timer9 02290080 0229FFFF 0 02290080 0
0229FFFF 64K-128 Reserved 022A0000 022A007F 0 022A0000 0
022A007F 128 Timer10 022A0080 022AFFFF 0 022A0080 0
022AFFFF 64K-128 Reserved 022B0000 022B007F 0 022B0000 0
022B007F 128 Timer11 022B0080 022BFFFF 0 022B0080 0
022BFFFF 64K-128 Reserved 022C0000 022C007F 0 022C0000 0
022C007F 128 Timer12 022C0080 022CFFFF 0 022C0080 0
022CFFFF 64K-128 Reserved 022D0000 022D007F 0 022D0000 0
022D007F 128 Timer13 022D0080 022DFFFF 0 022D0080 0
022DFFFF 64K-128 Reserved 022E0000 022E007F 0 022E0000 0
022E007F 128 Timer14 022E0080 022EFFFF 0 022E0080 0
022EFFFF 64K-128 Reserved 022F0000 022F007F 0 022F0000 0
022F007F 128 Timer15 022F0080 022FFFFF 0 022F0080 0
022FFFFF 64K-128 Reserved 02300000 0230FFFF 0 02300000 0
0230FFFF 64K Reserved Memory Map Summary (Sheet 3 of 7) Logical
32-bit Address Physical 36-bit Address Bytes Description
Start End Start End 02310000 023101FF 0 02310000 0 023101FF 512 PLL
Controller 02310200 0231FFFF 0 02310200 0 0231FFFF 64K-512 Reserved
02320000 023200FF 0 02320000 0 023200FF 256 GPIO 02320100 0232FFFF 0
02320100 0 0232FFFF 64K-256 Reserved 02330000 023303FF 0 02330000 0
023303FF 1K SmartReflex 02330400 0234FFFF 0 02330400 0
0234FFFF 127K Reserved 02350000 02350FFF 0 02350000 0
02350FFF 4K Power Sleep Controller (PSC) 02351000 0235FFFF 0
02351000 0 0235FFFF 64K-4K Reserved 02360000 023603FF 0 02360000 0
023603FF 1K Memory Protection Unit (MPU) 0 02360400 02367FFF 0
02360400 0 02367FFF 31K Reserved 02368000 023683FF 0 02368000 0
023683FF 1K Memory Protection Unit (MPU) 1 02368400 0236FFFF 0
02368400 0 0236FFFF 31K Reserved 02370000 023703FF 0 02370000 0
023703FF 1K Memory Protection Unit (MPU) 2 02370400 02377FFF 0
02370400 0 02377FFF 31K Reserved 02378000 023783FF 0 02378000 0
023783FF 1K Memory Protection Unit (MPU) 3 02378400 023FFFFF 0
02378400 0 023FFFFF 543K Reserved 02400000 0243FFFF 0 02400000 0
0243FFFF 256K Debug Subsystem Configuration 02440000 02443FFF 0
02440000 0 02443FFF 16K DSP trace formatter 0 02444000 0244FFFF 0
02444000 0 0244FFFF 48K Reserved 02450000 02453FFF 0 02450000 0
02453FFF 16K DSP trace formatter 1 02454000 0245FFFF 0 02454000 0
0245FFFF 48K Reserved 02460000 02463FFF 0 02460000 0 02463FFF 16K DSP
trace formatter 2 02464000 0246FFFF 0 02464000 0 0246FFFF 48K Reserved
02470000 02473FFF 0 02470000 0 02473FFF 16K DSP trace formatter 3
02474000 0247FFFF 0 02474000 0 0247FFFF 48K Reserved
02480000 02483FFF 0 02480000 0 02483FFF 16K DSP trace formatter 4
02484000 0248FFFF 0 02484000 0 0248FFFF 48K Reserved
02490000 02493FFF 0 02490000 0 02493FFF 16K DSP trace formatter 5
02494000 0249FFFF 0 02494000 0 0249FFFF 48K Reserved
024A0000 024A3FFF 0 024A0000 0 024A3FFF 16K DSP trace formatter 6
024A4000 024AFFFF 0 024A4000 0 024AFFFF 48K Reserved
024B0000 024B3FFF 0 024B0000 0 024B3FFF 16K DSP trace formatter 7
024B4000 024BFFFF 0 024B4000 0 024BFFFF 48K Reserved
024C0000 0252FFFF 0 024C0000 0 0252FFFF 448K Reserved
02530000 0253007F 0 02530000 0 0253007F 128 I2C data & control
02530080 0253FFFF 0 02530080 0 0253FFFF 64K-128 Reserved
02540000 0254003F 0 02540000 0 0254003F 64 UART 02540400 0254FFFF 0
02540400 0 0254FFFF 64K-64 Reserved 02550000 025FFFFF 0 02550000 0
025FFFFF 704K Reserved 02600000 02601FFF 0 02600000 0 02601FFF 8K Chip
Interrupt Controller (CIC) 0 02602000 02603FFF 0 02602000 0
02603FFF 8K Reserved 02604000 02605FFF 0 02604000 0 02605FFF 8K Chip
Interrupt Controller (CIC) 1 02606000 02607FFF 0 02606000 0
02607FFF 8K Reserved Memory Map Summary (Sheet 4 of 7) Logical 32-bit
Address Physical 36-bit Address Bytes Description
Start End Start End 02608000 02609FFF 0 02608000 0 02609FFF 8K Chip
Interrupt Controller (CIC) 2 0260A000 0260BFFF 0 0260A000 0
0260BFFF 8K Reserved 0260C000 0260DFFF 0 0260C000 0 0260DFFF 8K Chip
Interrupt Controller (CIC) 3 0260E000 0261FFFF 0 0260E000 0
0261FFFF 72K Reserved 02620000 026207FF 0 02620000 0
026207FF 2K Chip-Level Registers 02620800 0263FFFF 0 02620800 0
0263FFFF 126K Reserved 02640000 026407FF 0 02640000 0
026407FF 2K Semaphore 02640800 0264FFFF 0 02640800 0
0264FFFF 64K-2K Reserved 02650000 026FFFFF 0 02650000 0
026FFFFF 704K Reserved 02700000 02707FFF 0 02700000 0
02707FFF 32K EDMA3 Channel Controller (EDMA3CC) 0 02708000 0271FFFF 0
02708000 0 0271FFFF 96K Reserved 02720000 02727FFF 0 02720000 0
02727FFF 32K EDMA3 Channel Controller (EDMA3CC) 1 02728000 0273FFFF 0
02728000 0 0273FFFF 96K Reserved 02740000 02747FFF 0 02740000 0
02747FFF 32K EDMA3 Channel Controller (EDMA3CC) 2 02748000 0275FFFF 0
02748000 0 0275FFFF 96K Reserved 02760000 027603FF 0 02760000 0
027603FF 1K EDMA3CC0 Transfer Controller (EDMA3TC) 0
02760400 02767FFF 0 02760400 0 02767FFF 31K Reserved
02768000 027683FF 0 02768000 0 027683FF 1K EDMA3CC0 Transfer
Controller (EDMA3TC) 1 02768400 0276FFFF 0 02768400 0
0276FFFF 31K Reserved 02770000 027703FF 0 02770000 0
027703FF 1K EDMA3CC1 Transfer Controller (EDMA3TC) 0
02770400 02777FFF 0 02770400 0 02777FFF 31K Reserved
02778000 027783FF 0 02778000 0 027783FF 1K EDMA3CC1 Transfer
Controller (EDMA3TC) 1 02778400 0277FFFF 0 02778400 0
0277FFFF 31K Reserved 02780000 027803FF 0 02780000 0
027803FF 1K EDMA3CC1 Transfer Controller (EDMA3TC) 2
02780400 02787FFF 0 02780400 0 02787FFF 31K Reserved
02788000 027883FF 0 02788000 0 027883FF 1K EDMA3CC1 Transfer
Controller (EDMA3TC) 3 02788400 0278FFFF 0 02788400 0
0278FFFF 31K Reserved 02790000 027903FF 0 02790000 0
027903FF 1K EDMA3PCC2 Transfer Controller (EDMA3TC) 0
02790400 02797FFF 0 02790400 0 02797FFF 31K Reserved
02798000 027983FF 0 02798000 0 027983FF 1K EDMA3CC2 Transfer
Controller (EDMA3TC) 1 02798400 0279FFFF 0 02798400 0
0279FFFF 31K Reserved 027A0000 027A03FF 0 027A0000 0
027A03FF 1K EDMA3CC2 Transfer Controller (EDMA3TC) 2
027A0400 027A7FFF 0 027A0400 0 027A7FFF 31K Reserved
027A8000 027A83FF 0 027A8000 0 027A83FF 1K EDMA3CC2 Transfer
Controller (EDMA3TC) 3 027A8400 027AFFFF 0 027A8400 0
027AFFFF 31K Reserved 027B0000 027CFFFF 0 027B0000 0
027CFFFF 128K Reserved 027D0000 027D0FFF 0 027D0000 0 027D0FFF 4K TI
embedded trace buffer (TETB) - CorePac0 027D1000 027DFFFF 0 027D1000 0
027DFFFF 60K Reserved 027E0000 027E0FFF 0 027E0000 0 027E0FFF 4K TI
embedded trace buffer (TETB) - CorePac1 027E1000 027EFFFF 0 027E1000 0
027EFFFF 60K Reserved 027F0000 027F0FFF 0 027F0000 0 027F0FFF 4K TI
embedded trace buffer (TETB) - CorePac2 027F1000 027FFFFF 0 027F1000 0
027FFFFF 60K Reserved 02800000 02800FFF 0 02800000 0 02800FFF 4K TI
embedded trace buffer (TETB) - CorePac3 Memory Map Summary (Sheet 5
of 7) Logical 32-bit Address Physical 36-bit Address Bytes Description
Start End Start End 02801000 0280FFFF 0 02801000 0
0280FFFF 60K Reserved 02810000 02810FFF 0 02810000 0 02810FFF 4K TI
embedded trace buffer (TETB) - CorePac4 02811000 0281FFFF 0 02811000 0
0281FFFF 60K Reserved 02820000 02820FFF 0 02820000 0 02820FFF 4K TI
embedded trace buffer (TETB) - CorePac5 02821000 0282FFFF 0 02821000 0
0282FFFF 60K Reserved 02830000 02830FFF 0 02830000 0 02830FFF 4K TI
embedded trace buffer (TETB) - CorePac6 02831000 0283FFFF 0 02831000 0
0283FFFF 60K Reserved 02840000 02840FFF 0 02840000 0 02840FFF 4K TI
embedded trace buffer (TETB) - CorePac7 02841000 0284FFFF 0 02841000 0
0284FFFF 60K Reserved 02850000 02857FFF 0 02850000 0 02857FFF 32K TI
embedded trace buffer (TETB) — system 02858000 0285FFFF 0 02858000 0
0285FFFF 32K Reserved 02860000 028FFFFF 0 02860000 0
028FFFFF 640K Reserved 02900000 02920FFF 0 02900000 0
02920FFF 132K Serial RapidIO (SRIO) configuration 02921000 029FFFFF 0
02921000 0 029FFFFF 1M-132K Reserved 02A00000 02BFFFFF 0 02A00000 0
02BFFFFF 2M Queue manager subsystem configuration 02C00000 07FFFFFF 0
02C00000 0 07FFFFFF 84M Reserved 08000000 0800FFFF 0 08000000 0
0800FFFF 64K Extended memory controller (XMC) configuration
08010000 0BBFFFFF 0 08010000 0 0BBFFFFF 60M-64K Reserved
0BC00000 0BCFFFFF 0 0BC00000 0 0BCFFFFF 1M Multicore shared memory
controller (MSMC) config 0BD00000 0BFFFFFF 0 0BD00000 0
0BFFFFFF 3M Reserved 0C000000 0C3FFFFF 0 0C000000 0
0C3FFFFF 4M Multicore shared memory (MSM) 0C400000 107FFFFF 0
0C400000 0 107FFFFF 68 M Reserved 10800000 1087FFFF 0 10800000 0
1087FFFF 512K CorePac0 L2 SRAM 10880000 108FFFFF 0 10880000 0
108FFFFF 512K Reserved 10900000 10DFFFFF 0 10900000 0
10DFFFFF 5M Reserved 10E00000 10E07FFF 0 10E00000 0
10E07FFF 32K CorePac0 L1P SRAM 10E08000 10EFFFFF 0 10E08000 0
10EFFFFF 1M-32K Reserved 10F00000 10F07FFF 0 10F00000 0
10F07FFF 32K CorePac0 L1D SRAM 10F08000 117FFFFF 0 10F08000 0
117FFFFF 9M-32K Reserved 11800000 1187FFFF 0 11800000 0
1187FFFF 512K CorePac1 L2 SRAM 11880000 118FFFFF 0 11880000 0
118FFFFF 512K Reserved 11900000 11DFFFFF 0 11900000 0
11DFFFFF 5M Reserved 11E00000 11E07FFF 0 11E00000 0
11E07FFF 32K CorePac1 L1P SRAM 11E08000 11EFFFFF 0 11E08000 0
11EFFFFF 1M-32K Reserved 11F00000 11F07FFF 0 11F00000 0
11F07FFF 32K CorePac1 L1D SRAM 11F08000 127FFFFF 0 11F08000 0
127FFFFF 9M-32K Reserved 12800000 1287FFFF 0 12800000 0
1287FFFF 512K CorePac2 L2 SRAM 12880000 128FFFFF 0 12880000 0
128FFFFF 512K Reserved 12900000 12DFFFFF 0 12900000 0
12DFFFFF 5M Reserved 12E00000 12E07FFF 0 12E00000 0
12E07FFF 32K CorePac2 L1P SRAM 12E08000 12EFFFFF 0 12E08000 0
12EFFFFF 1M-32K Reserved 12F00000 12F07FFF 0 12F00000 0
12F07FFF 32K CorePac2 L1D SRAM 12F08000 137FFFFF 0 12F08000 0
137FFFFF 9M-32K Reserved Memory Map Summary (Sheet 6 of 7) Logical
32-bit Address Physical 36-bit Address Bytes Description
Start End Start End 13800000 1387FFFF 0 13800000 0
1387FFFF 512K CorePac3 L2 SRAM 13880000 138FFFFF 0 13880000 0
138FFFFF 512K Reserved 13900000 13DFFFFF 0 13900000 0
13DFFFFF 5M Reserved 13E00000 13E07FFF 0 13E00000 0
13E07FFF 32K CorePac3 L1P SRAM 13E08000 13EFFFFF 0 13E08000 0
13EFFFFF 1M-32K Reserved 13F00000 13F07FFF 0 13F00000 0
13F07FFF 32K CorePac3 L1D SRAM 13F08000 147FFFFF 0 13F08000 0
147FFFFF 9M-32K Reserved 14800000 1487FFFF 0 14800000 0
1487FFFF 512K CorePac4 L2 SRAM 14880000 148FFFFF 0 14880000 0
148FFFFF 512K Reserved 14900000 14DFFFFF 0 14900000 0
14DFFFFF 5M Reserved 14E00000 14E07FFF 0 14E00000 0
14E07FFF 32K CorePac4 L1P SRAM 14E08000 14EFFFFF 0 14E08000 0
14EFFFFF 1M-32K Reserved 14F00000 14F07FFF 0 14F00000 0
14F07FFF 32K CorePac4 L1D SRAM 14F08000 157FFFFF 0 14F08000 0
157FFFFF 9M-32K Reserved 15800000 1587FFFF 0 15800000 0
1587FFFF 512K CorePac5 L2 SRAM 15880000 158FFFFF 0 15880000 0
158FFFFF 512K Reserved 15900000 15DFFFFF 0 15900000 0
15DFFFFF 5M Reserved 15E00000 15E07FFF 0 15E00000 0
15E07FFF 32K CorePac5 L1P SRAM 15E08000 15EFFFFF 0 15E08000 0
15EFFFFF 1M-32K Reserved 15F00000 15F07FFF 0 15F00000 0
15F07FFF 32K CorePac5 L1D SRAM 15F08000 167FFFFF 0 15F08000 0
167FFFFF 9M-32K Reserved 16800000 1687FFFF 0 16800000 0
1687FFFF 512K CorePac6 L2 SRAM 16880000 168FFFFF 0 16880000 0
168FFFFF 512K Reserved 16900000 16DFFFFF 0 16900000 0
16DFFFFF 5M Reserved 16E00000 16E07FFF 0 16E00000 0
16E07FFF 32K CorePac6 L1P SRAM 16E08000 16EFFFFF 0 16E08000 0
16EFFFFF 1M-32K Reserved 16F00000 16F07FFF 0 16F00000 0
16F07FFF 32K CorePac6 L1D SRAM 16F08000 177FFFFF 0 16F08000 0
177FFFFF 9M-32K Reserved 17800000 1787FFFF 0 17800000 0
1787FFFF 512K CorePac7 L2 SRAM 17880000 178FFFFF 0 17880000 0
178FFFFF 512K Reserved 17900000 17DFFFFF 0 17900000 0
17DFFFFF 5M Reserved 17E00000 17E07FFF 0 17E00000 0
17E07FFF 32K CorePac7 L1P SRAM 17E08000 17EFFFFF 0 17E08000 0
17EFFFFF 1M-32K Reserved 17F00000 17F07FFF 0 17F00000 0
17F07FFF 32K CorePac7 L2 SRAM 17F08000 1FFFFFFF 0 17F08000 0
1FFFFFFF 129M-32K Reserved 20000000 200FFFFF 0 20000000 0
200FFFFF 1M System trace manager (STM) configuration
20100000 20AFFFFF 0 20100000 0 20AFFFFF 10M Reserved
20B00000 20B1FFFF 0 20B00000 0 20B1FFFF 128K Boot ROM
20B20000 20BEFFFF 0 20B20000 0 20BEFFFF 832K Reserved
20BF0000 20BF01FF 0 20BF0000 0 20BF01FF 512 SPI 20BF0200 20BFFFFF 0
20BF0200 0 20BFFFFF 64K-512 Reserved 20C00000 20C000FF 0 20C00000 0
20C000FF 256 EMIF16 config 20C00100 20FFFFFF 0 20C00100 0 20FFFFFF 12M
256 Reserved Start Address (Hex) Size (Hex Bytes) Description 0x00872DC0 0x40 ROM boot version string
(Unreserved)
0x00872E00 0x400 Boot code stack 0x00873200 0xE0 Boot log
0x008732E0 0x20 Boot progress register stack (copies of boot program
on mode change) 0x00873300 0x100 Boot Internal Stats
0x00873400 0x20 Boot table arguments 0x00873420 0xE0 ROM boot FAR data
0x00873500 0x100 DDR configuration table 0x00873600 0x80 RAM table
0x00873680 0x80 Boot parameter table 0x00873700 0x4900 Clear text
packet scratch 0x00878000 0x7F80 Ethernet/SRIO
packet/message/descriptor memory Memory Map Summary (Sheet 7 of 7)
Logical 32-bit Address Physical 36-bit Address Bytes Description
Start End Start End 21000000 210001FF 1 00000000 1 000001FF 512 DDR3
EMIF configuration 21000200 213FFFFF 0 21000200 0
213FFFFF 4M-512 Reserved 21400000 214000FF 0 21400000 0 214000FF
256 HyperLink config 21400100 217FFFFF 0 21400100 0 217FFFFF
4M-256 Reserved 21800000 21807FFF 0 21800000 0 21807FFF 32K PCIe
config 21808000 33FFFFFF 0 21808000 0 33FFFFFF 296M-32K Reserved
34000000 341FFFFF 0 34000000 0 341FFFFF 2M Queue manager subsystem
data 34200000 3FFFFFFF 0 34200000 0 3FFFFFFF 190M Reserved
40000000 4FFFFFFF 0 40000000 0 4FFFFFFF 256M HyperLink data
50000000 5FFFFFFF 0 50000000 0 5FFFFFFF 256M Reserved
60000000 6FFFFFFF 0 60000000 0 6FFFFFFF 256M PCIe data
70000000 73FFFFFF 0 70000000 0 73FFFFFF 64M EMIF16 CE0 data space,
supports NAND, NOR or SRAM memory (1) 74000000 77FFFFFF 0 74000000 0
77FFFFFF 64M EMIF16 CE1 data space, supports NAND, NOR or SRAM
memory(1) 78000000 7BFFFFFF 0 78000000 0 7BFFFFFF 64M EMIF16 CE2 data
space, supports NAND, NOR or SRAM memory(1) 7C000000 7FFFFFFF 0
7C000000 0 7FFFFFFF 64M EMIF16 CE3 data space, supports NAND, NOR or
SRAM memory(1) 80000000 FFFFFFFF 8 00000000 8 7FFFFFFF 2G DDR3 EMIF
data (2) End of Table 2-2 1 32MB per chip select for 16-bit NOR and
SRAM. 16MB per chip select for 8-bit NOR and SRAM. The 32MB and 16MB
size restrictions do not apply to NAND. The memory map shows only the
default MPAX configuration of DDR3 memory space. For the extended DDR3
memory space access (up to 8GB), see the MPAX configuration details in
C66x CorePac User Guide and Multicore Shared Memory Controller (MSMC)
for KeyStone Devices User Guide in ‘‘Related Documentation from Texas
Instruments’’ on page 72.
最后
以上就是谦让翅膀为你收集整理的DSP,从入门到入土前言一、DSP架构二、内存管理三、 多核并行处理四、多核同步五、Cache的使用六、DMA的使用七、一些编程tips八、八核固化附录的全部内容,希望文章能够帮你解决DSP,从入门到入土前言一、DSP架构二、内存管理三、 多核并行处理四、多核同步五、Cache的使用六、DMA的使用七、一些编程tips八、八核固化附录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复