【发布时间】:2021-10-19 02:42:20
【问题描述】:
我正在尝试执行以下操作,但它不起作用。使用 arm 工具链 gcc 8.5 时代码崩溃。
#define _move(src, dst) __asm volatile ( \
"ldr r0, [%0] \n\t" \
"ldr r1, [%1] \n\t" \
"ldm r0!, {r4-r11} \n\t" \
"stm r1!, {r4-r11} \n\t" \
: \
: "r" (dst), "r" (src) \
: "cc" \
)
static uint32_t sr[8];
static uint32_t ds[8];
int main() {
sr[0] = 0xff;
_move(sr, ds);
printf("data:%d\n", ds[0]);
}
代码有什么问题?
【问题讨论】:
-
您是否检查过您可以在不破坏重要值的情况下使用所有这些寄存器?你至少应该在clobber列表中这样说。
-
ldr r0, [%0],从dst地址读取值。或r0 = ds[0]。ds[0]很可能为零(或一些随机的废话),我认为ldm r0!, {r4-r11}正在使用 NULL 解引用。 -
除了为寄存器 4 到 11 声明 clobber,您还需要 clobber
"memory"。 -
无论如何,你有什么理由不信任编译器而只做
memcpy(ds, sr, 32)? -
感谢提及“记忆”。这样做的原因是时间。我需要最快的方式来传输数据。目前我无法进行正常的 dmac 传输。