ุชุฎุตูŠุต ุฐุงูƒุฑุฉ ุซุงุจุชุฉ ููŠ ู…ูŠูƒุฑูˆูƒู†ุชุฑูˆู„ุฑ

ู‡ูˆู„ู…ุฒ: ุนุฒูŠุฒูŠ ุŒ ู„ุง ุชู‚ู„ ู„ูŠ ุฃูŠู† ู†ุญู†ุŸ
ุงู„ุฑุงุนูŠ: ุฃู†ุช ููŠ ุจุงู„ูˆู† !!!
ู‡ูˆู„ู…ุฒ: ูŠุฌุจ ุฃู† ุชูƒูˆู† ู…ุจุฑู…ุฌู‹ุง.
ุงู„ุฑุงุนูŠ: ู†ุนู… ุŒ ู„ูƒู† ูƒูŠู ุฎู…ู†ุชุŸ
ู‡ูˆู„ู…ุฒ: ูู‚ุท ู…ุจุฑู…ุฌ ูŠู…ูƒู† ุฃู† ูŠุนุทูŠ ู…ุซู„ ู‡ุฐู‡ ุฏู‚ูŠู‚ุฉ ูˆ
ู…ุน ู‡ุฐู‡ ุงู„ุฅุฌุงุจุฉ ุนุฏูŠู…ุฉ ุงู„ูุงุฆุฏุฉ.

... ู…ู‚ุชุทูุงุช ู…ู† ู†ูƒุชุฉ ู…ุดู‡ูˆุฑุฉ


ุฅุฐุง ุณุจู‚ ู„ูƒ ุฃู† ู‚ู…ุช ุจุจุฑู…ุฌุฉ ู…ุชุญูƒู… ุฏู‚ูŠู‚ ุŒ ูู„ุง ูŠู‡ู… ุงุณุชุฎุฏุงู… Arduino IDE ุฃูˆ ุงู„ุนู…ู„ ู…ุจุงุดุฑุฉ ู…ุน ู…ุชุฑุฌู… AVR ุŒ ARM ุŒ ุฃูˆ ESP ุŒ ูˆุฑุจู…ุง ุดุงู‡ุฏุช ุชู‚ุงุฑูŠุฑ ุฅูƒู…ุงู„ ุงู„ุจู†ุงุก ู…ุซู„

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/ar459028/


All Articles