存储器映射

合集下载

英飞凌tricore用户手册 第8章 存储映射

英飞凌tricore用户手册 第8章 存储映射

PCP存储器(表 8-5)。
• 移动段15内的SCU地址映射,因为SCU现需求2×256字节。
• 移动段15内的ADC和FADC地址映射,因为那些模块现需要要更多的256字节片段。
• 调整了存储器和flash大小(SPRAM, LDRAM, CRAM, PRAM, PFlash, DFlash)。
• 增加了指令/数据Cache配置说明。
保留
8FE7 0000H - 32 Kbyte 在线数据获取
8FE7 7FFFH
(OLDA)
8FE7 8000H - 32 Kbyte 保留 8FE7 FFFFH
访问类型

写1)
MPN 强制中 MPN 强制

中断
SPBBE SPBBE
访问
访问1)
LMBBE & SPBBE
LMBBE & SPBBE
LMBBE & SPBBE
TC1728
存储映射
8
存储映射
本章将概述TC1728的存储映射,并从两种不同片上总线的角度描述各单元、存储器和 保留区域的地址分配和访问权限。
TC1728中包含以下存储器单元
• 程序存储器单元(PMU)包含: – 1.5Mbyte 程序Flash 存储器(PFLASH) – 64 KB 数据Flash 存储器(DFLASH) – 16 KB Boot ROM(BROM) – 8KB 重叠存储器 (OVRAM1))
1)DMA 包括: DMA 移动引擎 以及类似于MLI模块的连接到DMA外设接口
用户手册
8-3
存储映射, V1.91
V1.0, 2011-12
TC1728
表8-2 到表8-4 中地址映射所使用的缩写和术语定义见表8-1。

ARM处理器系统初始化过程

ARM处理器系统初始化过程

ARM处理器系统初始化过程在嵌入式系统中,ARM处理器是最常用的处理器之一。

ARM处理器的系统初始化过程可以分为硬件初始化和软件初始化两个阶段。

本文将介绍ARM处理器系统初始化的具体流程。

硬件初始化在系统上电后,ARM处理器进入硬件初始化阶段。

主要任务是对处理器的外设进行初始化。

1.初始化时钟系统:ARM处理器的时钟系统是处理器运行的根底,因此在初始化过程中需要设置适当的时钟频率和时钟源。

这可以通过配置PLL〔Phase Locked Loop〕或者外部晶振来实现。

2.使能缓存:缓存是提高处理器性能的关键。

在初始化过程中,需要配置L1缓存和L2缓存的大小、映射方式等参数,并使能它们。

3.配置中断控制器:中断是处理器与外设交互的一种方式。

在初始化过程中,需要配置中断控制器,使其能够正确地响应外设发出的中断请求。

4.初始化外设:根据系统的需求,初始化各个外设,包括串口、SPI、I2C等外设。

这些外设的初始化过程涉及到设备的存放器配置、中断使能等操作。

5.设置存储器映射:ARM处理器通过存储器映射来访问外部存储器。

在初始化过程中,需要设置存储器映射表,使处理器能够正确地访问外部存储器。

软件初始化在硬件初始化完成后,ARM处理器进入软件初始化阶段。

主要任务是加载和运行操作系统及应用程序。

1.复位处理器:在软件初始化过程中,可以选择复位处理器,将处理器重新置于初始状态。

这通常通过将Reset引脚拉低来实现。

2.加载引导程序:引导程序是系统启动的第一段代码,其功能是加载操作系统的核心代码。

在软件初始化过程中,需要将引导程序加载到适当的内存位置,并设置处理器的执行起点。

3.初始化操作系统:一旦引导程序加载完成,操作系统开始初始化。

这包括初始化内核数据结构、初始化设备驱动程序、启动任务调度器等。

4.加载应用程序:在操作系统初始化完成后,可以选择加载应用程序。

应用程序的加载可以通过文件系统来实现,将应用程序从存储设备读取并加载到内存中。

HT16K33A RAM映射LED驱动器说明书

HT16K33A RAM映射LED驱动器说明书

