Memory 关于内存以及如何计算结束地址

Memory 关于内存以及如何计算结束地址,memory,microcontroller,ram,microprocessors,rom,Memory,Microcontroller,Ram,Microprocessors,Rom,我读过控制器的基址和内存映射,我怀疑是否所有的内存位置都只有1字节,并且假设如果内存映射说ROM的基址是0x0000,它的大小是8K(我相信它是8KB=8*1024字节,简而言之,是8K)我如何计算ROM的结束地址,即0x1FFF。我是否可以得出结论,在将ROM的基址视为0x0000后,它被32位处理器访问,并且ROM可以存储4GB 我的理解正确吗? 0x0000=0000_0000_0000_0000表示从微处理器点到该位置的16条地址线 0000_0000_0000_0000在ROM中,在R

我读过控制器的基址和内存映射,我怀疑是否所有的内存位置都只有1字节,并且假设如果内存映射说ROM的基址是0x0000,它的大小是8K(我相信它是8KB=8*1024字节,简而言之,是8K)我如何计算ROM的结束地址,即0x1FFF。我是否可以得出结论,在将ROM的基址视为0x0000后,它被32位处理器访问,并且ROM可以存储4GB

我的理解正确吗? 0x0000=0000_0000_0000_0000表示从微处理器点到该位置的16条地址线 0000_0000_0000_0000在ROM中,在ROM中的地址中,ROM可以保存8位数据

在ARM Cortex M3中,处理器中有32位地址线和32位数据线,以及32位寄存器。因此,由于有32位地址线,我们可以说我们有4294967296个1'和0的组合,代表4294967296个内存位置,每个位置具有1字节的数据保持容量。我的疑问是,既然寄存器是32位的,那么它就像一个寄存器有4个连续的内存位置(4个不同的地址),因为内存是1字节

我认为这些问题在这个伟大的平台上似乎微不足道,但它会有一点帮助
它用简单的术语解释,或者建议使用链接。

除了极少数例外,当前产品以字节为单位寻址内存。所以“地址”就是“字节地址”。现在,当您深入研究逻辑时,有许多情况下总线将具有非字节寻址。例如,如果一个sram是32位宽的,在该sram之前,您有一个正常的基于字节的地址,通常没有理由保留较低的两个地址位并在其上浪费信号。在一次寻址基本上是四个字节的地址时,它们不被使用。当您访问一个16位或32位控制寄存器(比如uart外围设备中的uart波特率寄存器)时,同样的情况也会发生。最终,地址的低位在逻辑深处被剥离为未使用

正确的想法是,当16位传输发生时,它是到实际ram或rom/闪存或控制寄存器,即两个字节。从字节地址的角度来看,这两个字节可能是0x40001000和0x40001001,但是,作为程序员,以及从系统级的角度来看,16位传输不是这两个地址的两个字节传输,而是一个地址0x40001000的16位传输(不管是大端还是小端,你提到了cortex-m,所以在你的例子中基本上是小端)

虽然也有例外,但您可能使用的处理器的总线宽度超过一个字节,cortex ms可能是32位,可能是更大的64位,但肯定不是8位。因此,每次传输都是一个字节、半字、字或双字(64位)通过该总线完成,并且当您这样做时,不会神奇地移除芯片中的导线/信号,因为它们总是在那里是以总线全宽为单位进行的,因此,如果要从内存中读取单个字节,通常会发现系统的设计方式是读取包含该字节的整个32位或64位,处理器隔离总线返回的一个字节并丢弃其他字节。对于写操作,每个字节在总线上放置一个字节总线规则(因处理器而异)和总线上的其他数据线通常由来自总线控制器的垃圾数据或陈旧数据驱动,或有时让其浮动。根据总线规则/设计,向另一端发出指示,并说明这是一次写入,将通过字节掩码指示大小(总线上每个字节通道一位,一个状态(一或零)表示该字节有效/已使用,另一个状态表示该字节无效)或基于字节的长度与地址组合,等等。ARM倾向于基于字节掩码,您可以从中读取

要知道ARM制造处理器IP而不是芯片,ARM几乎与芯片供应商的连接方式无关,没有任何规则表明地址0x00000000是rom/flash。从历史上看,整个地址空间(大小取决于购买的核心,理想情况下为32位,但对于arm来说并不总是如此。请阅读arms网站上的核心文档)这对芯片设计者来说是公平的游戏。通过特殊的协处理器指令访问核心控制寄存器。Cortex-m的ARM确实指示了很宽的地址范围,如果你想要一个rom,你应该把它放在这个范围内,这个范围应该是sram,在这个地址之上是内部的,对这个范围的访问不会在总线上消失作为一个芯片设计师,尽管你仍然可以自由地做你想做的事情,但是你可以理解内核中的逻辑是如何使用这些地址空间的(如果存在缓存,则可能没有完全清除mcu,因此您希望将外围设备的控制寄存器置于arm建议的范围内,以避免缓存该地址空间)

因为处理器(不是芯片)通过检查从地址0x00000000开始的前几个单词位置的单词进行引导,芯片设计者需要为软件开发者提供一种方法,将他们的向量表放在前面,以便他们的程序运行。一些芯片设计者只需在该地址为用户闪存设计相对于ARM的地址例如,stm32的一些/许多基于TI cortex-m的芯片使用不同的地址,例如,stm32的所有/大部分使用0x08000000,因此对闪存的完全访问权在该地址,但在使用具有特定设置的芯片集引导期间,芯片逻辑将访问基于0x00000000的地址中的一小部分,并访问用户因此,为了在stm32系列上进行开发,您需要构建您的程序