1 Cache的原理
Cache即高速缓存,它的出现基于两种因素:一、CPU的速度和性能提高很快,而主存速度较低且价格高;二、程序执行的局部性特点。将速度较快而容量有限的SRAM构成Cache,可以尽可能发挥CPU的高速度。CPU与外设交换数据时经常用到buffer(缓冲),这与缓存极其相似,只不过Cache是为了提高CPU和内存之间的数据交换速度而设计,而buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换速度而设计的。
Baidu快照(cache.baidu.com)就是一个缓存的例子,其作用与计算机CPU缓存有类似之处。 Cache的原理如图1所示。
在读取内存数据的同时CPU将数据保存到Cache数据区,同时更新Cache映射表(保存地址信息,表示该地址的数据是否已在Cache数据区,即是否命中)。这样,CPU再次读取该地址数据时,就可以直接从Cache提取。读Cache的时间远小于直接读内存,可提高CPU读取数据的效率。
Cache数据区有成块读取的特性(Cache映射表保存的地址是块地址,节省空间,也符合程序执行的局部性特点)。Cache数据区远远小于内存空间,就需要相应的替代算法。比如最近最少使用算法,可将新数据替代使用频率低的数据,同时更新映射表信息。可以推想,Cache空间越大,命中率越高。
写内存需要直接更新内存。如果映射表存在该地址信息,还需要同时更新Cache数据区。这种Cache访问方式就称作“直写”,Samsung公司的ARM7微处理器S3CA510B就是这种方式。以下所讨论的Cache问题除非特殊说明,否则都是“直写”方式。
2 嵌入式编程时需注意的问题
2.1 访问外设使用Cache的问题
在访问内存时使用Cache是不会出现问题的,但如果访问数据易变外设(数据不依赖于CPU写操作而改变)时使用Cache就可能出现问题。问题在于外设数据的改变不仅仅依靠CPU写操作,CPU第一次读取外设数据时将外设的数据和地址信息保存到Cache,第二次读取外设数据时就可能有问题出现。这是因为数据直接从Cache提取,而外设的数据可能有改变。
因此,在访问易变外设时要禁止使能Cache,直接读取外设数据到CPU,而不经过Cache的任何环节,即保证不改变Cache映射表和Cache数据区内容。
S3C4510B的SYSCFG SFR(特殊功能寄存器)有用来控制Cache使能或不使能的,通过对该SFR的设置可暂时禁止Cache或重新恢复Cache功能。这样就可以在读取外设前禁止Cache,读取结束后重新使能Cache,保证了外设数据读取的正确性。写数据到外设时采用“直写”方式,更没有问题。
2.2 开关Cache引发的新问题
在Cache开关期间,如果有另一个进程/任务访问内存,在此期间写内存并且该内存在Cache中已有映射(注意,它也是被禁止Cache的,所以它不会同时更新Cache数据区的内容),那么在Cache重新使能之后Cache数据区的信息已经过时了,而Cache映射表还是Cache禁止之前的状态,如果CPU此时读数据就会得到过时的数据。这样看来,引发的问题范围更广了,连内存的数据读写正确性都无法保证。与内存泄漏的影响来比较,内存泄漏如果是一颗定时炸弹,那么Cache问题就可以说是随时随地都可能踩上的雷区,因为程序一旦开始就可能引发爆炸。
如图2所示,Cache使能时Cache映射表和Cache数据区保存了内存的数据信息,这是CPU访问内存时通过图中实线箭头通路实现的。内存的信息可以与Cache的信息保持一致。
Cache禁止时的情况有所变化。由图2中虚线箭头通路直接进行内存访问,且地址0x00处的数据由55变为AA,但Cache区的信息仍为之前的状态。很明显,Cache的数据是应该废弃的,但是Cache映射表仍保存0x00的地址信息。Cache重新使能后,CPU再次读取0x00地址的数据,由于Cache仍是命中,直接从Cache数据区中提取数据,这样读出来的数据就是0x55了。
由S3C4510B数据手册第4节的第21页可知:通过对SYSCFG寄存器的CE位置1或清0可使能/关闭Cache,但是Cache没有内容自动刷新功能,在重新使能Cache时需考虑Cache数据的正确性。
为了证实以上说法,循环执行如下测试程序:
如果没有Cache的影响,结果应该是55 aa aa。可见,Cache关闭再打开的确可造成Cache数据过时。
3 其他CPU解决方案
Atmel公司的AT91RM9200和Samsung公司的S3C44B0,用这两种CPU先后移植过操作系统,且在对外设访问的整个过程中Cache都是使能的。它们的解决方案是什么呢?
AT91RM9200是ARM9系列带有MMU的CPU。MMU对内存有分页管理功能,可以实现多个进程的内存空间保护。Cache是通过MMU管理的,这也是Cache和MMU经常同时存在的原因。
S3C44B0和S3C4510B同样都是Samsung公司产品,并且都不带MMU。与S3CA510不同的是,S3C4480自带的SFR可以配置非缓存范围,即使Cache使能,所设置范围的地址空间访问也不通过Cache实现。这样,可以很方便地实现内存是缓存区,其他外设是非缓存区。
这两种方案对于S3C4510B都无法实现。网络上有人用volatile关键字解决外设访问问题。volatile关键字是在源代码中给编译器看的,它可能影响编译器的编译结果,但是最终CPU执行都体现到汇编语句,如果汇编语句都不能解决Cache问题,volatile语句也是不可能解决的。
对于易变数据的外设使用volatile关键字是应该的,可避免编译器的优化,比如以下语句:
在两次读取portAdd地址的数据相同时等待,可以用到等待信号跳变的程序。如果将volatile关键字去除,有可能经编译器优化,Value2不会从实际的portAdd地址读取数据,而是利用Valuel读取语句的中间寄存器直接获得。
4 本文解决方案
由S3C4510B手册上第5节的第4页可知,可以通过两种方式保证Cache数据的正确:
①对Cache映射表的Tag RAM数据清零。Cache映射表数据一般是通过上电复位清零的,如果Cache或内存段的设置被修改,则会造成Cache映射表数据废弃,这时就需要通过程序对Cache映射表数据清0。
②S3C4510B提供非Cache方式访问控制位,控制位ADDR[26](地址线26位)为“1”时,按非Cache方式访问。因此,Cache使能的情况下,地址0x000 0000~0x3FFFFFF按Cache方式访问,而0x400 0000~0x7FF FFFF按非Cache方式访问。实际上,0x000 0000+offset与0x400 0000+offset(offset在0x000 0000~0X3FF FFFF之间)是同一地址,不同的是Cache是否起作用。
可以得到两种解决方案:
(1)Cache映射表手动更新 既然在开关Cache之后内容过时,并且CPU不会自动刷新,可以通过手动更新的办法来抛弃废旧信息。也就是说,将Tag RAM区(前面所说的Cache映射表)清除,这样所有Cache数据区的内容都不使能,再次读取数据时同时更新Cache映射表和Cache数据区内容,之后才能使用。清除操作将Tag RAM的1 KB内容清零,需要消耗一定时间;并且这样操作后Cache是0命中率的,只有一定访问次数后Cache信息重新填满,才能恢复正常的命中率。因此,频繁地开关Cache时采用这种方案是不可取的。
(2)bit26位控制Cache使能
S3C4510B的地址线为26位(bit0~bit25),实际上CPU可访问空间为32位(bit0~bit31)。一般我们都不使用bit26~bit31,不过S3C4510B的这些位有着特殊的控制功能。通过bit26的高电平可以禁止该地址的Cache功能,因此将外设的地址由原来的ADDR_PORT改为(ADDR PORT∣(1<<26)),就可以实现外设访问时Cache不使能。这样就不用改为SYSCFG的Cache使能控制位。比较来看,SYSCFG的Cache使能位是控制整个CPU访问的Cache使能与否,而bit26只控制当前访问的一个具体地址的Cache使能与否。采用这种解决方案理论上有依据,并且可以最大程度发挥CPU的功能。
5 修改程序后的试验结果
修改Cache解决方案后,可以解决内存访问错误的问题。经过测试,采用“bit26位控制Cache使能”的方案可以顺利访问外设,代码执行始终是在Cache使能的情况下,并且不影响内存数据。若完全关闭Cache的程序,执行同样代码需要花费5~8倍的时间。
嵌入式编程需注意的Cache机制及其原理
- 嵌入式(286111)
- 编程(92184)
- CAC(8465)
相关推荐
0基础没编程经验能学嵌入式吗?
一直以来对于0基础学习嵌入式的同学都非常的敬佩,毕竟这需要付出比别人更多的努力,才能追平那些本专业有编程基础的同学。从我本人而言,见过0基础学习嵌入式的同学并不在少数。今天主要谈谈0基础学习嵌入式
2021-07-18 17:52:29
嵌入式C++编程的相关资料分享
特点展示如何使用 C ++ 来构建利用可用硬件资源的强大并发系统。从嵌入式编程入门和 C ++ 17 的最新特性开始,带您了解优秀编程的各个方面您将学习如何使用 C ++ 的并发性、内存管理和函数式
2021-11-09 08:26:24
嵌入式C程序基础与编程结构相关资料分享
嵌入式C程序基础与编程结构Basics of Embedded C Program and Programming Structure嵌入式C编程是处理器在我们日常生活中遇到的每一个嵌入式系统(如
2021-12-15 06:43:56
嵌入式C程序开发需注意什么
今天看到一篇很优质的博客,转发并推荐下:编写优质嵌入式C程序:http://blog.csdn.net/zhzht19861011/article/details/45508029
2021-12-15 08:00:19
嵌入式Linux多线程编程
嵌入式Linux多线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux 多线程编程第5 章 嵌入式Linux 多线程编程本章
2021-11-05 06:54:35
嵌入式Linux系统开发学习步骤,深圳嵌入式Linux培训高薪一路相伴
、哈希表、各种查找排序算法等应用及其C语言实现过程。 六:C++ 、QT C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非
2015-11-25 17:23:50
嵌入式linux学***汇总
服务器配置、shell编程、Linux C语言基础、Linux程序编译和调试维护等内容。 本书由冯利美主编。本书的完成需要感谢华清远见嵌入式学院,教材内容参考了学院与嵌入式企业需求无缝对接的、科学
2020-06-08 08:31:35
嵌入式处理器中Cache一致性问题怎么解决?
随着嵌入式计算机应用的发展,嵌入式CPU的主频不断提高,这就造成了慢速系统存储器不能匹配高速CPU处理能力的情况。为了解决这个问题,许多高性能的嵌入式处理器内部集成了高速缓存Cache。其中,三星公司的S3C44B0X内部就集成了8KB空间统一的指令和数据Cache。
2019-09-05 07:00:20
嵌入式学习步骤
管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序 8、嵌入式系统中多线程程序设计 线程的基础知识 多线程编程
2019-06-03 23:28:35
嵌入式实时操作系统如何简化应用软件的设计
在嵌入式领域中,嵌入式实时操作系统(RTOS)正得到越来越广泛的应用。采用嵌入式实时操作系统可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。内存资源作为嵌入式系统中极为重要的资源之一,其管理机制历来是嵌入式系统设计的重点和难点。
2020-11-25 06:48:44
嵌入式开发:你是如何理解嵌入式c编程的
一、新手常常问的一个问题是c语言和嵌入式c编程有什么区别?而嵌入式工程师一般都会告诉你其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和我们电脑不一样,所以编译器也是不一样的,生成的可执行
2017-06-28 10:14:58
嵌入式开发:你是如何理解嵌入式c编程的
本期的嵌入式开发学习将和大家讨论什么是嵌入式c编程,你是如何理解嵌入式c编程的。在上个篇章我们有简单介绍了什么是嵌入式系统的官方定义以及其发展的阶段?如对嵌入式开发感兴趣的童鞋不妨接着往下看。 一
2017-07-25 10:25:17
嵌入式的基本概念及其应用
文章目录系统移植概述及环境搭建嵌入式基本概念嵌入式系统的应用领域什么是嵌入式系统用嵌入式系统硬件组成部分通用嵌入式系统软件组成部分Linux 在嵌入式中应用的条件与前景嵌入式Linux内核结构
2021-10-27 07:59:07
嵌入式系统基础阶段的学习建议
嵌入式系统。前面说过,嵌入式系统是软件与硬件的综合体。因此,要逐步从MCU的最小系统开始,一点一点理解硬件原理及底层硬件驱动编程方法。要通过规范的例子,理解软件工程封装、可复用等思想。通过规范编程,积累
2020-10-29 07:36:20
嵌入式系统是什么意思
在我们的日常生活中,我们经常使用许多使用嵌入式系统技术设计的电气和电子电路和套件。计算机,手机,平板,笔记本电脑,数字电子系统以及其他电子和电子设备都是使用嵌入式系统设计的。什么是嵌入式系统?将硬件
2021-10-28 08:58:02
嵌入式系统的组成及其特点
嵌入式系统的组成嵌入式系统的特点嵌入式系统分层组成硬件软件嵌入式系统的发展单芯片为核心,可编程控制器阶段以嵌入式 CPU 为基础、简单操作系统为核心以嵌入式操作系统为标志以物联网为标志嵌入式系统
2021-10-27 09:30:15
嵌入式系统设计
在我们的日常生活中,我们经常使用许多使用嵌入式系统技术设计的电气和电子电路和套件。计算机,手机,平板,笔记本电脑,数字电子系统以及其他电子和电子设备都是使用嵌入式系统设计的。什么是嵌入式系统?将硬件
2021-10-27 06:50:19
嵌入式系统软件和编程语言
独立工作的器件。 嵌入式系统的软件部分包括操作系统软件(要求实时和多任务操作)和应用程序编程。操作系统控制着应用程序编程与硬件的交互作用,而应用程序控制着系统的运作和行为。
2019-07-17 07:34:06
嵌入式网络编程+嵌入式Linux系统
D2.25嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、Linux开发工具(gcc、gdb、make)三、Linux系统编程(文件、进程、线程、网路、数据库
2021-12-22 07:10:18
嵌入式软件编程中const、static、extern和volatile的原理是什么?怎么使用?
嵌入式软件编程中const、static、extern和volatile的原理是什么?怎么使用?
2021-04-28 06:21:42
[嵌入式linux] 嵌入式学习分享:那些绕不开的技术点
嵌入式绕不开各种接口比如:uart 、spi、i2c、u***、eth、mipi、edp、can、i2s、hdmi等等。需要了解各接口的使用场景、带宽、机制、时序、工作模式、缺点,时序等等。我相信硬件
2020-04-16 09:51:11
[公告]嵌入式Linux内核设计高级研修班
;nbsp; 其实不然,我们需要在很多方面进行内核开发1、在嵌入式领域,由于有数不清处理器架构,所以内核在某些架构上就没有得到完全支持。2、在工控领域,我们常常希望获得高精确时钟,而在绝大多数架构上
2009-07-24 13:04:45
【下载】《嵌入式C编程与Atmel.AVR》
`内容简介 欢迎进入嵌入式编程和微控制器应用的世界!使用日益流行且价格适宜的Atmel AVR嵌入式控制器作为学习平台。本书是目前可以获得的最佳书籍之一。对于初学者,本书将会是极好的选择。随着
2018-01-11 18:02:05
什么是嵌入式编程
《C嵌入式编程设计模式》第一章 什么是嵌入式编程嵌入式系统的基本知识面向对象编程与结构化编程使用C语言实现类、继承、状态机 第二章 嵌入式实时过程Harmony的嵌入式编程嵌入式应用开发中的敏捷过程
2021-11-08 06:15:53
什么是嵌入式系统?
在我们的日常生活中,我们经常使用许多使用嵌入式系统技术设计的电气和电子电路和套件。计算机,手机,平板,笔记本电脑,数字电子系统以及其他电子和电子设备都是使用嵌入式系统设计的。什么是嵌入式系统?将硬件
2021-12-22 06:11:56
你是如何理解嵌入式C编程
期的嵌入式开发学习将和大家讨论什么是嵌入式c编程,你是如何理解嵌入式c编程的。在上个篇章我们有简单介绍了什么是嵌入式系统的官方定义以及其发展的阶段?如对嵌入式开发感兴趣的童鞋不妨接着往下看。 一
2017-03-22 10:58:58
你是如何理解嵌入式C编程的
什么是嵌入式系统的官方定义以及其发展的阶段?如对嵌入式开发感兴趣的童鞋不妨接着往下看。 一、新手常常问的一个问题是c语言和嵌入式c编程有什么区别?而嵌入式工程师一般都会告诉你其区别在于嵌入式的C语言是跑在嵌入式
2017-03-07 21:15:35
你是如何理解嵌入式c编程的
嵌入式开发:你是如何理解嵌入式c编程的本期的嵌入式开发学习将和大家讨论什么是嵌入式c编程,你是如何理解嵌入式c编程的。在上个篇章我们有简单介绍了什么是嵌入式系统的官方定义以及其发展的阶段?如对
2017-05-05 15:11:30
你是如何理解嵌入式c编程的?
一、新手常常问的一个问题是c语言和嵌入式c编程有什么区别?而嵌入式工程师一般都会告诉你其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和我们电脑不一样,所以编译器也是不一样的,生成的可执行
2015-10-17 13:23:00
你是如何理解嵌入式c编程的?
一、新手常常问的一个问题是c语言和嵌入式c编程有什么区别?而嵌入式工程师一般都会告诉你其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和我们电脑不一样,所以编译器也是不一样的,生成的可执行
2015-10-22 19:24:31
使用Java平台怎么实现可编程嵌入式系统?
传统的嵌入式产品只能实现某种特定的功能,不能满足用户可变的丰富多彩的应用需求。为解决这个问题,本文设计并实现了一种使用Java作为软件平台的基于FPGA的可编程嵌入式系统,以实现系统对多种本地应用和网络的支持。
2020-03-25 06:30:05
关于嵌入式RTDBS的知识点总结的太棒了
嵌入式RTDBS内涵及其体系结构嵌入式RTDBS的数据模型嵌入式RTDBS的物理结构嵌入式RTDBS管理系统嵌入式RTDBS设计实例
2021-04-27 06:42:42
关于嵌入式系统高级编程语言的基本知识点都在这里
什么是嵌入式系统高级编程语言?嵌入式系统高级语言编程特点有哪些?常用嵌入式系统高级编程语言基本性能有哪些?Java的特点是什么?它与嵌入式系统有什么关系?
2021-04-27 07:06:58
到底什么是嵌入式?
、PCB设计在电子设计中,PCB是我们设计内容的物理载体,所有我们设计意图的最终实现就是通过PCB板来表现的。三、C语言C语言是嵌入式开发中最重要的编程语言,要对这门语言有深入的理解,毕竟不仅仅要会写程序,看懂
2021-09-19 14:17:58
在嵌入式开发中,你是如何理解嵌入式C编程的?
`本文来探讨嵌入式开发中的嵌入式C编程,看看跟您理解的一样吗?一、新手常常问的一个问题:C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上
2016-03-22 09:38:57
基于FPGA的带Cache的嵌入式CPU该怎么设计?
随着集成电路设计和工艺技术的发展,嵌入式系统已经在PDA、机顶盒、手机等信息终端中被广泛应用。嵌入式系统具有电路尺寸小、成本低廉、可靠性高、功耗低等优点,是未来集成电路发展的方向。而作为嵌入式系统
2019-10-12 09:31:50
如何学习嵌入式?
籍:《UNIX环境高级编程》(第2版) (4) 了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开发中,一般很少去写汇编,但是起码的要求是能够看懂arm汇编。 (5) 系统移植的时候,就需要你从下
2020-06-09 04:35:36
如何理解嵌入式c编程的?
一、新手常常问的一个问题是c语言和嵌入式c编程有什么区别?而嵌入式工程师一般都会告诉你其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和我们电脑不一样,所以编译器也是不一样的,生成的可执行
2017-06-13 10:11:45
如何设计带Cache的嵌入式CPU?
随着集成电路设计和工艺技术的发展,嵌入式系统已经在PDA、机顶盒、手机等信息终端中被广泛应用。嵌入式系统具有电路尺寸小、成本低廉、可靠性高、功耗低等优点,是未来集成电路发展的方向。而作为嵌入式系统
2019-11-05 07:26:21
工业嵌入式计算平台开发招聘
经验2、熟悉ARM等微处理器架构,掌握嵌入式操作系统的移植、裁剪、驱动开发和应用开发3、精通C/C++编程,熟悉Linux内核架构和驱动开发。4、具有基于ARM ***可信应用开发经验,熟悉ARMv8
2021-10-12 09:32:52
怎样开始学习嵌入式?
嵌入式Linux系统开发学习路线致想学习嵌入式和正在学习嵌入式的宝宝们一:嵌入式c语言C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括
2017-08-14 15:36:15
求大神分享一种基于bootloader的嵌入式软件自动更新机制
本文提出了一种具有较高稳定性和安全性、基于bootloader的嵌入式软件自动更新机制。该更新机制同时保存了3个文件,需要较多的Flash存储空间,但同时降低了维护成本。
2021-04-27 06:33:59
求大神推荐嵌入式Linux开发板
还是学生,之前一直和老师做一些模拟电路和单片机的项目,熟悉51和stm32的编程,现在想做一下嵌入式系统方向,本人比较看好嵌入式驱动工程师,想问一下前辈需要注意一下什么,以及比较适合的开发板
2015-09-21 20:11:52
解析嵌入式软件开发语言:嵌入式C编程
在我们初学嵌入式开发的时候,总会出现一个问题。那就是C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是
2017-10-18 10:09:19
请问如何成为嵌入式高手?
插槽机制4、 QT图形界面编程技术5、QT应用程序与Linux驱动的衔接6、 QT在实际项目中具体应用第十部分:无线通讯应用1、无线wifi模块应用2、3G模块应用第十一分布:嵌入式系统应用程序
2020-08-30 11:28:25
嵌入式CPU指令Cache的设计与实现
针对嵌入式CPU 指令处理速度与存储器指令存取速度不匹配问题,本文基于FPGA 设计并实现了可以有效解决这一问题的指令Cache。根据嵌入式五级流水线CPU 特性,所设计指令Cache 的地
2009-08-05 14:27:5436
详谈嵌入式编程需注意的Cache机制和原理
1 Cache的原理 Cache即高速缓存,它的出现基于两种因素:一、CPU的速度和性能提高很快,而主存速度较低且价格高;二、程序执行的局部性特点。将速度较快而容量有限的SRAM构成Cache,可以
2017-11-01 16:16:200
评论
查看更多