Rev. 1.0012022-05-12HT16K33ARAM 映射16×8 带 按键扫描的LED驱动器特性•工作电压:4.5V~5.5V •内部RC 振荡器 •I 2C 总线接口•16×8位RAM 用于存储显示数据•最大显示模式为16×8:16SEGs 和8COMs •读/写地址自动递增•多达13×3按键矩阵扫描功能 •16阶调光电路•封装类型:20/24/28-pin SOP/SSOP应用领域•工业控制指示器•数字时钟、温度计、计数器、万用表 •机顶盒•录像机设备 •仪表读数•其它消费类应用 •LED 显示概述HT16K33A 是一款存储器映射和多功能LED 控制驱动芯片。

该芯片支持最大128点的显示模式(16SEGs ×8COMs)以及最大13×3的按键矩阵扫描电路。

HT16K33A 的软件配置特性使其适用于多种LED 应用,包括LED 模块和显示子系统。

HT16K33A 通过双向I 2C 接口可与大多数微控制器进行通信。

方框图VDDVSSSDASCLRev. 1.0022022-05-122019181716151413121112345678910VDD SDA SCL ROW0/K1ROW1/K2ROW2/K3ROW3/K4ROW4/K5ROW5/K6ROW6/K7VSS COM0/AD COM1/KS0COM2/KS1COM3/KS2COM4COM5COM6COM7ROW7/K8/INTHT16K33A 20 SOP-A/SSOP-A VDD SDA SCL ROW0/A1ROW1/A0ROW2/K1ROW3/K2ROW4/K3ROW5/K4ROW6/K5ROW7/K6ROW8/K7VSS COM0/AD COM1/KS0COM2/KS1COM3/KS2COM4COM5COM6COM7ROW11/K10/INTROW10/K9ROW9/K8HT16K33A 24 SOP-A/SSOP-A 242322212019181716151413123456789101112VDD SDA SCL ROW0/A2ROW1/A1ROW2/A0ROW3/K1ROW4/K2ROW5/K3ROW6/K4ROW7/K5ROW8/K6ROW9/K7ROW10/K8VSS COM0/AD COM1/KS0COM2/KS1COM3/KS2COM4COM5COM6COM7ROW15/K13/INTROW14/K12ROW13/K11ROW12/K10ROW11/K9HT16K33A 28 SOP-A/SSOP-A28272625242322212019181716151234567891011121314Rev. 1.0032022-05-12内部连接简图极限参数电源供应电压 ..............V SS-0.3V ~ V SS+6.5V 端口输入电压 .............V SS-0.3V ~ V DD+0.3V 工作温度 ................................. -40℃~ 85℃储存温度 ................................-60°C ~ 150°C注:这里只强调额定功率,超过极限参数所规定的范围将对芯片造成损害,无法预期芯片在上述标示范围外的工作状态,而且若长期在标示范围外的条件下工作,可能影响芯片的可靠性。

C++中使用内存映射文件处理大文件

C++中使用内存映射文件处理大文件

C++中使⽤内存映射⽂件处理⼤⽂件引⾔ ⽂件操作是应⽤程序最为基本的功能之⼀,Win32 API和MFC均提供有⽀持⽂件处理的函数和类,常⽤的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。

⼀般来说,以上这些函数可以满⾜⼤多数场合的要求,但是对于某些特殊应⽤领域所需要的动辄⼏⼗GB、⼏百GB、乃⾄⼏TB的海量存储,再以通常的⽂件处理⽅法进⾏处理显然是⾏不通的。

⽬前,对于上述这种⼤⽂件的操作⼀般是以内存映射⽂件的⽅式来加以处理的,本⽂下⾯将针对这种Windows核⼼编程技术展开讨论。

内存映射⽂件 内存映射⽂件与虚拟内存有些类似,通过内存映射⽂件可以保留⼀个地址空间的区域,同时将物理存储器提交给此区域,只是内存⽂件映射的物理存储器来⾃⼀个已经存在于磁盘上的⽂件,⽽⾮系统的页⽂件,⽽且在对该⽂件进⾏操作之前必须⾸先对⽂件进⾏映射,就如同将整个⽂件从磁盘加载到内存。

由此可以看出,使⽤内存映射⽂件处理存储于磁盘上的⽂件时,将不必再对⽂件执⾏I/O操作,这意味着在对⽂件进⾏处理时将不必再为⽂件申请并分配缓存,所有的⽂件缓存操作均由系统直接管理,由于取消了将⽂件数据加载到内存、数据从内存到⽂件的回写以及释放内存块等步骤,使得内存映射⽂件在处理⼤数据量的⽂件时能起到相当重要的作⽤。

另外,实际⼯程中的系统往往需要在多个进程之间共享数据,如果数据量⼩,处理⽅法是灵活多变的,如果共享数据容量巨⼤,那么就需要借助于内存映射⽂件来进⾏。

实际上,内存映射⽂件正是解决本地多个进程间数据共享的最有效⽅法。

内存映射⽂件并不是简单的⽂件I/O操作,实际⽤到了Windows的核⼼编程技术--内存管理。

所以,如果想对内存映射⽂件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识⾮常复杂,超出了本⽂的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。

底层逻辑第五章读书心得

底层逻辑第五章读书心得

底层逻辑第五章读书心得底层逻辑是计算机科学中一个重要的概念,它涉及到计算机硬件和软件的基本构成和运行机制。

在计算机科学的学习中,深入理解底层逻辑对于我们能够更好地理解计算机的工作原理和进行编程开发都具有重要意义。

最近我读了底层逻辑的第五章,下面我将分享一下我的心得体会。

第五章主要讲述了底层逻辑中的存储器和存储器层次结构。

存储器是计算机中用于存储数据和指令的设备,它直接影响到计算机的性能和运行速度。

在这一章中,我了解到了存储器的层次结构以及不同层次的存储器的特点和作用。

文章介绍了存储器的层次结构,包括寄存器、高速缓存、主存储器和辅助存储器。

寄存器是存储器层次结构中最快的存储器,用于存储计算机中最常用的数据和指令。

高速缓存是位于寄存器和主存储器之间的存储器,它可以加快数据的访问速度,提高计算机的运行效率。

主存储器是计算机中最大的存储器,用于存储当前正在运行的程序和数据。

辅助存储器是存储容量最大的存储器,用于长期存储数据和程序。

文章介绍了存储器的特点和作用。

不同层次的存储器具有不同的速度、容量和成本。

寄存器的速度最快,容量最小,成本最高,主要用于存储处理器的指令和数据。

高速缓存的速度次之,容量较小,成本较高,主要用于存储最常用的数据块。

主存储器的速度较慢,容量较大,成本适中,主要用于存储当前运行的程序和数据。

辅助存储器的速度最慢,容量最大,成本最低,主要用于长期存储数据和程序。

读完这一章后,我对存储器的层次结构有了更深入的理解。

不同层次的存储器在计算机的运行中扮演着不同的角色,相互协作,共同完成计算机的工作。

理解存储器的层次结构有助于我们合理地利用存储器,提高计算机的性能。

我还学习到了存储器的访问方式和存储器的映射方式。

存储器的访问方式有顺序访问和随机访问两种。

顺序访问是按照存储地址的顺序依次读取数据,而随机访问是通过地址直接访问指定的数据。

存储器的映射方式有直接映射、全相联映射和组相联映射三种。

直接映射是将主存储器的地址划分为若干个块,每个块对应一个高速缓存的行。

TMS320C55X存储空间结构

TMS320C55X存储空间结构

C55X DSP 的存储空间包括统一的数据/程序空间和I/O空间。

数据空间用于访问存储器和内存映射寄存器,程序空间用于CPU从存储器中读取指令,而I/O空间用于CPU与外设之间的双向通信。

1.存储器映射如下图所示,C55X的寻址空间为16MB,当CPU从程序空间读取程序代码时,使用24位地址,当访问数据空间时,使用23位的地址。

但是在访问数据空间时,将23位地址左移一位,并将地址总线上的最低有效位(LSB)置0,使得在对数据空间或程序空间寻址时,地址总线都传送24位地址。

数据空间被分成128个主数据页(第0页到第127页),每个数据页的大小为64K字,指令通过7位的主数据页值和16位的偏移值共同来确定数据空间的任何一个地址。

在第0主数据页中,前96个地址(00 0000h ~ 00 005Fh)为存储映射寄存器(MMR)保留,相对应在程序空间有192个地址(00 0000h ~ 00 00BFh),这段存储区为系统保留,用户不能使用该区。

2.程序空间当CPU读取指令时,程序空间才被访问。

CPU采用字节寻址来读取变长的指令,指令的读取吆喝32位的偶地址对其(地址的低2位为0)。

