我正在使用 C 和 ASM 混合编写 AVR 微控制器,但遇到了一些麻烦。
我的 C 代码中有以下代码:
uint8_t amplitudes32[32] = {.. constant values ..};
uint8_t amplitudes64[64] = {.. constant values ..}
uint8_t* amplitudes;
(amplitudes32/64 基本上是查表)
有时我希望幅度等于幅度 32,有时希望它等于幅度 64。
我正在这样做
amplitudes = amplitudes32;
在我的 c 代码中。
然后,在我的 ASM 中断例程中,我想像这样读取数组的地址:
ldi r30, lo8(amplitudes)
ldi r31, hi8(amplitudes)
然后我做一些更多的指令来将某个索引处的数组值传到一个特定的端口。但是,当我检查输出时,它不能正常工作并且我得到了一些我没想到的东西。无论数组由什么组成,我都会得到相同的结果。即使amplitudes
指向全零数组也是一样的。
如果我将汇编代码更改为
ldi r30, lo8(amplitudes64)
ldi r31, hi8(amplitudes64)
然后它按预期工作。但是就像我说的那样,我需要在不同的时间有一个不同的查找表,并且由于速度问题,我无法在中断例程中做出这个决定,所以如果我能有一个数组“变量”就好了可以在我的 C 代码中更改,然后中断使用。
我究竟做错了什么?