www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik system_stm32f10x.c: 2 C-Verständnisfragen


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mal 2 C-Verständnisfragen zum untenstehenden Code aus der 
system_stm32f10x.c:
1. Warum ist die (großgeschriebene???) Variable HSEStatus auch vom Typ 
uint32_t? uint8_t hätte hier doch eigentlich voll gelangt, somit 3 byte 
verschwendet?
2. Warum ist bei RCC->CR |= ((uint32_t)RCC_CR_HSEON); noch ein cast auf 
uint32_t? RCC_CR_HSEON ist doch im define schon als uint32_t definiert. 
Ich weiß, es schadet wohl auch nicht, nur wenn es einen Grund hat, würde 
ich es gerne wissen.
static void SetSysClockToHSE(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
.
.
.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 1: Bei einem ARM - wie bei vielen anderen 32-Bit Architekturen - 
verbrät eine lokale 8- oder 16-Bit Variable mehr Platz als eine 32-Bit 
Variable. Es läuft so oder so auf ein Register raus dessen ggf. 
verbleibender Rest nicht anderweitig verendet wird, aber bei weniger als 
32 Bits kommen Konvertierungen hinzu, die bei 32 Bits entfallen.

Optimierungsstrategien können also bei AVR und ARM sehr gegenläufig 
verlaufen. Weshalb es in stdint.h sowas wie int_fast8_t gibt, was bei 
ARM 32 Bits und bei AVR 8 Bits breit sein kann.

Autor: Robert Teufel (robertteufel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmals so einfach es geht. Der STM32 "spricht 32-bit", der AVR 
"spricht 8-bit". Fuer 16-bit bruahcne beide einen Dolmetscher, doch 
abwaerts geht's leichter.
Programme, die stark ueberwiegend 8-bit Verarbeitung machen werden 
wachsen wenn man sie auf 32-bit protiert. Programme, die viele 32-bit 
variablen oder Arithmetik benuetzen werden viel groesser, wenn man sie 
von 32-bit auch 8-bit portiert. Beide brauche Dolmetscher, Libraries, 
type-casting.....
Der Einfachheit halber bei STM32 die 32-bit variable benuetzen wenn's 
nicht total eng ist im Speicher

Gruss, Robert

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder was gelernt. Denn im Hitex Guide auf Seite 16 unter 2.3.6 
Unaligned Memory Accesses steht groß als dolles CM3-Feature, daß sich 
die 8-, 16- und 32 bit Variablen im Gegensatz zu z.B. "alten" Kernen 
lückenlos aneinanderschmiegen und so bis zu ca. 25 % SRAM sparen.
Oder ist das wieder der ewige Spagat: Laufzeit- oder 
Resourcenvorteilhaft programmieren, eine XOR-Verknüpfung ...?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem Beispiel stehen die Variablen nicht im Speicher, sondern in 
Registern. Und genau das macht den Unterschied aus. Wenn man eine 
Variable aus dem Speicher ins Register läd macht es bei ARM praktisch 
keinen Unterschied im Code, ob 8/16/32-Bit. Wenn sie jedoch vom Compiler 
von vorneherein im Register gehalten werden, dann sind sie bei unter 32 
Bits ineffizient.

Wobei dabei zwischen Cortex-M3 und klassischem ARM wenig Unterschied 
besteht, ausser dass Cortex-M3 Variablen im Speicher auch unaligned 
verarbeiten und somit Füllbytes einsparen kann. Darauf bezieht sich die 
Aussage von Hitex. Gratis ist das aber nicht, denn es kostet Zeit, daher 
wird man das eher selten finden, man muss es im Compiler extra 
hinschreiben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.