关于DMA,TCM(ITCM和DTCM)和Cache的理解!

本文深入探讨了DMA(Direct Memory Access)和TCM(Tightly Coupled Memory)的概念及其工作原理。DMA是一种高效的硬件数据传输机制,能显著提高数据传输速度,尤其是在数据量巨大的情况下。TCM则是一种高速缓存,直接集成于CPU芯片中,分为ITCM和DTCM,用于指令和数据的快速存取,有效提升运行速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA


DMA=Direct Memory Access。这是一种通过硬件实现的数据传输机制。简单的说,就是不在CPU的参与下完成数据的传输。
DMA是一种硬件设备。这种设备的工作原理是这样的:
——首先CPU告诉DMA设备,要有一堆数据需要传输,为了效率而请它出马。(DMA请求)
——DMA收到CPU的消息,开始准备。此时CPU把数据源地址、数据目标地址、传输数据量、传输模式等等参数告诉它。(DMA初始化)
——DMA初始化完,向CPU发送消息“借你的总线用一用,我要开始传输数据了!”(总线出借,DMA启动)
——CPU收到消息后,暂时切断自己与总线的联系。DMA开始传输数据。(DMA数据)
——DMA传输完数据之后,向CPU发送消息“搞定了!总线还给你。”(总线归还)
——CPU说:“干得好!老将出马一个顶俩!辛苦了,你先歇着吧。”DMA设备停止。CPU该干啥干啥。
由于是硬件实现的,所以DMA的速度非常快。快到什么程度呢?在DS上,尤其是数据量非常大的时候,相比于CPU当中介,效率能够提高一百万倍以上。
由于DMA的速度是如此之快,所以大量的数据传输,一般都要求使用DMA。

 

TCM


TCM=Tightly Coupled Memory,是一种高速缓存,据说是被直接集成在CPU芯片中。DS有两种TCM,分别是ITCM(Instruction TCM)和DTCM(Data TCM)。

注意:

1.内存支持列表中,内存详细参数里,SS指的是单面内存,DS指的是双面内存。内存一共有两面,根据内存总容量和内存芯片的存储容量,内存厂家会生产双面内存和单面内存,也就是内存的两面都有存储芯片,或者只有一面有存储芯片。单双面内存在兼容性上有一定区别,所以会单独列出来。

2。ITCM是cortex内核中指令传输总线,DTCM是cortex内核中数据传输总线
是cpu内核同flash及sram之间传输指令和数据的通道,指令的取指和执行及数据的读写在性能及管理上存在差异性,因而需要予以区分。

由于是高速缓存,所以这两块内存区域被当做特殊的用途。比如某些对时间要求非常严格的代码,就可以被放到ITCM中执行。这可以有效地提高运行速度。某些需要频繁存取的数据,也可以放到DTCM中以节省存取时间。
怎么样把代码放到ITCM中?有两种方法。一种是使用gcc特有的“属性标签”,将指定代码赋予“ITCM”属性,此时该代码会被载入ITCM中执行。还有一种方法是直接将.c源文件改成.itcm.c,此时源文件会被直接编译成在ITCM中运行的目标文件。
而DTCM就方便得多了。虽然两个TCM都是可映射的,也就是说,它们的地址并非固定,但是一般会将其分别映射到固定地址。既然已经有了固定地址,那么就可以很轻松地访问了。不过,正如刚才所说的,这两块内存空间都是有特殊用途的,所以不建议直接访问。相比于ITCM来说,DTCM更加重要。因为在这块内存中,存在着一个非常重要的对象——栈。局部变量和函数调用的参数,就是靠栈进行传递的。由于DMA无法访问TCM,所以也就无法访问栈。又由于局部变量是被开辟到栈中,所以DMA也无法对局部变量进行传递。


Cache

众所周知CPU的速度非常快。当CPU访问外设的时候,有些外设速度比较慢,响应CPU比较迟钝。此时CPU要么等外设响应,要么继续干它的活等外设的中断信号。但是有些外设是没有中断的。此时CPU就必须等了。最典型的例子就是内存。当CPU访问内存的时候,并非像你想象的那样,CPU立刻就能访问到它想访问的内存空间,而是有一个“WaitState”的过程。想想看吧,每访问一次内存都要等上几个机器周期,这可不是个好事~~~尤其是,这个“几”可不是简单的一位数,有些时候甚至能达到3位数。
那么这个问题又该怎么解决呢?那就是Cache了。
Cache是集成在CPU内部的极高速的缓存。注意关键词“极高速”。一般来说,它的访问速度几乎可以媲美CPU。这就意味着,CPU在访问Cache的时候几乎不会浪费多少时间。不过,速度的提升是用容量作为代价的。Cache的容量很小。

