我知道这接近于“愚蠢的问题”类别,但我一直在研究如何在 AVR 8 位上引导加载后执行机器代码,并了解 AVR 8 上使用的哈佛架构-位 MCU 使得无法从闪存以外的任何地方执行代码。那么如何在运行时使用内联 asm 引入新的可执行代码呢?
2 回答
你混淆了三件事:
内联装配
内联汇编用于将汇编指令传递给 C(或任何语言)编译器。编译器会将汇编指令添加到它生成的代码中。最后,内联汇编指令的存储方式与编译器生成的指令相同。如果您将程序写入闪存,则内联指令也将位于闪存中。
引导加载程序
引导加载程序通常会从某些输入(例如 USB 接口)读取数据并将数据写入闪存。所以发送到 AVR 的程序稍后会从闪存执行,而不是从 RAM 执行。
从 RAM 执行代码
许多处理器都支持这一点。许多引导加载程序(对于其他微控制器)也允许将代码加载到 RAM 中而不是闪存中并从那里执行代码。你是对的:至少大多数(也许全部??)AVR 8 位微控制器不支持这个!
... AVR 8 位 MCU 上使用的哈佛架构使得无法从闪存以外的任何地方执行代码。
你的理解是正确的,代码只能从flash中执行。
那么如何在运行时使用内联 asm 引入新的可执行代码呢?
您可以编写将闪存作为纯数据写入/读取的代码。事实上,这正是任何引导加载程序所做的。即使没有明确的“引导加载程序部分”,例如在 attiny 系列中,以这种方式访问闪存也是可能的。您的数据表(本例中为第 263 页)包含该主题的一章,我建议您详细阅读。
也就是说,我还没有看到使用此功能运行附加功能的代码。额外的复杂性可能使其无法用于像 AVR 这样的小型低功耗微控制器。