0

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

4

2 回答 2

7

你混淆了三件事:

  1. 内联装配

    内联汇编用于将汇编指令传递给 C(或任何语言)编译器。编译器会将汇编指令添加到它生成的代码中。最后,内联汇编指令的存储方式与编译器生成的指令相同。如果您将程序写入闪存,则内联指令也将位于闪存中。

  2. 引导加载程序

    引导加载程序通常会从某些输入(例如 USB 接口)读取数据并将数据写入闪存。所以发送到 AVR 的程序稍后会从闪存执行,而不是从 RAM 执行。

  3. 从 RAM 执行代码

    许多处理器都支持这一点。许多引导加载程序(对于其他微控制器)也允许将代码加载到 RAM 中而不是闪存中并从那里执行代码。你是对的:至少大多数(也许全部??)AVR 8 位微控制器不支持这个!

于 2017-10-19T06:31:05.030 回答
0

... AVR 8 位 MCU 上使用的哈佛架构使得无法从闪存以外的任何地方执行代码。

你的理解是正确的,代码只能从flash中执行。

那么如何在运行时使用内联 asm 引入新的可执行代码呢?

可以编写将闪存作为纯数据写入/读取的代码。事实上,这正是任何引导加载程序所做的。即使没有明确的“引导加载程序部分”,例如在 attiny 系列中,以这种方式访问​​闪存也是可能的。您的数据表(本例中为第 263 页)包含该主题的一章,我建议您详细阅读。

也就是说,我还没有看到使用此功能运行附加功能的代码。额外的复杂性可能使其无法用于像 AVR 这样的小型低功耗微控制器。

于 2017-11-05T19:18:19.073 回答