2016-10-21 126 views
0

該溫控功能:這個MACRO功能是做什麼的?

FIFO_ELEM_AT(p_fifo, index) ((uint8_t*) ((uint8_t*) p_fifo->elem_array) + (p_fifo->elem_size) * (index)) 

和 「p_fifo」 被定義爲:

typedef struct 
{ 
    void* elem_array; 
    uint32_t elem_size; 
    uint32_t array_len; 
    uint32_t head; 
    uint32_t tail; 
    fifo_memcpy memcpy_fptr; /* must be a valid function or NULL */ 
    } fifo_t; 

總的來說這是試圖做一些靜態FIFO數據結構。我無法真正告訴你通過函數中描述的計算可能達到的效果。請幫忙!

+1

你試着將它分割成單獨的線和打印/調試值是多少? – GManNickG

+0

查找「隊列」數據結構 –

+0

您可以忽略外部'(uint8_t *)',這是多餘的。如果你仍然不明白,那麼更具體地問一下你被困在哪個位上。 –

回答

0

您應該閱讀您正在查看的代碼的文檔。
否則你被卡住了猜測。你似乎要求幫忙猜測。
這裏是我的猜測:

  • 所提到的結構類型描述處理一個特殊的數據結構的一個實例的所有信息。
  • 由於名稱的原因,它可能是一個FIFO又名「ringbuffer」,又名「隊列」(由M.M.發表)
  • 它需要一個附帶的存儲器,用作實際的FIFO。
  • 要使用的內存由指向它的指針「elem_array」引用。
  • 「elem_size」是一種元素在FIFO
  • 「頭」的引用的大小從FIFO返回的下一個元素
  • 「尾巴」的引用的最後一個元素加到FIFO
  • 或其他方式圍繞
  • 「memcpy_fptr」的引用一個潛在的優化功能的元件移動到和從FIFO
  • 引用的宏提供了一種指針的形式獲得在FIFO中的元件的給定索引
  • 在到uint8_t ;而不是指向元素類型的指針,該宏獲取FIFO的地址,執行一些指針運算(包括元素大小和給定索引),從而評估結果:uint8_t-pointer to索引元素

在我的猜測頂部,這裏是我的意見爲主,建議:

使用的結果(指向uint8_t)時
  • ,它使用宏時,轉換爲相應的類型
  • ,確保你給一個現有的元素,至少一個元素w的索引已經添加了一個有意義的值
  • 當使用該宏時,給出一個尚未從FIFO返回的元素的索引但是不使用該宏,它似乎違背了一個FIFO,
    可能的例外,以獲得對FIFO的內容信息以進行調試