Assembly 如何在AVR 8位上实现内联组装?

Assembly 如何在AVR 8位上实现内联组装?,assembly,microcontroller,avr,avr-gcc,harvard-architecture,Assembly,Microcontroller,Avr,Avr Gcc,Harvard Architecture,我知道这与“愚蠢的问题”很接近,但我一直在研究如何在AVR 8位引导加载后执行机器代码,并了解到,AVR 8位MCU上使用的哈佛体系结构使得除了flash以外的任何地方都无法执行代码。那么,如何在运行时使用内联asm引入新的可执行代码呢?您混淆了三件事: 内联装配 内联汇编用于将汇编指令传递给C(或任何语言)编译器。编译器将把汇编指令添加到它生成的代码中。最后,内联汇编程序指令的存储方式与编译器生成的指令相同。如果将程序写入闪存,内嵌指令也将位于闪存中 引导加载程序 引导加载程序通常会从一些输

我知道这与“愚蠢的问题”很接近,但我一直在研究如何在AVR 8位引导加载后执行机器代码,并了解到,AVR 8位MCU上使用的哈佛体系结构使得除了flash以外的任何地方都无法执行代码。那么,如何在运行时使用内联asm引入新的可执行代码呢?

您混淆了三件事:

  • 内联装配

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

  • 引导加载程序

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

  • 从RAM执行代码

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

  • 。。。AVR 8位MCU上使用的哈佛体系结构使其 不可能从flash以外的任何地方执行代码

    您的理解是正确的,代码只能从flash中删除

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

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


    也就是说,我还没有看到使用这个函数来运行额外代码的代码。额外的复杂性可能使像AVR这样的小型低功耗微控制器不可行。

    内联汇编在运行时不会引入新的可执行代码。为什么您认为内联asm意味着“在运行时”“?更恰当地说,来自内联asm指令的汇编程序输出机器代码将被写入闪存。但是,是的,关键点正如您所说:内联asm在编译时在您编写的约束的控制下与编译器生成的asm混合。据我所知,没有AVR能够从RAM执行代码(所有指令总线部分都指向内部闪存,甚至无法从外部访问)。因此,最后一段中的“可能”是“肯定”。此代码是否可执行?其他处理器要求可执行指令位于具有可执行权限的内存块中(不确定AVR).我的理解是AVR使可执行内存块为只读。我的具体理解是,根据启动情况,这些内存块可以是可写但不可执行的,也可以是可执行但不可执行的writable@JSON我自己还没有使用过这个函数,但是即使是最小的AVR,比如TinySafeBoot:,也有一些引导加载程序,它们可以编写插件运行时闪存的指令。