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