簡體   English   中英

C 中的函數 vs 隊列 vs 全局變量

[英]Functions vs Queues vs Global Variables in C

這個問題更多的是關於您認為對於運行 C 和 RTOS 的嵌入式系統最有效的方法。

我有一個任務,每個時期只更新一個變量。 此變量用於程序中的其他任務:

任務A.c

int someVar = 0

void TaskFunc(void) {
    updateVar(someVar);
}

應用程序中的其他任務沒有被阻塞等待這個變量,所以這告訴我 FreeRTOS 隊列可能比需要的多。 它更像是一個全局變量,例如閱讀時間。

所以另一個選擇是在 header 文件中為這個變量添加一個外部變量。

任務A.h

extern int someVar;

我猶豫要不要這樣做,因為通常不建議使用全局變量。 那么如果我添加了一個 function 並且它是全局的呢?

因此TaskA.c將更改為:

static int someVar;

void TaskFunc(void) {
    updateVar(someVar);
}

void readVar(int *reader){
    *reader = someVar;
}

TaskA.h

void readVar(int *reader);

然后我可以從程序中運行的任何其他任務調用 readVar 來讀取 TaskA.c 中的 static 變量。 與僅返回 someVar 相比,此處使用指針是否弊大於利?

有沒有我沒有看到的缺點,或者我只是想多了? 特別要求嵌入式系統在這種情況下是否有所作為。

感謝反饋!

這個問題更多地是關於您認為對於使用 RTOS 運行 C 的嵌入式系統最有效的方法。

好吧,我認為我們不應該在這里發表意見,所以我實際上會盡力不發表意見。

我對這樣做很猶豫,因為通常不建議使用全局變量

我也會,因為有這種需求通常是無法正確封裝數據。 但是如果你有充分的理由做這樣的事情,那么一定要去做。

與僅返回 someVar 相比,在此處使用指針是否弊大於利?

您可以像評論中指出的那樣返回someVar (沒有雙關語)。

int readVar(void){
    return someVar;
}

然后做int reader = readVar();

但是對於你所做的:

void readVar(int *reader){
    *reader = someVar;
}

需要指針。 C 通過值而不是引用傳遞所以如果你只是傳遞int reader你傳遞的是reader值的副本所以reader = someVar; 將修改副本的值。 您的代碼所做的是為reader傳遞內存位置值的副本,然后將someVar的值寫入該內存位置。

是否有我沒有看到的缺點,或者我只是想多了?

我認為您批判性地思考這樣的設計選擇沒有任何問題。 您沒有列出這種方法的任何缺點,因此我們很難判斷您沒有看到什么。 此外,我們缺乏關於您的特定嵌入式系統的關鍵上下文。 總的來說,總的來說,我會說實現適當的數據封裝是一個很好的設計選擇。

您可以使用 taskENTER_CRITICAL()/taskEXIT_CRITICAL 使其在讀取或寫入全局變量時安全。 就我而言,我總是嘗試用隊列來解決它。 您也可以在任務 1(非全局)中創建 Var1,獲取其指針(Var1),然后使用隊列將此指針傳遞給 Task2。 通過這種方式,您可以在 Task2 中讀取 Var1 (但同樣不要忘記將其設為 Atomic,如果您不會在 IRQ 中讀取或寫入 vTaskSuspendAll/xTaskResumeAll() 就足夠了)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM