1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
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?
|
Anzeige
|
RAM speicherverbrauch von int16 arrays im ESP8266
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? 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
Gast
#7238883
620 *(6*2+1) = 8060 Bytes
Gast
#7238884
...ups 720 *(6*2+1) = 9360 Johnny B. schrieb: > Ein sizeof() könnte Aufschluss geben. Size of array: 7200 bei 4 devices TY
Gast
#7238889
> Size of array: 7200 bei 4 devices
Stimmt mit dem Erwartungswert überein.
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. 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. 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. (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. 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 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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|