Forum: Mikrocontroller und Digitale Elektronik RAM speicherverbrauch von int16 arrays im ESP8266


von Alt G. (altgr)


Lesenswert?

1
#define num_datasets 720
2
#define num_devices 6
3
4
struct wp
5
{
6
  int16_t power[num_devices];
7
  int8_t hour;
8
};
9
10
wp wp_arr[num_datasets];

Wieviel speicher braucht obige deklaration?
Bringt es etwas den array zu packen (pragma pack) ?

Wieviel ram stellt der esp8266 mit arduino für sowas bereit?

: Bearbeitet durch User
von Johnny B. (johnnyb)


Lesenswert?

Alt G. schrieb:
> Wieviel speicher braucht obige deklaration?

Ein sizeof() könnte Aufschluss geben.

https://learn.microsoft.com/de-de/cpp/c-language/sizeof-operator-c

: Bearbeitet durch User
von jro (Gast)


Lesenswert?

620 *(6*2+1) = 8060 Bytes

von jro (Gast)


Lesenswert?

...ups
720 *(6*2+1) = 9360

von Alt G. (altgr)


Lesenswert?

Johnny B. schrieb:
> Ein sizeof() könnte Aufschluss geben.

Size of array: 7200 bei 4 devices

TY

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Size of array: 7200 bei 4 devices

Stimmt mit dem Erwartungswert überein.

von Alt G. (altgr)


Lesenswert?

g457 schrieb:
>> Size of array: 7200 bei 4 devices
>
> Stimmt mit dem Erwartungswert überein.

Ja, wenn der int8 als int16 gezählt wird.
Ich hatte befurchtet der macht 32 bit alignment.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Alt G. schrieb:
> Ich hatte befurchtet der macht 32 bit alignment.

Üblicherweise entspricht das Alignment einer Struct dem maximalen 
Alignment der enthaltenen Datentypen.

> Ja, wenn der int8 als int16 gezählt wird.

Wird er nicht. Aber die Struct wird auf 16-Bit aligned, d.h. es wird 
dahinter ein Füllbyte alloziert.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Alt G. schrieb:
> Bringt es etwas den array zu packen (pragma pack) ?

Wenn der Compiler das unterstützt, sollte ein Byte weniger pro Element 
rauskommen. Wenn der Prozessor keinen misaligned access kann, geht das 
andererseits zu Lasten des Codes.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

(prx) A. K. schrieb:
> Wenn der Prozessor keinen misaligned access kann
Kein halbwegs aktueller Prozessor kann ein 16 oder 32-Bit-Wort auf einer 
ungeraden Adresse ablegen. Der Tensilica-Core des ESP8266 kann es auch 
nicht. Wenn man misaligned Zugriffe macht, dann muss das der Compiler 
erledigen und die zusammengeklaubten Fragemnte mit dem Funnelshifter und 
dem SAR Befehl zurechtrücken. Das macht viel Aufwand und den Code 
langsam.

von (prx) A. K. (prx)


Lesenswert?

Lothar M. schrieb:
> Kein halbwegs aktueller Prozessor kann ein 16 oder 32-Bit-Wort auf einer
> ungeraden Adresse ablegen.

Bei normalen Load/Store-Befehlen wird das von ARMv7 unterstützt, d.h. 
z.B. von den Cortex-M ab M2, und wohl auch von entsprechenden 32-Bit 
Cortex-A und Cortex-R.

https://developer.arm.com/documentation/ddi0406/c/Application-Level-Architecture/Application-Level-Memory-Model/Alignment-support/Unaligned-data-access

PS: Ebenso bei ARMv8, also den 64-Bittern.

https://developer.arm.com/documentation/den0024/a/An-Introduction-to-the-ARMv8-Instruction-Sets/The-ARMv8-instruction-sets/Addressing

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Interessanterweise gilt sogar bei der RISC-V "base integer ISA":
"Support for misaligned memory access is mandatory."

Ich hätte es bei RISC-V allerdings ebensowenig erwartet wie du, zumal 
als Grundvoraussetzung. Es wird aber ausdrücklich aufgeführt, dass dies 
ein Motiv für vereinfachte Subsets sein kann, die das nicht können.

Sowohl bei obigen ARMen, als auch hier, gilt das freilich nur für 08/15 
Datenzugriffe, nicht für besondere Befehle, nicht für Code und auch 
nicht für den Stackpointer. Es kann per Control-Register verboten 
werden, und von den Eigenschaften des adressierten Speicherbereichs 
abhängig sein.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.