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コードを変更する可能性があります。
私は何が間違っているのですか?