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

时间:2017-10-19 05:02:48

标签: assembly microcontroller avr avr-gcc harvard-architecture

我知道这非常适合“愚蠢问题”类别,但我一直在研究如何在AVR 8-bit上启动加载后执行机器代码,并且已经了解到哈佛架构在AVR 8位MCU使得无法从闪存以外的任何地方执行代码。那么如何使用inline asm在运行时引入新的可执行代码?

2 个答案:

答案 0 :(得分:7)

你混淆了三件事:

  1. 内联汇编

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

  2. 引导装载程序

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

  3. 从RAM执行代码

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

答案 1 :(得分:0)

  

......用于AVR 8位MCU的哈佛架构实现了这一目标   不可能从闪存以外的任何地方执行代码。

您的理解是正确的,代码只能在闪存中使用。

  

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

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

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