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。

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

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也无法对局部变量进行传递。

STM32中DMA、TCM(ITCM和DTCM)、CaChe的区别相关推荐

  1. stm32中实现printf打印

    起因 最近在调试stm32片子,在调试的时候发现,原来的项目代码中没有实现printf函数,一直使用较为原始的打印方式:将需要打印的内容存在数组中(下称资源池),通知DMA进行搬运,最终通过usart ...

  2. STM32:关于DMA,TCM(ITCM和DTCM)和Cache的理解

    关于DMA,TCM(ITCM和DTCM)和Cache的理解! DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. D ...

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

    关于DMA,TCM(ITCM和DTCM)和Cache DMA DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. D ...

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

    关于DMA,TCM(ITCM和DTCM)和Cache 一.DMA DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. ...

  5. 关于DMA,TCM(ITCM和DTCM)和Cache

    DMA DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. DMA是一种硬件设备.这种设备的工作原理是这样的: -- ...

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

    关于DMA,TCM(ITCM和DTCM)和Cache DMA DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. D ...

  7. CPU内核部件之:MMU、MPU、ITCM、DTCM、CCM、Cache

    最近了解到了很多关于CPU内核架构中的组件的相关知识,感觉受益颇丰,在这里总结分享下: 1.MMU:Memory Management Unit,即内存管理单元,主要工作就是进行虚拟内存地址和物理内存 ...

  8. 7.STM32中对DMA_Config()函数的理解(自定义)测试DMA传输数据时CPU还可继续工作其他的事

    STM32中对DMA_Config()函数的理解(自定义):

  9. 什么是ITCM和DTCM?

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

最新文章

  1. R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值、并可视化多个标记物在相同时间下的ROC值、多指标的ROC曲线
  2. android监控来电显示
  3. 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
  4. 设计模式之Composite
  5. Java操作Kafka创建Topic、Producer、Consumer
  6. Lombok的@Data生成的hashCode和equals方法坑
  7. js 解除网页右键菜单被禁用
  8. fedora linux命令,Fedora Linux的一些常用设置和常用命令
  9. wimbuilder2教程_Wimbuilder WIN10XPE制作所需的工程文件
  10. java环形队列_数组实现环形队列Java
  11. 拓端tecdat|R语言计量经济学与有时间序列模式的机器学习预测
  12. 华维实战小项目:教你如何用51单片机驱动步进电机
  13. Win7Office2010Flash控件无法使用“此演示文稿中一些控件无法激活,可能这些控件未在此计算机中注册“
  14. 【洛谷】P1878 舞蹈课
  15. 使用keras实现YOLO v3报错‘str‘ object has no attribute ‘decode‘
  16. DataCastle租金预测数据竞赛个人总结
  17. 【论文解读】文本分类上分利器:Bert微调trick大全
  18. macOS上的符号链接Symlink是什么,以及该怎么使用
  19. RandomAccess接口的使用
  20. vmware mac安装教程 | 不能全屏的终极原因

热门文章

  1. Eigen学习3:矩阵及向量运算
  2. 简单元胞自动机实现—Python
  3. 如何对图像进行卷积操作
  4. Unity3D中文视频教程【超清+精选】
  5. Java 超全面试题
  6. 学海灯塔课后题答案模块上线
  7. elementui实现上传视频功能+预览
  8. ev3和python哪个好_python+lego ev3的心得总结 随时更新
  9. CentOS7 安装php7.4
  10. SpringBoot-集成Shiro