那么,我们把常用的数据放到Cache中,CPU在访问的时候直接访问Cache就行了,不用耗费时间去访问内存了。
事实上CPU就是这么做的。在读内存的时候,CPU首先读Cache,看看有没有它想要的数据的“副本”,有的话那就太好了,直接拿过去用。没有的话就只好费点功夫去读内存了。而在写内存的时候,CPU直接写到Cache中,而非直接写到内存中。Cache写满了之后,此时才将Cache中的数据更新到内存,同时清空Cache。就像寄信一样,所有的信件会首先攒到邮局,到达一定数量之后才会送出去。
不过这又出现一个问题:假如Cache中有某个内存数据的“副本”,那么CPU在读该内存的时候就会直接使用该副本而不用去读内存。那万一内存中的数据被改写,此时CPU再读该内存,读出来的岂不是那个旧的副本而不是最新的内存数据?同样,假如我想DMA一些数据,谁能保证此时内存中的数据就是最新的数据?很可惜,Cache是完全的黑箱。你不知道它的地址。你也无法直接访问它,但一般系统会提供函数进行cache回写和clear操作,比如

//将整个Data Cache更新到内存

void DC_FlushAll()

// 清空整个Data Cache
void DC_InvalidateAll()
那么,什么时候使用这些函数呢?
在DMA之前,我需要保证数据源内存中的数据是最新的。所以此时需要Flush,从而使DC中的副本能够更新到内存中。
在DMA之后,我需要保证DC中的副本和内存中的数据是相同的。但是NDSLIB没有更新DC的函数,所以没办法,我们只能把DC中的副本杀掉。此时如果CPU访问内存,由于DC中没有副本,所以就只能直接从内存访问并将访问到的值作为DC中副本了。所以此时需要Invalidate

<think>嗯,我需要解释一下SOC中的DTCMITCM,它们统称为TCM。首先,SOC是系统级芯片,对吧?TCM可能指的是紧密耦合存储器,但具体DTCMITCM是什么,我得仔细想想。 TCM的全称应该是Tightly Coupled Memory,也就是紧密耦合存储器。这种存储器直接连接到处理器核心,访问速度比普通的缓存更快,延迟更低。通常用于需要实时性高的任务,确保关键代码或数据能快速访问,不会受到缓存未命中或总线争用的影响。 然后,DTCMITCM可能分别是数据TCM指令TCMITCM可能用来存储需要快速执行的指令,比如中断处理程序或实时任务代码。而DTCM则用于存储数据,比如实时处理中的数据变量或堆栈,确保数据访问的确定性。 不过,我需要确认一下两者的具体区别。ITCM负责指令,DTCM负责数据。这样分开可以并行访问指令数据,提高效率。在SOC设计中,这种分离可能有助于优化性能,尤其是在实时系统中,延迟确定性非常重要。 另外,TCM普通缓存的区别可能在于缓存是自动管理的,而TCM需要程序员或编译器显式分配内容。这样可以避免缓存的不确定性,但需要手动管理,增加了复杂性。 总结一下,TCM包括ITCMDTCM,分别处理指令数据,提供低延迟、高确定性的访问,适用于实时性能关键的应用。可能还要提到它们的应用场景,比如汽车电子、工业控制或通信设备中的实时处理任务。</think>TCM(Tightly Coupled Memory,紧密耦合存储器)是SoC(系统级芯片)中一种高性能、低延迟的存储器,直接与处理器核心相连。它分为**ITCM(Instruction TCM)****DTCM(Data TCM)**,统称为TCM。以下分步说明其核心特点作用: --- ### **1. ITCM(指令TCM)** - **功能** 用于存储**需要快速执行的指令**(如中断处理程序、实时任务代码)。 - **特点** - **低延迟**:指令直接由CPU访问,无需经过缓存层级。 - **确定性**:访问时间固定,避免缓存未命中导致的延迟波动。 - **静态分配**:内容需手动分配(如通过链接脚本),确保关键代码驻留其中。 --- ### **2. DTCM(数据TCM)** - **功能** 用于存储**需要快速访问的数据**(如实时计算变量、堆栈、DMA缓冲区)。 - **特点** - **并行访问**:与ITCM独立,可同时读写指令数据。 - **高带宽**:支持低延迟数据操作,适用于信号处理等场景。 - **确定性**:数据访问时间可预测,适合实时系统。 --- ### **3. TCM与缓存的区别** | **特性** | **TCM** | **缓存** | |----------------|-----------------------------|------------------------------| | **管理方式** | 手动分配(显式控制) | 自动管理(硬件替换策略) | | **确定性** | 访问时间固定 | 受缓存命中率影响 | | **用途** | 关键代码/数据 | 通用代码/数据加速 | | **延迟** | 更低(直接连接CPU) | 较高(需经过缓存层级) | --- ### **4. TCM的典型应用场景** - **实时系统**:汽车电子(如ECU)、工业控制(如PLC)需严格时序保障。 - **高性能计算**:信号处理(FFT)、通信协议栈(5G基带)的低延迟需求。 - **安全关键领域**:存储加密算法或安全启动代码,避免总线干扰。 --- ### **5. 配置示例(伪代码)** ```c // 通过链接脚本分配代码到ITCM __attribute__((section(".itcm_section"))) void critical_isr() { /* ... */ } // 分配数据到DTCM __attribute__((section(".dtcm_section"))) uint32_t realtime_buffer[1024]; ``` --- ### **总结** TCM通过分离指令(ITCM数据(DTCM),为SoC提供了**确定性低延迟**的存储方案,尤其适合实时性要求高的场景。但其需手动管理,设计时需权衡性能与复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值