Forum: Compiler & IDEs LPC1111/101 LPC Xpresso optimierungen gehen nicht


von Michael B. (bubi)


Lesenswert?

Hallo!

ich habe eine Frage bezüglich des Compilers für den Cortex M0 von NXP.

Ich habe eine Software geschrieben auf einen LPC1114 die lief dort 
eigentlich einwandfrei.Mittlerweile ist das Board gestorben und ich hab 
die Software auf die eigentliche Zielplatform portiert. Leider habe ich 
dabei vollkommen übersehn das der Speicher knapp nicht reicht...sobald 
ich die Optimierung (egal welche, am liebsten -Os) aktiviere läuft das 
nichtmehr, bzw genau 1mal durch die while(1) und dann ist es vorbei, 
laut Debugger steht es am Ende von main()
1
int main (void){
2
3
4
  float acc_x, acc_z, gyro_x;
5
  float acc_angle,kal_angle;
6
7
  /* Init Systick to 1ms */
8
  SysTick_Config( SystemCoreClock / 1000);
9
10
  /* Initialize GPIO (sets up clock) */
11
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
12
  SERVO_init();
13
14
15
  if(I2CInit(I2CMASTER) == FALSE){
16
    while(1);  /* fatal error */
17
  }
18
19
  if(MPU6050_init()){
20
    return 0;
21
  }
22
23
  MPU6050_setZero();
24
25
  kalman_init();
26
27
  while(1){
28
29
    /* 100Hz loop */
30
    if(gSysTick_10 >= 9){
31
      gSysTick_10 = 0;
32
33
      /* get sensor values */
34
      gyro_x   =   MPU6050_getGyroRoll_degree();
35
      acc_x   =      -MPU6050_getAccel_x();
36
      acc_z   =   MPU6050_getAccel_z();
37
38
      /* acc angle */
39
      acc_angle = atan2(acc_x , -acc_z) * 180/3.14159 ; // calculate accel angle
40
41
      kal_angle = kalman_update(acc_angle,gyro_x, 0.0093);
42
43
      //SERVO_set_slew((-kal_angle) - MECH_OFFSET);
44
      SERVO_set_slew(acc_angle++);
45
    }
46
  }
47
}

(SERVO_set_slew(acc_angle++); ist für Debugzwecke um zu sehen ob der 
Code läuft)
der Code ist generell nicht so groß, nur durch die Kalman, atan2 und 
float schießt der Speicherbedarf halt in die Höhe. Gerade für die 
Standardbibliotheken hat -Os immer viel gebracht...funktioniert hier nur 
nicht...Hat jemand Erfahrungen mit dem gcc für M0 in dem Bereich?

Vielen Dank fürs lesen!

von Andreas B. (andreas_b77)


Lesenswert?

Michael B. schrieb:
> laut Debugger steht es am Ende von main()

Oder es "steht" in der while-Endlosschleife und tut nichts mehr weil 
gSysTick_10 nie mehr >= 9 wird. Schließlich steht gleich als erstes nach 
der Abfrage des Wertes gSysTick_10 = 0 und aus Sicht des Compilers wird 
das vermutlich nirgends geändert. Also ist die Optimierung "1 Durchlauf, 
dann in Endlosschleife auf das Ende der Welt warten" wohl korrekt.

Mit anderen Worten: Zeig den Rest vom Programm.

von Michael B. (bubi)


Lesenswert?

Ups vergessen:
1
#include "driver_config.h"
2
#include "target_config.h"
3
4
#include "i2c.h"
5
#include "type.h"
6
7
8
#include "servo.h"
9
#include "mpu6050.h"
10
#include "kalman.h"
11
12
#include <math.h>
13
14
volatile uint8_t gSysTick_10 = 0;
15
16
17
void SysTick_Handler(void){
18
  gSysTick_10++;
19
}

also auch nicht der typische volatile fehler den ich zuerst vermutet 
hab...

Das Gute ist jetzt aber, dass es geht. Nur warum weiß ich nicht.
In der Nacht habe ich aufeinmal -O1 zum laufen bekommen, nachdem ich in 
den Projekteinstellungen rumgespielt habe, leider weiß ich auf Grund von 
Müdigkeit nicht welche es letzendlich ausgelöst hat. Hab das parallel 
gemacht zu einem Toolchain Update...mit dem gehen komplett alle 
Optimierungsstufen einwandfrei. Ein komplett frisches Programm 
funktionierte übrigens auch auf der alten Toolchain :/

Danke für die Hilfe auf alle Fälle!

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.