1). 字节寻址(24位)当CPU从程序空间读取指令时,采用字节寻址,即按字节分配地址,且地址为24位。

一个行宽为32位存储器的地址分配由下图说明,每个字节分配一个地址,例如字节0的地址是00 0100h,字节2的地址是00 0102h。

2). 程序空间的指令结构DSP支持8位、16位、24位、32位和48位长度的指令。

下表和下图说明了指令在程序空间如何存放。

在32位宽的存储器中存放了5条指令,每一条指令的地址是只最高有效字节的地址,阴影部分表示没有代码。

3)程序空间的边界对齐在程序空间存放指令时不需要边界对齐,当读取指令时要和32位的偶地址对齐。

也就是说,在读取一条指令时,CPU要从最低两位是0的地址读取32位的代码,这样地址其最低位应是0h,4h,8h和Ch。

F2812存储器映射及CMD详解

F2812存储器映射及CMD详解

2812存储器映射及CMD2812存储器映射2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M的数据空间和4M的程序空间。

32位的数据地址,就是能访问2的32次,是4G,而22位的程序地址,就是能访问2的22次,是4M。

其实,2812可寻址的数据空间最大是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分配采用的是分页机制,分页机制采用的是形如0 xXXXXXXX的线性地址,所以数据空间能寻址的只有4M。

2812的存储器被划分成了下面的几个部分:1. 程序空间和数据空间。

2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。

2. 保留区。

数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。

3.CPU中断向量。

在程序空间里也保留了64个地址作为CPU的32个中断向量。

通过CPU寄存器ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。

映射和空间的统一编址F2 812内部的映射空间低地址空间高地址空间2812CMD详解CMD:command命令,顾名思义就是命令文件指定存储区域的分配.2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。

1.)#pragma ,CODE_SECTION和DATA_SECTION伪指令#pragma DATA_SECTION(funcA,"dataA"); ------ 函数外声明将funcA数据块定位于用户自定义的段"dataA"中 ------ 需要在CMD中指定dataA段的物理地址2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。

MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。

Cache地址映射1

Cache地址映射1

6
2.3 Cache 基本原理
Cache与主存的数据交换以块Block/行Line为单位, Cache与主存的数据交换以块Block/行Line为单位, 与主存的数据交换以块Block/ 为单位 一个块由若干字组成。 一个块由若干字组成。块长一般取若干个主存周期所能 调出的信息长度。 调出的信息长度。 CPU访问主存时,将访存地址与Cache中的地址检索 CPU访问主存时,将访存地址与Cache中的地址检索 访问主存时 Cache 项内容/标记/标签/Tag比较,有相同项表示“命中” /Tag比较 项内容/标记/标签/Tag比较,有相同项表示“命中”, 直接从Cache中获得访问数据。 Cache中获得访问数据 直接从Cache中获得访问数据。 无相同项表示“脱靶” 插入访存周期, 无相同项表示“脱靶”,插入访存周期,从主存读 出所需数据, 出所需数据,并将含有该数据的整个数据块从主存读出 行填充。 Cache,称为行填充 送Cache,称为行填充。
7
2.4 Cache 的命中率
要提高主存访问速度, 要提高主存访问速度,应使主存平均读出时间尽可 能接近Cache读出时间,即应使Cache命中率接近于1 Cache读出时间 Cache命中率接近于 能接近Cache读出时间,即应使Cache命中率接近于1。 在一段程序执行期间, 表示命中时存取Cache Cache的 在一段程序执行期间,设Nc表示命中时存取Cache的 总次数, 表示不命中时存取主存的总次数, 定义为命 总次数,Nm表示不命中时存取主存的总次数,h定义为命 中率,则有: 中率,则有:
5
Cache存储器的理论依据 2.2 Cache存储器的理论依据
程序访问的局部性原理: 程序访问的局部性原理: 局部性原理 在一个较短的时间间隔内,CPU对局部范围的存储器地 在一个较短的时间间隔内,CPU对局部范围的存储器地 址频繁访问,而对此地址范围之外的地址访问很少, 址频繁访问 , 而对此地址范围之外的地址访问很少 , 这种现象称程序访问的局部性。 这种现象称程序访问的局部性。 设置Cache就是为了将主存的局部性数据块提前调度到 设置Cache就是为了将主存的局部性数据块提前调度到 Cache Cache中 在较大的概率/命中率保证下, CPU直接访 Cache中,在较大的概率/命中率保证下,被CPU直接访 而节省了访问主存的时间。 问,而节省了访问主存的时间。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

