簡體   English   中英

Arduino / C ++ GlobalVars與局部變量

[英]Arduino/C++ GlobalVars vs Local variables

我現在正在研究Arduino項目。 它的作用基本上是這樣的:

  1. 從PC讀取串行數據
  2. 解析收到的數據
  3. 使用此數據在TFT屏幕上繪制。

我當前的方法大量使用全局變量。 沒有它們,我將不得不使用一些嵌套函數,這些函數將變量傳遞給3級深度。 這讓我開始思考哪種方法在性能上更好。 這是兩個例子。

首先本地:

void setup() {
  Serial.begin(9600);
  Serial.println(firstFunction(10));
}

int firstFunction(int val)
{
  return secondFunction(val+1);
}

int secondFunction(val)
{
  return thirdFunction(val+1);
}

int thirdFunction(val)
{
  return val + 1;
}

全球:

int x; //global var
void setup() {
  Serial.begin(9600);
  firstFunction(10);
  Serial.println(x);
}
void firstFunction(int val)
{
  x = val;
  x += 1;
  secondFunction();
}
void secondFunction()
{
  x++;
  thirdFunction();
}
void thirdFunction(val)
{
  x++;
}

在PC方面,通常不贊成使用全局變量。 但是我的理解是,這主要是出於樣式和可伸縮性的原因。

你們怎么想?

在我看來,最好采用樣式化以采用本地方法,在通常較小的Arduino程序上也是如此。 一旦擁有很多全局變量,就可以將它們放在一個結構中,並將該結構的地址傳遞給函數。

在設置功能中特別有用,設置完成后不再占用內存。 在您的版本中,x在程序有效期內仍會占用4個字節。 僅有2k的內存,您可以快速達到極限。

我會做這樣的事情:

typedef struct {
  int a, b;
} entity_t;

void foo(entity_t *e) { foo2(e); foo3(e); /* do stuff */ }

void setup()
{
  entity_t e = { 1, 2};

  foo(&e);

  Serial.println(e.a);
  // automatic memory of e is released
}

根據項目的復雜程度,這兩種方法都是可行的。

一個反對通過一堆函數調用將變量作為參數傳遞的考慮因素是,微芯片上的內存非常有限。 每個局部變量和每個函數參數都放在堆棧中,在這種情況下,堆棧上多次具有基本上相同的變量,這浪費了內存。 根據µC上的RAM數量,一旦開始使用字符串和要在運行時操作的其他較大結構,這可能會變得很麻煩。

如果您發現您的µC突然開始行為異常-崩潰,掛起,產生垃圾輸出等-可能是您正在將堆棧下溢到堆中,或者反過來。 如果首先嘗試避免不必要的變量副本,則這不太可能成為問題。

當然,根據程序的工作方式,情況可能相反:如果您必須具有某種狀態,則只需要跟蹤程序的某個部分,而無需在其中調用許多嵌套函數,最好將其保留在傳遞的局部變量中,因為從外部函數返回后,變量將再次消失。

從根本上說,根本的區別是全局變量始終存在並在程序運行的整個過程中都占據空間,而局部變量僅在創建它們的函數返回時才這樣做-但是函數參數就像函數的局部變量一樣,因此將變量傳遞給另一個函數會創建第二個副本。 因此,它總是有兩個方面。

但是,隨着復雜性的增加,我肯定會使用類(按其職責划分)以及成員或靜態變量以及相應的方法,而不僅僅是一堆全局變量。

這樣一來,您仍然可以將所有事物緊密地聯系在一起,而不僅僅是在全球空間中松散地徘徊,而且您不會浪費內存。

我認為添加引用不會增加任何開銷; 請記住,編譯器並不局限於將其實現為指針。 如果所有內容都在同一編譯單元中,則可能可以對其進行優化。 幾乎可以肯定的是,如果函數很小,則可以內聯。

如果設計允許,則使這些函數和變量屬於同一類的另一種可能性。

但歸根結底,封裝主要存在,因此,通過轉移程序員團隊,可以在一個月或幾十年的時間內維護復雜的項目。 如果只有一個小代碼,您將永遠看不到,那么就不必過多地與良好實踐聯系在一起。

暫無
暫無

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

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