有关新 AVR 指令 LAC、LAS、LAT 和 XCH 的更多详细信息

Posted

技术标签:

【中文标题】有关新 AVR 指令 LAC、LAS、LAT 和 XCH 的更多详细信息【英文标题】:More detail about new AVR instructions LAC, LAS, LAT and XCH 【发布时间】:2012-01-17 20:27:20 【问题描述】:

查看 AVR 指令集,2010 年增加了 4 条指令

LAC load and clear
LAS load and set
LAT load and toggle
XCH load and exchange

    有谁知道什么芯片有这些说明

    哪些工具支持这些说明

    更多关于他们做什么的信息

    (Z)

这是否意味着 Rd 和 (Z) 获得相同的值,还是 Rd 获得 Z 指向的内容的预修改值?

【问题讨论】:

显然,它确实 eXCHange Rd 和 Z 指向的值。 一些论坛建议它们可能仅在 XMEGA series of AVR microcontrollers 上可用。 还不明显,xmega 文档没有在列表中显示指令。在指令集手册添加这些内容之前,最新版本的最后一次更新。 XCH 很明显,其他三个 LAx 不一定。与其他说明不同,这些说明没有太多信息,似乎是以“不要忘记记录这些”的方式快速插入的,而不是花时间使它们完整并与手册的其余部分保持一致。 嗯.. 应该有人在真实硬件上测试它们,这样我们就知道它们在做什么了。 【参考方案1】:

这些可能不在当前(如最初的问题)芯片中,但都有一个共同的主题 - 原子内存操作。它们的目的通常是用于线程之间的同步,并且它们包含在指令集级别可能表明 Atmel 正计划推出多核 AVR 芯片。由于现在已经指定了它们,因此工具供应商已经可以将它们添加到汇编器中,但是在芯片有指令之前,他们不会做太多的事情。 (编辑:事实证明,另一个核心是 USB 外围设备,而不是 CPU。感谢 avakar 提供的信息。)

我从Atmel AVR 8-bit Instruction Set Manual 读到的行为:

LAC - 加载和清除,将内存内容 *Z 加载到寄存器 Rd 中,同时清除 *Z 中设置在 Rd 中的位。

LAS - Load And Set 同时设置在寄存器中设置的内存位置中的位,并使用内存位置的先前内容加载寄存器。例如,对于单比特互斥锁非常有用。

LAT - 加载和切换;像 LAS,但不是按位或,而是使用按位异或,从而切换位。

XCH - 交换;简单地交换内存和寄存器内容。

它们都是 RAM 访问指令(07/2014 参考状态它们需要两个周期),它们组合了操作,因此它们还可以使需要 RAM 的代码比现在更快。

【讨论】:

这些我最近一直在梳理的 avr 文档,无论是用于我的指令集模拟器还是用于通过 pdi 对 xmega 进行编程,都充满了拼写错误和其他错误。我假设 lac 在定义末尾缺少“,Rd 多核AVR?那将是超级棒的。 恐怕这些指令不是为另一个 CPU 内核添加的,而是为 USB 外设添加的,它使用 SRAM 来存储端点控制/状态寄存器。早期的 A 和 D 模型中缺少说明,但在 AU 和更新的模型中存在。 即使忽略真正的多线程,这些指令也有助于避免与中断处理程序竞争。通常您最终会执行 CLI 之类的操作;移动; CBI/SBI; STI,现在您可以避免这种情况并使用单个 LAC 或 LAS 指令。 您是否有指向记录这些说明的说明参考的链接?【参考方案2】:

需要强调的小而重要的细节:LAS、LAC 和 LAT 指令仅在 Z 指向“真实”SRAM 时起作用。那不是(内存映射)寄存器等。因此,事实上,这些对于您自己的(OS)数据或 XMega USB 模块都很有用,没有其他外围设备和模块。

很遗憾(例如,它对于操作 PMIC.CTRL 标志非常方便),但它确实不起作用。经测试。当应用于内存映射寄存器时,看起来 LAS、LAC 和 LAT 与 XCH 具有相同的效果(Rd 和 (Z) 之间的交换,但没有位旋转)。

【讨论】:

以上是关于有关新 AVR 指令 LAC、LAS、LAT 和 XCH 的更多详细信息的主要内容,如果未能解决你的问题,请参考以下文章

AVR--IO设置编程

我正在用 atmel 编写 AVR 程序集,但“调用”指令不起作用

AVR单片机教程——串口接收

有关python,numexpr和数组运算加速的应用求助

在 AVR 中断中保留 sreg

AVR 内存和英特尔十六进制