Compiler weirdness

algemene C code
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Compiler weirdness

Berichtdoor Koepel » 10 Mrt 2017, 10:23

Er zijn twee dingen met de compiler die ik niet logisch vind.

1 ) De -Os optimalisatie.
Bij de oude ATmega8 ging bij mij het gebruik van ram en code ongeveer gelijk op.
Bij de ATmega328P is het ram meestal sneller vol. Dat komt vaak door allerlei libraries aan mijn project toe te voegen.
Arduino zet de -Os optimalisatie aan, maar dat is alleen voor de kleinste code, en niet voor het minste ram gebruik :(
Natuurlijk wordt met -Os en -flto er minder ram gebruikt, dus het scheelt wel.
Voor microcontrollers zou het veel logischer zijn om een optie te hebben die het ram gebruik optimaliseert. Dat bestaat niet ? of kan dat niet ?

2 ) De switch-case heeft geen local scope binnen een case.
Binnen een "case" is er geen local scope omdat de verschillende "case" labels alleen maar labels zijn. Maar als ik een lokale tijdelijke variabele declareer, dan kan de compiler die toch tijdelijk aanmaken ? Ik heb dat nooit begrepen. Nu moet ik een workaround gaan maken binnen een "case" met '{' en '}'. Ligt het aan mij, of is dat inderdaad niet logisch ?

Misschien heb ik op dit forum anderen verteld dat die '{' en '}' binnen een "case" niet nodig zijn :oops: Nu kom ik er achter dat het soms wel nodig is. Of zal ik ze voortaan altijd gebruiken ?

Code: Alles selecteren
void setup()
{
  Serial.begin( 9600);
  Serial.setTimeout( 30000);
}

void loop()
{
  Serial.println( "Enter a number (1,2 or 3)");

  long x = Serial.parseInt();

  switch( x)
  {
  case 1:
    Serial.println( "1 entered");
    break;
  case 2:
    // Workaround for local scope !
    {                   
      Serial.println( "2 entered");
      int r = random( 0, 101);      // declare temporary variable inside local scope
      Serial.println( r);
    }
    break;
  case 3:
    Serial.println( "3 entered");
    break;
  }
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Compiler weirdness

Berichtdoor nicoverduin » 10 Mrt 2017, 10:59

Als je persé je ram tot het absolute minimum wilt brengen denk ik wel dat je een case hebt. Echter de GCC compiler is een veel breder platform waarbij ook dikke 32bits processoren zitten. En die hebben al meer RAM geheugen. En op het moment dat developers naar Linux gaan hebben ze allang afgehaakt om zich druk te maken over RAM... Wat overigens iets zegt over de ontwikkelaar...
Maar het is wel grappig. Vroegah maakten wij ons al druk over RAM op het mainframe...... Die toch wel 50mB aan schijfruimte had en 1Mb geheugen :)
De optimalisaties stammen meer uit het verleden vermoed ik waarbij code size belangrijker was..... CP/M ed...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Compiler weirdness

Berichtdoor Koepel » 10 Mrt 2017, 13:27

Daar komt nog bij dat volgens mij de 32 werk-registers niet alle 32 goed benut worden (gcc compiler voor een Arduino Uno).

Mijn HighWaterMark komt nu goed van pas.
https://gist.github.com/Koepel/abbc770424ac4372614df83526fbfd98

Wanneer ik kan inschatten hoeveel heap er gebruikt wordt en hoeveel stack ruimte ik maximaal nodig heb, dan kan ik best ver gaan.

Voorbeeld project:
Arduino IDE zegt voor Arduino Uno: "Globale variabelen gebruiken 1642 bytes (80%) van het dynamisch geheugen. Resteren 406 bytes voor lokale variabelen. Maximum is 2048 bytes".
freeRam (de onderste van hier: http://playground.arduino.cc/Code/AvailableMemory) zegt: "327 bytes free".
De HighWaterMark zegt: "180 bytes not used".
Dus ik durf nog wel 100 bytes te declareren :geek:

De ATSAMD21G Cortex-M0+ (in de Arduino Zero en M0) vind ik een goede opvolger van de ATmega328P. Maar ja, soms wil ik (te) veel in een Arduino Uno stoppen :lol:
Bijlagen
weinig-geheugen.png
weinig-geheugen.png (10.19 KiB) 4198 keer bekeken

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Compiler weirdness

Berichtdoor nicoverduin » 10 Mrt 2017, 13:48

Je moet al naar de disassembly om al het gealloceerd geheugen te bepalen. Dus de segmenten .data en de .bss. En freeram houdt ook het dynamisch gebruik bij en dat doet de compiler niet. Dus die mis je zondermeer. Ik zou zelf eerder voor de stm32 nucleous bordengaan. M0 arm is alweer te klein....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Compiler weirdness

Berichtdoor Koepel » 11 Mrt 2017, 09:39

Een STM32 kan erg goedkoop zijn: https://www.aliexpress.com/item/1pcs-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-arduino/32720697607.html
Maar ik geef de voorkeur aan jarenlange officiële support van Arduino. Daarom probeer ik voorlopig eerst de M0+ processor. Een paard heeft soms even tijd nodig om te wennen aan een nieuwe stal :lol:
Dit jaar wil ik een aantal dingen maken, dat zijn allemaal kleine projectjes voor ATmega microcontrollers.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Compiler weirdness

Berichtdoor nicoverduin » 11 Mrt 2017, 10:29

Dat klopt maar daar kan je geen shield op prikken. De nucleous wel
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten