簡體   English   中英

通過指向AVR程序集中數組的指針訪問數組

[英]Accessing array by pointer to an array in avr assembly

我正在使用C和ASM混合編程AVR微控制器,但遇到了一些麻煩。

我的C代碼中包含以下代碼:

uint8_t amplitudes32[32] = {.. constant values ..};
uint8_t amplitudes64[64] = {.. constant values ..}
uint8_t* amplitudes;

(幅值32/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代碼,然后中斷使用。

我究竟做錯了什么?

我對AVR組裝不是很熟悉。 但是,我相信lo8和hi8宏返回的是所提供變量的低/高地址 -如果傳入振幅64,則將使用64條目表的地址填寫r30 / r31-恰好你想要什么。 但是,如果您傳遞幅度,那么您將使用指針地址 ,這可能不是您想要的。 (需要取消對振幅變量的引用,以返回到原始表。)

由於在微控制器中解引用變量通常相對較慢(尤其是在對時間敏感的中斷中),因此我強烈建議您重新組織代碼,以在兩個表之間選擇一個布爾標志。 例如:

if (UseTable64)
 ldi r30, lo8(amplitudes64)      
 ldi r31, hi8(amplitudes64) 
else
 ldi r30, lo8(amplitudes32)      
 ldi r31, hi8(amplitudes32) 
end if

這樣的最終結果應該只是一條額外的分支指令-可能比取消引用幅度指針的額外時間更快。 或者,您可以嘗試將兩個查找表合並到一個96字節的表中,然后相應地調整索引。 像以前一樣,您仍然可以執行耗時的決定(要在中斷外部使用哪個表)(通過修改C代碼中的標志),以使中斷保持快速有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM