为什么使用类型化的 8 位常量而不是等效的 #define "Impossible constraint"?

Why "Impossible constraint" with a typed 8-bit constant but not with an equivalent #define?

本文关键字:#define Impossible constraint 类型化 为什么 常量      更新时间:2023-10-16

我收到一条错误消息,使用一个 8 位类型常量,我在 AVR 8 位微控制器(如 ATtiny1634 或 ATmega328(的内联汇编代码中用约束"M"标记该常量:

static const uint8_t tail_mask = (uint8_t)((rx1::queue_length-1) << 
rx1::queue_length_bits) & 0xFF;
asm(
...
"andi r30, %0nt"
...
:
: "M" (tail_mask)
);

警告:ASM 操作数 1 可能与约束不匹配

这里rx1是一个类名,queue_lengthqueue_length_bits都是static const uint8_t类常量。我可以使用"O""N",没办法。使用staticint8_t与否没有区别。

如果我用#define替换上面的static const uint8_t定义,错误消息就会消失!

#define tail_mask ((rx1::queue_length-1) << rx1::queue_length_bits)
asm(
...
"andi r30, %0nt"
...
:
: "M" (tail_mask)
);

编译很好!

这让我很烦恼。为什么使用强制的 8 位无符号常量会在强制约束上产生错误消息,强制它...一个 8 位无符号常量?

作为记录,我使用的是avr-gcc版本7.1.0

传递给约束的值在这里可能应该是 32 位整数。这是您在使用 #define 时获得的,因为它以静默方式提升为预期类型。同样,使用 int 或 unsigned 作为您的tail_mask值也是可以的。奇怪的是,我浏览了文档的几个版本,但没有发现任何证据表明 M 约束参数不能是uint8_t或类似参数。