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!