我正在開發一個相當複雜的微控制器應用程序C,我對如何將不同任務/線程之間的共享數據「鏈接」而不耦合它們存在一些疑問。如何在任務/線程之間共享數據而不耦合它們?
到現在爲止,我已經使用了時間片調度程序來運行我的應用程序,因此不需要數據保護。但是我想讓應用程序正確,我想在稍後爲多線程操作系統做好準備。
我試圖通過使用完全不同的系統,而不是我正在工作的實際系統來簡化我的問題。我無法添加圖片,因爲我是新用戶,但生病嘗試並解釋:
我們得到4個任務/線程:3個輸入線程,通過硬件抽象層(HAL)從不同傳感器讀取一些傳感器數據。 。收集的傳感器數據存儲在任務域(即:他們不會是全球性的!)。 現在我們還有1個輸出任務,我們稱之爲「調節器」。調節器必須使用(讀取)從所有3個傳感器收集的傳感器數據才能生成正確的輸出。
問題:Regulator如何讀取存儲在不同輸入任務中的採集數據而不與其他任務耦合?
調節器只能通過參考知道輸入任務及其數據(即:不包含,不耦合)。
到目前爲止,Regulator已經有了一個指向每個所需傳感器數據的指針,並且該指針在初始化時設置。由於數據保護,這不會在多線程應用程序中工作。
我可以做一些getSensorValue()
功能,它利用信號量,爲每個傳感器值,然後用函數指針將這些函數鏈接到調節器。但是這會佔用很多內存!有沒有更好的方法來做到這一點?我只是在尋找投入。
我希望這一切都是可以理解的:)
你在運行什麼硬件?微控制器系列對可以完成的工作產生很大的影響。例如在許多微控制器上沒有虛擬內存。在其他控制器的「線程」中實際上並不是線程,而只是看門狗交換的堆棧指針。 – Pyrce
目前我在PSoC5上運行,我計劃進行端口/轉換爲STM32? – Jolle
這些家族看起來有真正的線程/虛擬內存表。當你說數據保護會阻止應用程序讀取線程特定的數據時,你的意思是說這些'線程'是作爲進程而不是線程啓動的嗎?因爲線程可以讀取其他線程的內存,除非你用'__thread'等線程本地關鍵字來顯式地限制內存。你認爲什麼內存很多,3個信號燈應該只佔用幾個字節的內存。或者由於傳感器的讀取速度,線程不能被延長時間阻塞? – Pyrce