2010-01-07 31 views
3

我有一個TI DSP(TMS320F28235,如果有人關心),我需要實現一個FIFO,用於在主循環代碼和中斷之間排隊信息。這個隊列的高速執行非常關鍵,但是正確的操作也是非常重要的,我不確定是否可以在沒有任何明確同步的情況下實現FIFO,或者如果不是,我必須禁用中斷。在嵌入式系統上線程安全的單消費者,單生產者FIFO

我發現this page並想知道這裏有人能否評論它的適用性。

+1

DSP能否重新加載加載和存儲?你有原子操作嗎?它可能會記憶障礙嗎? – 2010-01-07 19:15:08

+0

請特別注意該文章中的'volatile'關鍵字。如果你不知道它做了什麼,你需要學習。 – Robert 2010-01-08 02:40:25

+0

這個DSP有雙字連接比較和交換嗎? – 2010-01-08 10:08:40

回答

3

您發現的頁面精確適用於您的情況。它僅依賴於字讀取和寫入是原子的。它對於靜默地重新加載和存儲的硬件很脆弱。另一方面,Man所知道的其他所有同步算法也容易受到這種特殊情況的影響。

如果您想進行一些嚴肅的計算機考古,請爲CDC 6600操作系統挖掘循環緩衝區描述。 CDC最初開發爲在6600

+0

啊,是的......首先,進,出,限制。如此簡單和優雅。 – 2010-01-07 23:10:54

1

NEW多個物理處理器之間進行通信的技術和正確的信息

的指令集的參考可以發現here

要模擬鎖,建議在文檔中禁用中斷。

Example ; Make the operation 」VarC = VarA + VarB」 atomic: 
    DINT ; Disable interrupts (INTM = 1) 
    MOVL ACC,@VarA ; ACC = VarA 
    ADDL ACC,@VarB ; ACC = ACC + VarB 
    MOVL @VarC,ACC ; Store result into VarC 
    EINT ; Enable interrupts (INTM = 0) 

- 算法指針 -

中斷搶先主迴路,顯然原子操作不存在。您的主循環必須在彈出時禁用中斷。由於禁用中斷就像在上下文中擁有鎖,所以可以將隊列實現爲連續內存或slist的ontop。前者意味着將內存複製到pop上的主循環堆棧中,這可能會更慢 - 但是,如果您的FIFO有足夠的內存,則您不必從堆中分配slist節點 - 這意味着無需內存管理頭痛。當然,如果slist節點的大小統一,內存管理難題將不復存在。

因此,對於流行音樂,您必須禁用中斷並刪除元素 - 完成後,重新啓用中斷。對於中斷向量,它與往常一樣(您可能需要在中斷向量處理期間禁用中斷 - 這與控制器有關)。

相關問題