2012-10-21 103 views
0

我有兩個數組。我正在調用main中的一個函數,其中我正在根據另一個數組中的某些值更新其中一個數組。如何將數組指針傳遞給函數?

volatile float32_t raw_data[3]; //this is being updated by an interrupt handler 
void get_acc(int32_t* acc_data, float32_t* raw_data) 
{ 
    acc_data[0] = (raw_data[0] - OFFSETX)/SENSX; //OFFSETX and SENSX defined as a macro 
    acc_data[1] = (raw_data[1] - OFFSETY)/SENSY; 
    acc_data[2] = (raw_data[2] - OFFSETZ)/SENSZ; 
} 
int main() 
{ 
    int32_t acc_data[3];  
    int32_t data_ready = 0; //being updated by interrupt handler 
    while(1) 
    { 
    if(data_ready) 
    get_acc(acc_data,raw_data); 
    } 
} 

要我絕對震撼,當我使用斷點和步進get_acc觀看變量,只有第一個acc_data [0]得到更新,所有其他人都設置爲0,即使它們被執行。現在我的第一個懷疑是它與指針有關,可能地址沒有被正確更新。因爲我使用了傳遞數組的功能,就像我在for循環中更新數組索引一樣,而不是手動。 任何人都可以提供一個洞察什麼可能是錯誤的。

+0

是raw_data全局定義的嗎?如果是raw_data指針不是必需的 –

回答

2

,你可能會有微妙的同步錯誤的位置:

  1. 喬納森指出raw_data已失去功能的內部預選賽。即使沒有涉及信號處理程序,以這種方式使用volatile變量也是未定義的行爲。
  2. 另外,您的數據似乎是由信號處理程序異步觸摸的。 C99的唯一數據類型,您可能會碰到這樣的信號處理程序是sig_atomic_t。 C11進位進一步並且還允許其他鎖自由的原子類型:

當抽象機的處理是通過一個信號的接收 中斷,對象的值既不是無鎖原子與浮點環境的 狀態一樣,未指定類型爲volatile的sig_atomic_t的對象也不指定。處理程序修改的任何對象 的值不是無鎖的原子對象,也不是 的 類型易失性sig_atomic_t在處理程序退出時變得不確定,如同由浮點環境修改的 處理程序而不是 恢復到其原始狀態。

正如你看到的,尤其是觸摸浮動點被認爲是一個沒有去。

1

當(在Mac OS X 10.7.5 GCC 4.7.1)編譯的代碼,我得到一個警告:

warning: passing argument 2 of ‘get_acc’ discards ‘volatile’ qualifier from pointer target type [enabled by default] 
note: expected ‘float32_t *’ but argument is of type ‘volatile float32_t *’ 

我不知道,這佔了你的麻煩,但也可能是一個因素。我注意到data_ready也應該是volatile合格。

另外,如果你有-Wshadow編譯,您將獲得:

In function ‘get_acc’: 
warning: declaration of ‘raw_data’ shadows a global declaration [-Wshadow] 

這比什麼都嚴重的多「誤解的風險」的問題。

但是,除了限定符的區別之外,您顯示的代碼是乾淨的,編譯器應生成代碼以讀取raw_data中的三個值並將其處理爲acc_data。你看過爲該函數生成的彙編語言嗎?