Konsultowałem to z kolegą z pracy. Twierdzi, że jeśli zmienna jest jednocześnie definiowana i inicjalizowana np.. instrukcją:
const uint8_t x = 5;
To wówczas będzie tworzona we flashu. Później jak trafimy na instrukcję przepisania :
uint8_t y = x;
to procek ładuje tą stałą z pamięci flash do rejestru a następnie z rejestru do RAMu pod adres przydzielony pod zmienną y.
To przeczy temu co pisze kolega w ostatnim poście.
Na dowód tego przytaczam również podstawową wiedzę dot. przechowywania "stringów". Wyczytałem że aby nie zajmować zbyt dużo RAMu powinno się tworzyć stringi jako const bo wówczas właśnie będą umieszczone we flashu a nie w RAMie. W ramie będzie umieszczony jedynie wskaźnik w trakcie gdy potrzebujemy pobrać "zawartość tego stringa":
const char str[] = "Ala ma kota.";
Generalnie to pisze kolega że "nie da się w prosty sposób zapisywać do flasha" - a ja chciałbym się do tego odnieść w taki sposób że my przecież nie chcemy nic "zapisywać" do flasha w trakcie działania programu ponieważ jest to niemodyfikowalna stała.
Będzie raczej tak że podczas kompilacji wygenerowana zostaje binarka którą programujemy ten flash a która to zawiera już "zahardcodowaną" wartość tej stałej.
Chciałbym się generalnie dowiedzieć czy zawsze stałe definiowane oczywiście z const zostaną umieszczone we flashu, ewentualnie kiedy nie tam, tylko w ramie. No bo rzeczywiście co się stanie w przypadku gdy będzie tak :
const uint8_t x;
void fun1()
{
x = 5;
}
void fun2()
{
x = 10;
}
że w czasie działania programu może wystąpić wywołanie jednorazowo tylko jednej z tych dwóch funkcji ale od tego której to wynika bezpośrednio z działania programu i jest nieprzewidywalne. Wówczas może być tak że stała x będzie umieszczona w ramie na skutek tego że jak pisze kolega "nie da się w prosty sposób zapisywać do flasha".
Zresztą co kolega ma na myśli pisząc że "nie da się w prosty sposób zapisywać do flasha" ? Czy mógłby kolega rozwinąć tą sentencję ?
Oraz czy taki kod z dwoma funkcjami inicjalizującymi stałą różną od siebie wartością się skompiluje czy nie ?