Alokasi memori statis dalam mikrokontroler

Holmes: Sayangku, jangan katakan di mana kita berada?
Shepherd: Anda berada di dalam balon !!!
Holmes: Anda harus menjadi seorang programmer.
Gembala: Ya, tetapi bagaimana Anda bisa menebak?
Holmes: Hanya seorang programmer yang bisa memberikan informasi yang akurat dan tepat
dengan jawaban yang tidak berguna.

... kutipan dari lelucon terkenal


Jika Anda pernah memprogram untuk mikrokontroler, tidak masalah menggunakan Arduino IDE atau bekerja langsung dengan kompiler untuk AVR, ARM, atau ESP, Anda mungkin melihat laporan penyelesaian pembangunan seperti

Sketch uses 1,090 bytes (3%) of program storage space. Maximum is 30,720 bytes.
Global variables use 21 bytes (1%) of dynamic memory, leaving 2,027 bytes for local variables. Maximum is 2,048 bytes.



 text data   bss   dec  hex filename
52136 1148 12076 65360 ff50 MyProject

โ€ฆ , . , , . new malloc . . , .

, . , . โ€“ .

( โ€“ , C++). .


, 3 :

  • โ€“ : ,
  • (heap) โ€“ , ( ) . malloc new
  • โ€“ , .

. Arduino IDE Arduino Nano.

( ). , .

Global variables use 21 bytes (1%) of dynamic memory, leaving 2,027 bytes for local variables. Maximum is 2,048 bytes.

.

int * buf;
void setup()
{
  buf = new int[3000];
}
void loop() {}

. , . , . , , , . . ?

, , ! , 2, 3000 2 . . , , - . , โ€ฆ , .

? . , , . ?

.

int buf[300];
 
void setup()
{
  buf[0] = 1; //Avoid optimizing this array
}
 
void loop()
{
}

300*2=600 , . , , objdump (, , Arduino IDE )

cd C:\Users\GrafAlex\AppData\Local\Temp\arduino_build_55567
"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avr-objdump.exe" -x -D -S -s StaticMem.ino.elf
โ€ฆ
00800100 l 	O .bss      	00000258 buf
โ€ฆ

0x00800100 , , 0x258 (600 ).

3000 . ยซยป

Sketch uses 456 bytes (1%) of program storage space. Maximum is 30,720 bytes.
Global variables use 6,009 bytes (293%) of dynamic memory, leaving -3,961 bytes for local variables. Maximum is 2,048 bytes.
...
Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.

, โ€“ , .

, . , , . , โ€“ , /, . , ( ).


// static. โ€“ cpp .

static int buf[300];
 
void setup()
{
  buf[0] = 1; //Avoid optimizing this array
}

cpp , extern, .

extern int buf[300];

void foo()
{
    buf[0]++;
}

, buf

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:47: undefined reference to `buf'

buf static, cpp !

static int buf[300];

void foo()
{
    buf[0]++;
}

objdump

0080036a l     O .bss	00000258 _ZL3buf.lto_priv.12
00800112 l     O .bss	00000258 _ZL3buf.lto_priv.13

namespace


namespace , . .

namespace
{
int buf[300];
}


.

class A
{
    static int buf[300];
public:
    int * getBuf()
    {
        return buf;
    }
};

int A::buf[300];
 
void setup() {}

void loop()
{
    A a;
    a.getBuf()[0] += 1;
}

, A ( , loop()), . , .

00800100 l     O .bss	00000258 A::buf


, , .

int getCounter()
{
    static int counter = 0;
    return ++counter;
}

void setup() 
{
    Serial.begin(9600);
}

void loop()
{
    Serial.println(getCounter());
}

counter . getCounter(),

00800116 l     O .bss	00000002 getCounter()::counter

( ) , ยซยป โ€” getCounter() .

.

int * getBuf()
{
  static int buf[300];
  return buf;
}

C++ , buf getBuf(), , .bss ( , ).

int * getBuf()
{
  static int buf[300] = {1, 2, 3};
  return buf;
}

, 600 , .

class Buf
{
public:
  int buf[300];
 
  Buf(int v)
  {
	buf[1] = v;
  }
};
 
int * getBuf()
{
  static Buf buf(1234);
  return buf.buf;
}

, - getBuf(). AVR (ATMega) , . , .. , getBuf(), .

ARM (, STM32) . 60 . , ARM ++ ( getBuf()).

, , ? undefined behavior, g++ recursive_init_error. , , . ( 60), .

โ€“ -fno-threadsafe-statics, , , .


, โ€” , . , .

class Singleton
{
    int buf[300];

public:
    static Singleton & getInstance()
    {
        static Singleton instance;
        return instance;
    }
    
    int * getBuf()
    {
        return buf;    
    }
};

void setup() 
{
    Serial.begin(9600);
    Singleton::getInstance().getBuf()[42] = 10;
}

void loop()
{
    Serial.println(Singleton::getInstance().getBuf()[42]);
}

โ€” , . , / // . .

00800116 l     O .bss	00000258 Singleton::getInstance()::instance

, buf . instance, . objdump . Singleton buf , objdump .

, . .


, , . ARM (STM32, nRF, NXP) ESP8266 ( ยซยป ). AVR ( Arduino ), 1-4. MCS51, .

(new, malloc), ( STM Cube, Arduino), , .

, . , .

. . , .

, . , .

. . .

UPD: FreeRTOS

Source: https://habr.com/ru/post/id459028/


All Articles