问题标签 [harvard-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
898 浏览

memory - 哈佛架构中的代码内存指的是哪里?

哈佛体系结构是一种计算机体系结构,具有用于代码和数据存储器的单独总线。该架构是指位于 RAM 或 ROM(用于微控制器)中的代码存储器吗?当架构谈到代码内存时,我感到很困惑。据我所知,对于小型嵌入式系统,代码将始终从 ROM 执行,而在中等规模和复杂的嵌入式系统中,代码存储器可以从 ROM 转移到 RAM 以更快地执行。如果是这种情况,则 RAM 与两条总线连接,一条用于代码,另一条用于数据存储器。任何人都可以帮助我理解这一点。

0 投票
2 回答
304 浏览

assembly - 如何在 AVR 8 位上进行内联汇编?

我知道这接近于“愚蠢的问题”类别,但我一直在研究如何在 AVR 8 位上引导加载后执行机器代码,并了解 AVR 8 上使用的哈佛架构-位 MCU 使得无法从闪存以外的任何地方执行代码。那么如何在运行时使用内联 asm 引入新的可执行代码呢?

0 投票
4 回答
506 浏览

c - 如何使两个其他相同的指针类型不兼容

在某些架构上,可能需要为其他相同的对象使用不同的指针类型。特别是对于哈佛架构 CPU,您可能需要以下内容:

特别是对于 PIC 的 MPLAB C18(现已停产)中指向 ROM/RAM 的指针的定义是这样的。它甚至可以定义如下内容:

这意味着 RAM 中的指针指向 RAM 中指向 ROM 中的字符串的指针(使用ram不是必需的,因为默认情况下,此编译器在 RAM 中,只是为了清楚起见添加了所有内容)。

这种语法的好处是,当您尝试以不兼容的方式分配时,编译器能够提醒您,例如将 ROM 位置的地址指向 RAM 的指针(例如data1 = data2;,或将 ROM 指针传递给函数使用 RAM 指针会产生错误)。

与此相反,在 AVR-8 的 avr-gcc 中,没有这种类型安全性,因为它提供了访问 ROM 数据的功能。没有办法区分指向 RAM 的指针和指向 ROM 的指针。

在某些情况下,这种类型安全对于捕获编程错误非常有益。

有没有办法以某种方式向指针添加类似的修饰符(例如通过预处理器,扩展为可以模仿这种行为的东西)来达到这个目的?甚至是警告不正确访问的东西?(在 avr-gcc 的情况下,尝试在不使用 ROM 访问函数的情况下获取值)

0 投票
2 回答
3494 浏览

embedded - 为什么冯诺依曼比哈佛建筑学更快

我读到了这两种架构,在互联网上的某个地方有人说使用冯诺依曼架构的系统比使用哈佛架构的系统更快。我试图寻找为什么会这样,但我还没有找到一个解释来澄清我的事情。

据我了解: - 在冯诺依曼架构中,CPU 一次可以执行一项操作,这意味着它可以在一个周期内从内存中获取数据或获取指令。因此,要对数据执行某种操作,它需要 2 个周期(一个用于获取数据,一个用于获取指令)。- 在哈佛架构中,由于有 2 个独立的内存块和两组独立的数据地址总线,CPU 可以在同一时钟周期内获取数据和指令

因此,如果 HV 架构可以在一个周期内完成与 VN 相同的事情,为什么它会更慢呢?用于一件事的周期越少是否意味着它应该比另一件事更快?请放轻松,我是嵌入式系统的菜鸟。感谢您阅读我的帖子!

0 投票
2 回答
932 浏览

cpu-architecture - 哈佛架构有没有冯诺依曼瓶颈?

从命名和这篇文章我觉得答案是否定的,但我不明白为什么。瓶颈是从内存中获取数据的速度。您是否可以同时获取指令似乎并不重要。不是还要等到数据到来吗?假设获取数据需要 100 个 cpu 周期,执行指令需要 1 个,那么提前完成 1 个周期的能力似乎并没有很大的改进。我在这里想念什么?

背景:我看到这篇文章说 Spectre 错误不会因为投机执行而得到修复。我认为投机执行,例如分支预测,对哈佛架构也有意义。我对吗?我知道投机执行对冯诺依曼架构更有利,但有多少呢?谁能给个粗略的数字?我们可以说幽灵会在多大程度上因为冯诺依曼架构而存在?

0 投票
2 回答
370 浏览

computer-science - Aren't the von Neumann model and the Turing model practically the the same thing?

From my understanding, the Turing model is made up of I/O data, a CPU, and a "program". The "program" is used to configure how the CPU will handle the input data in order to produce the output data. If we change the program, then the CPU will handle the input differently, and we get a different output.

The von Neumann model logically combines the I/O and the program into one.... OK, but practically what difference does that make when designing a computer? Why is von Neumann's model noted when it seems like it's just a modification of the Turing model? Does it mean that modern computers like smartphones are von Neumann computers (and not Turing computers) because they have the program and I/O integrated? Are old school game consoles considered Turing computers (and not von Neumann computers) because the program (cartridge) can be psychically separate from the CPU and I/O data? Someone please give me some insight.

0 投票
1 回答
57 浏览

cpu - 在哈佛架构中,是否有两个 MAR 和 MBR/MDR?

这可能是超级基本的,但我没有找到任何关于此的信息;如果在哈佛架构中需要同时访问数据和指令,这是否需要 CPU 有两个不同的 MAR 指向它们各自的地址和两个指向它们各自的数据?还是处理方式不同?

0 投票
0 回答
85 浏览

c - 在哈佛 CPU 中用 C 语言初始化全局变量

我用哈佛架构构建了一个 32 位 RISC-V CPU,我想用 C 为它编写程序。我有一个 RISC-V 编译器集(https://xpack.github.io/riscv-none-embed-gcc / ) 可以做到这一点并且工作正常 - 对于大多数事情。当我想使用全局变量、全局数组等时,问题就开始了,因为这些类型在启动/重置时被启动脚本复制到 RAM。

这是我的 CPU 的框图:(稍后会很重要。请注意指令存储器 = FLASH 和数据存储器 = RAM) 我的 CPU 框图

(如果您对我的 CPU 感兴趣,我制作了一个关于它的视频:https ://www.youtube.com/watch?v=KzSaFFpBPDM )


例子:

一个典型的程序看起来像这样:

它的 objdump 是这样的:

<_start>是我的启动脚本的一部分,它将初始化堆栈指针)


问题:

以下是尝试加载全局变量的两条指令:

但是有一个问题——它们从未被放入 RAM,因此 CPU 很可能最终会得到一些垃圾数据,这是不可接受的。


解决方案?

有人建议将链接器放松作为我之前的问题(RISC-V:全局变量)的一部分,同样,情况似乎并非如此,但我仍然可能是错的!

根据我的研究,大多数“经典”CPU 使用启动脚本,复制发生的地方,但由于这不是冯诺依曼架构,我没有将闪存映射到数据存储器,因此无法读取由程序(见上面的框图)。输出程序必须包含已解码为可执行指令的变量,例如,如果我们希望 RAM 中位置 0x0 处的值 0x4,则可以将其解码为:

将我的 CPU 重新构建为 von-neuman 将需要更多的门和 IC,这是一个离散构建,每个 IC 都很重要。

如上所述,对我来说,用硬件来做是最糟糕的解决方案,所以如果它可以用软件来做,我完全赞成——它可以!显然,有一个解决方案,但迄今为止最丑陋的:编译代码,提取数据(使用python),使用python脚本解码的这些变量生成一个新的启动脚本,然后再次编译。

我真的不想走那条路,所以如果可以通过修改启动脚本、链接器等来完成,那就太好了。

AVR IC 基本上是哈佛架构(尽管经过修改),那么它们有什么不同的地方可以学习吗?

0 投票
0 回答
23 浏览

risc - 哈佛架构微处理器和 GCC 跳转表放置的概念问题

我正在从头开始开发流水线NIOS2微处理器(英特尔 FPGA 生态系统的一部分)作为学习练习。这是一个哈佛架构处理器,具有独立的指令和数据存储器总线。

当我编译一个 C case 语句时,GCC 会创建一个跳转表,并将其与代码的其余可执行部分直接相邻。这会产生一个问题,因为处理器通过数据存储器总线加载跳转表值,该总线未连接到程序存储器。

我知道在实践中,单独的内存总线是通过缓存层次结构连接的,但是我没有缓存,并且我在两条总线之间保持了严格的分离。

作为一种解决方法,我将程序存储器设为双端口并将两条总线连接到它,但这似乎不是正确的解决方案。

我有没有办法指示 GCC 将跳转表和可执行代码分成不同的部分?如果没有,应该有吗?思考这个问题的正确方法是什么?