[英]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.