2015-04-27 3 views
7

Ich schreibe eine Funktion auf einem 32-Bit-Cortex-M4-Mikrocontroller. Die Funktion muss in der Lage sein, Matrizen unterschiedlicher Größe zu multiplizieren, was ich nicht vorhersagen kann. So habe ich eine malloc verwenden ...Mikrocontroller schlägt bei malloc

Aber ich verstehe nicht, warum mein mc immer in Interrupt-Standard-Handler geht, wenn sie folgende Zeile ausführt:

double *output2=NULL; 
output2 = malloc(3 *1* sizeof(double *)); 

Ist das nicht in der Lage mc zu handhaben Art der Operationen? Während das auf meinem Laptop einwandfrei funktioniert!

** EDIT *

Hier von etwas mehr Code (die noch geändert werden muss ...): Nun alle malocs überall scheitern. Ich kann keinem "Malloced" -Array einen Wert zuweisen.

int main (void) 
{ 

    /*some stuff*/ 

    float transFRotMatrix[3][3]={0}; //array gets modified by other functions 
    float sunMeasurements[3][1] = {{1},{2},{3}}; //test values 

     multiplyMatrices(&transFRotMatrix[0][0],3, 3, &sunMeasurements[0][0], 3, 1, *orbitalSunVector); 

    /*some stuff*/ 
} 

void multiplyMatrices(float *transposedMatrix, int height1, int width1, float *iSunVector,int height2, int width2, float *orbitalSunVector) 
{ 

    int y=0; 
    int x = 0; 
    int row=0; 
    int column =0; 
    int k=0; 
    int k2 = 0; 
    float result = 0; 

    int i=0; 
    int j=0; 
    int t=0; 

    float rotationMatrix[3][3]={0}; 

    i=0; 
    k=0; 
    k2 = 0; 


    if(width1 != height2) 
    { 
     printf("unmatching matrices, error.\n\n"); 
     return; 
    } 

    float *output2; 

    output2 = malloc(3 *1* sizeof(float *)); //<-----ERROR 


    while(k<width1) //aantal rijen 1ste matrix 
    { 
     for(j=0;j<height2;j++) //aantal rijen 2de matrix 
     { 
      result += (*((transposedMatrix+k*width1)+j)) * (*((iSunVector+j*width2)+k2)); //1ste var:aantal kolommen 2de matrix --2de variabele na de plus = aantal kolommen 2de matrix 
      //printf("%f * %f\t + ", (*((transposedMatrix+k*width1)+j)), (*((iSunVector+j*width2)+k2))); 
     } 

     output2[k*3 +k2] = result; //<-----FAILS HERE 


     k2++; 
     x++; 
     column++; 

     if(x==width2) 
     { 
      k2=0; 
      x=0; 
      column=0; 
      row++; 
      y++; 
      k++; 

     } 
     result = 0; 

    } 

    for(i=0;i<height1;i++) 
    { 
     for(j=0;j<width2;j++) 
     { 
      orbitalSunVector[j * height1 + i] = output2[i*3 +j]; 
     } 
    } 
    free(output2); 
} 
+0

vielleicht unterstützt er nicht Fließkomma? – Zelldon

+1

Am besten isolieren Sie das Fließkomma-Problem wie es @Zelldon vorschlägt. Was passiert wenn du malloc (20) in ein int * machst? –

+2

Sind Sie 100% sicher, dass es der Malloc-Aufruf ist, der fehlschlägt, und nicht irgendein Code danach?Afaik sollten Sie '3 * sizeof (double)' zuweisen (zumindest wenn ich es richtig verstehe - Ihr Code ist sehr schwer zu lesen aufgrund der Art, wie Sie Leerzeichen verwenden) - das ist wahrscheinlich doppelt so viele Bytes wie '3 * sizeof (double *) ', damit Sie irgendwo außerhalb der Grenzen auf Daten zugreifen können. – stijn

Antwort

0

Funktioniert die malloc() in einem anderen Teil dieses Codes? Wenn Sie ein eingebettetes Gerät programmieren, wurde der Heap möglicherweise nicht ordnungsgemäß initialisiert oder für eine andere benutzerdefinierte malloc()-ähnliche Funktion initialisiert.

+0

Dies ist eigentlich das einzige Malloc, das ich benutze. Ich habe nichts für den Haufen getan. Hier ein Screenshot: http://imgur.com/JT5W5tK – LandonZeKepitelOfGreytBritn

+0

Nun, alle malocs überall scheitern. Ich kann keinem "Malloced" -Array einen Wert zuweisen. – LandonZeKepitelOfGreytBritn

+1

Sie müssen Ihren Compiler/Linker doc überprüfen, um Ihre libc und/oder Ihren Heap ordnungsgemäß zu initialisieren. Wenn Sie genügend RAM und keine Threads haben, ist es eine viel einfachere Lösung, eine globale Variable für die größtmögliche Zuweisung zuzuweisen und sie zu verwenden. – calandoa

0

Es gibt zwei gültige Arten von Implementierungen in C: gehostet und freistehend. Programme, die für gehostete Implementierungen geschrieben wurden, können einen beliebigen Header der Standardbibliothek verwenden. Allerdings sind freistehende Implementierungen nur <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h> und <stdnoreturn.h> zur Unterstützung erforderlich.

Es ist nicht ungewöhnlich, dass Mikrocontroller nur minimale Unterstützung haben. Daher kann Ihr C-Compiler (oder besser: die Standardbibliothek) <stdlib.h> (und damit malloc) nicht vollständig unterstützen. Ohne zu wissen, welchen Compiler und welche Standardbibliothek Sie verwenden möchten, ist das nur eine Vermutung.

Es ist auch möglich, dass, wie die Kommentare für Ihre Frage vorschlagen, etwas vor (und/oder nach) diesem Stück Code schuld ist. Vielleicht könnten Sie eine mcve produzieren?

Bitte fühlen Sie sich frei, unter dieser Antwort zu kommentieren, wenn Sie aktualisiert haben, um mehr Informationen zu geben, und ich werde glücklich erarbeiten, um mehr Informationen zur Verfügung zu stellen.

+0

Vielen Dank für Ihre Antwort. Ich kodiere mit Code-Composer-Studio von Texas Instruments 5.4.0.00091. Ich habe meine Frage bearbeitet, um mehr Code zur Verfügung zu stellen. (obwohl es zu diesen Zeilen absolut nichts mehr gibt) – LandonZeKepitelOfGreytBritn

0

Was Sie erhalten haben, war eine Prozessorausnahme, kein Interrupt. Sie sind alle demselben Handler zugeordnet, was eine gängige Praxis ist. Ich nehme an, dass Sie Hardwarefehler haben. Sie können die Register überprüfen, um zu sehen, was die Ausnahme verursacht hat. Verwenden Sie this code als Referenz, um sie zu untersuchen. Es könnte mit der libc-Implementierung zusammenhängen, wenn die Ausnahme innerhalb von malloc auftritt.