我有一個TI DSP(TMS320F28235,如果有人關心),我需要實現一個FIFO,用於在主循環代碼和中斷之間排隊信息。這個隊列的高速執行非常關鍵,但是正確的操作也是非常重要的,我不確定是否可以在沒有任何明確同步的情況下實現FIFO,或者如果不是,我必須禁用中斷。在嵌入式系統上線程安全的單消費者,單生產者FIFO
我發現this page並想知道這裏有人能否評論它的適用性。
我有一個TI DSP(TMS320F28235,如果有人關心),我需要實現一個FIFO,用於在主循環代碼和中斷之間排隊信息。這個隊列的高速執行非常關鍵,但是正確的操作也是非常重要的,我不確定是否可以在沒有任何明確同步的情況下實現FIFO,或者如果不是,我必須禁用中斷。在嵌入式系統上線程安全的單消費者,單生產者FIFO
我發現this page並想知道這裏有人能否評論它的適用性。
您發現的頁面精確適用於您的情況。它僅依賴於字讀取和寫入是原子的。它對於靜默地重新加載和存儲的硬件很脆弱。另一方面,Man所知道的其他所有同步算法也容易受到這種特殊情況的影響。
如果您想進行一些嚴肅的計算機考古,請爲CDC 6600操作系統挖掘循環緩衝區描述。 CDC最初開發爲在6600
啊,是的......首先,進,出,限制。如此簡單和優雅。 – 2010-01-07 23:10:54
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節點的大小統一,內存管理難題將不復存在。
因此,對於流行音樂,您必須禁用中斷並刪除元素 - 完成後,重新啓用中斷。對於中斷向量,它與往常一樣(您可能需要在中斷向量處理期間禁用中斷 - 這與控制器有關)。
DSP能否重新加載加載和存儲?你有原子操作嗎?它可能會記憶障礙嗎? – 2010-01-07 19:15:08
請特別注意該文章中的'volatile'關鍵字。如果你不知道它做了什麼,你需要學習。 – Robert 2010-01-08 02:40:25
這個DSP有雙字連接比較和交換嗎? – 2010-01-08 10:08:40