请注意:当使用位带功能时,要访问的变量必须用volatile来定义。因为C编译器 并不知道同一个比特可以有两个地址。所以就要通过volatile,使得编译器每次都 如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操 作数据的复本,直到最后才把复本写回——这会导致按不同的方式访问同一个位 会得到不一致的结果(可能被优化到不同的寄存器来保存中间结果)
位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的“互锁” 访问。多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子 操作”。以前的读-改-写需要3条指令,导致这中间留有两个能被中断的空当。 于是可能会出现如下图所示的紊乱危象:
//把该地址转换成一个指针 #define MEM_ADDR(addr)
*((volatile unsigned long *) (addr))
在此基础上,我们就可以如下改写代码: MEM_ADDR(DEVICE_REG0) = 0xAB; //使用正常地址访问寄存器 MEM_ADDR(DEVICE_REG0)= MEM_ADDR(DEVICE_REG0) | 0x2; //传统做法 MEM_ADDR(BITBAND(DEVICE_REG0,1)) = 0x1; //使用位带别名地址
如何进行位绑定操作
1、对RAM的操作:
ARM7、ARM9、ARM10、ARM11都没有位操作这一功能,要修改某一位的逻辑 状态,必须经过三步:读——改——写。
ARM Cortex就有了位操作这一功能,可以对片上外设(所有外设I/O、ADC、IIC 等等)、片上RAM(数据存储器),分别1MB的空间进行访问。
#define DEVICE_REG0 ((volatile unsigned long *) (0x40000000)) #define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x42000000))ቤተ መጻሕፍቲ ባይዱ#define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x42000004)) ... *DEVICE_REG0 = 0xAB; //使用正常地址访问寄存器 ... *DEVICE_REG0 = *DEVICE_REG0 | 0x2; //使用传统方法设置bit1 ... *DEVICE_REG0_BIT1 = 0x1; // 通过位带别名地址设置bit1
这里举一个例子: 1. 在地址0x20000000处写入0x3355AACC 2. 读取地址0x22000008。本次读访问将读取0x20000000,并提取比特2,值为1。 3. 往地址0x22000008处写0。本次操作将被映射成对地址0x20000000的“读-改-写”操作(原子 的),把比特2清0。 4. 现在再读取0x20000000,将返回0x3355AAC8(bit[2]已清零)。 位带别名区的字只有LSB有意义。
3.5.3 位绑定操作
在片上SRAM区和片上外设区的下部,各有一个1MB的区间,被称为 “位带区”。 该位带区还有一个对应的、32MB的 “位带别名(alias)区”,容纳了8M 个“位变量”(对比8051的只有128个位变量)。 位带区对应的是最低的1MB地址范围,而位带别名区里面的每个字对应 位带区的一个比特。 位带操作只适用于数据访问,不适用于取指。通过位带的功能,可以把 多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访 问普通内存一样地使用它们。 位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三步 曲。
3.5.1 存储器映射简介
0xFFFFFFFF
Cortex-M3支持4GB存储空间,分成了6块:代码、SRAM、外设、外部RAM、 外部设备、系统级。 系统级
0xE0000000 0xDFFFFFFF
内核私有内容
外部设备
外部设备
0xA0000000 0x9FFFFFFF
--闪存地址重载及断点单元(FPB) -- 数据观察点单元(DWT) --仪器化跟踪宏单元(ITM) -- 嵌入式跟踪宏单元(ETM) -- 跟踪端口接口单元(TPIU) --ROM表
不使用位绑定操作(以前的方式):LDR R0,=0X20000000 LDR R1,[R0] ORR.W R1,#0X4 STR R1,[R0] 使用位绑定操作(Cortex-M3方式):LDR R0,=0X22000008 MOV R1,#1 STR R1,[R0]
操作片上外设(操作I/O端口A的方向寄存器地址为0x40004400):
_____存储器映射
存储系统功能概览
CM3的存储器系统与从传统ARM架构的相比,已经有过脱胎换骨般的改革了: 第一, 它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线。 第二, CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了 对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中,见本章论述。 第三, CM3的存储器系统支持非对齐访问和互斥访问。这两个特性是直到了v7M时 才出来的。 最后,CM3的存储器系统支持both小端配置和大端配置。
位带操作的优越性
通过GPIO的管脚来单独控制位设备(如每盏LED的点亮与熄灭)。
操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。 位带操作还能用来化简跳转的判断。 当跳转依据是某个位时,以前必须这样做: 读取整个寄存器 掩蔽不需要的位 比较并跳转
现在只需: 从位带别名区读取状态位 比较并跳转
NVIC所处的区域叫做“系统控制空间(SCS)”,在SCS里的除了NVIC外, 还有SysTick、MPU以及代码调试控制所用的寄存器
系统控制空间(SCS)
最后,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。 CM3中的MPU是选配的,由芯片制造商决定是否配上。
上述的存储器映射只是个粗线条的模板,半导体厂家会提供更展开的图示,来表明芯 片中片上外设的具体分布,RAM与ROM的容量和位置信息。
LDR R0,=0X40004400
MOV R1,#1 STR R1,[R0]
在C语言中使用位带操作
不幸的是,在C编译器中并没有直接支持位带操作。比如,C编译器并不知道同一块内 存能够使用不同的地址来访问,也不知道对位带别名区的访问只对LSB有效。欲在C中 使用位带操作,最简单的做法就是#define一个位带别名区的地址。例如:
外部RAM
0x60000000 0x5FFFFFFF
外部RAM
外设
片上外设 片上SRAM 代码
0x40000000
0x3FFFFFFF
SRAM
0x20000000 0x1FFFFFFF
代码
0x00000000
3.5.2 存储器映射空间
内部SRAM区的大小是512MB,用于让芯片制造商连接片上的SRAM,这个区通过 系统总线来访问。在这个区的下部,有一个1MB的区间,被称为“位带区”. 地址空间的另一个512MB范围由片上外设(的寄存器)使用。这个区中也有一条 32MB的位带别名,以便于快捷地访问外设寄存器,外设区内不允许执行指令。 还有两个1GB的范围,分别用于连接外部RAM和外部设备,它们之中没有位带。两 者的区别在于外部RAM区允许执行指令,而外部设备区则不允许。
位带区对应的是最低的1MB字节(8M位)地址范围,而位带别名区里面的每 个字对应位带区的一个比特。
位带区与位带别名区的膨胀对应关系图
举例:欲设置地址0x2000_0000中的比特2,则使用位带操作的设置过程如下图所示:
对应的汇编代码
位带读操作相对简单些:
位带操作的概念其实30年前就有了,那还是8051单片机开创的先河。如今,CM3将 此能力进化,这里的位带操作是8051位寻址区的威力极度加强版。
AliasAddr= 0x22000000+((A-0x20000000)*8+n)*4 =0x22000000+ (A-0x20000000)*32 + n*4
上式中,“*4”表示一个字为4个字节,“*8”表示一个字节中有8个比特。
表3.1 SRAM区中的位带地址映射 位带区 等效的别名地址 0x20000000.0 0x22000000.0 0x20000000.1 0x22000004.0 0x20000000.2 0x22000008.0 … 0x20000000.31 0x2200007C.0 0x20000004.0 0x22000080.0 0x20000004.1 0x22000084.0 0x20000004.2 0x22000088.0 … 0x200FFFFC.31 0x23FFFFFC.0
在GCC和RealView MDK (即Keil) 开发工具中,允许定义变量时手工指定其地址。如: volatile unsigned long bbVarAry[7] __attribute__(( at(0x20003014) )); volatile unsigned long* const pbbaVar= (void*)(0x22000000+0x3014*8*4); 这样,就在0x20003014处分配了7个字,共得到了32*7=224个比特。 在long*后面的“const”通知编译器:该指针不能再被修改而指向其它地址。 注意:at()中的地址必须对齐到4字节边界。 再使用这些比特时,可以通过如下的形式: pbbaVar[136]=1; //置位第136号比特
为简化位带操作,也可以定义一些宏。比如,我们可以建立一个把“位带地址+位序 号”转换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏: //把“位带地址+位序号”转换成别名地址的宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr & 0xFFFFF)<<5)+(bitnum<<2))
相关文档
最新文档