2017-01-07 55 views
0

我正在尋找一個示例,介紹任務之間傳遞數據的正確方法:freeRTOS:如何在任務之間傳遞數據?

可以說我有一個顯示器,鍵盤和一些傳感器,例如。內部ADC。 我想在顯示屏上顯示所有傳感器的值。按下按鈕後,更改視圖並顯示一些文本。按下另一個後,返回值。

我會使用全局變量,但它無處不描述爲一個壞主意。在另一方面,如果我使用隊列(xQueueCreate,xQueueReceive,xQueueSend),我不會有所有的數據,以顯示它,我認爲,他們接受剛剛失去記憶之後創建副本。

+1

沒有什麼錯誤使用隊列。 http://www.freertos.org/Embedded-RTOS-Queues.html – OldProgrammer

回答

1

你已經提到了一些可能的解決方案,但是說你因爲複製數據而丟失了內存,如果你想從兩個不同的地方寫入數據,總會遇到這種情況,無論如何只需使用FreeRTOS已經決定放棄很多內存來處理上下文切換,任務處理以及FreeRTOS使用的所有其他資源。可能的解決方案是:

  1. 全局變量 - 原因就是爲什麼它是一個糟糕的主意,是因爲 最好要限制訪問變量(範圍)。也很難 保證它的安全,因爲在任務切換等任務可能要 寫相同的變量,並可能損壞數據。但是,如果你 保護它的權利,即使用某種標誌的鎖變量, 這是完全正常的解決方案,並採用即sempahore或排隊通知顯示任務的數據被填滿。

  2. 隊列 - 你可以從多個任務發送信息,正如你所說的保持顯示任務副本的變量,這是更安全的選項,它不必丟失內存,因爲你不必丟失它任何其他地方,您只需讀取傳感器,然後將其放入隊列中,然後當您在顯示任務中收到它時,就會更改以前的值。所以讀取數據的任務可以說ADC不需要在讀取之間存儲它。

  3. 隊列 - 但有點不同,你建議,如果你有系統中的直接流量讓我們先說你檢查鍵盤,然後是傳感器,然後其他東西,你可以發送隊列結構從TASK1 - > TASK2 - > TASK3 - > ... TASKX - > DISPLAY_TASK這種方式變量會有一定的流量,並且你會確保你總是將所有的數據放在一個地方。
  4. 你可以使用相同的paramater在所有的結構(在taskCreation pvParameters),所以你將指向相同的結構,在這種情況下保護數據,你可以寫過程中使用互斥變量(所以你在一個只知道1個任務時間可以訪問這個變量)。你也可以在全局變量選項中使用互斥鎖。