2015-04-27 16 views
7

Piszę funkcję na 32-bitowym mikrokontrolerze cortex m4. Funkcja musi być w stanie rozmnażać macierze o różnych rozmiarach, których nie mogę przewidzieć. Więc muszę użyć malloc ...mikrokontroler kończy się niepowodzeniem w malloc

Ale nie rozumiem, dlaczego mój mc zawsze idzie w domyślnej procedury obsługi przerwania, gdy wykonuje następującą linię:

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

Czy to nie mc w stanie obsłużyć tego rodzaj operacji? Chociaż działa to doskonale na moim laptopie!

** EDIT *

tu trochę więcej kodu (który musi jeszcze zostać zmodyfikowany ...): Dobrze wszystkie malocs nigdzie nie powiedzie. Nie mogę przypisać żadnej wartości do tablicy "malloced".

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

Może on nie obsługuje zmiennoprzecinkowej? – Zelldon

+1

Najlepiej odizolować problem zmiennoprzecinkowych, jak sugeruje @Zelldon. Co się stanie, jeśli zdarzy ci się malloc (20) w int *? –

+2

Czy jesteś w 100% pewien, że wywołanie funkcji malloc nie działa, a nie jakiś kod po tym?Afaik powinieneś przydzielać '3 * sizeof (double)' (przynajmniej jeśli rozumiem to poprawnie - twój kod jest bardzo trudny do odczytania ze względu na sposób używania spacji) - to prawdopodobnie dwa razy więcej bajtów niż '3 * sizeof (double *) ', więc możesz uzyskać dostęp do danych poza granicami gdzieś – stijn

Odpowiedz

0

Czy malloc() działa poprawnie w innej części tego kodu? Podczas programowania urządzenia wbudowanego sterta może nie zostać poprawnie zainicjowana lub została zainicjowana dla innej niestandardowej funkcji.

+0

To jest właściwie jedyny malloc, którego używam. Nic nie zrobiłem dla kupy. Oto zrzut ekranu: http://imgur.com/JT5W5tK – LandonZeKepitelOfGreytBritn

+0

Cóż, wszystkie błędy w dowolnym miejscu kończą się niepowodzeniem. Nie mogę przypisać żadnej wartości do tablicy "malloced". – LandonZeKepitelOfGreytBritn

+1

Musisz sprawdzić dokumentację kompilatora/linkera, aby poprawnie zainicjować swoją stertę libc i/lub ciebie. Jeśli masz wystarczającą ilość pamięci RAM i brak wątków, znacznie prostszym rozwiązaniem jest przydzielenie zmiennej globalnej dla największej możliwej alokacji i użycie jej. – calandoa

0

Istnieją dwa ważne rodzaje implementacji w C: gospodarzem i wolnostojące. Programy napisane dla hostowanych implementacji mogą używać dowolnych standardowych nagłówków bibliotek. Jednak wolnostojące implementacje są wymagane jedynie do wspierania <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h> i <stdnoreturn.h>.

Nie jest niczym niezwykłym, że mikrokontrolery mają minimalną obsługę, więc być może Twój kompilator języka C (lub raczej standardowa biblioteka) nie ma pełnej obsługi dla <stdlib.h> (i stąd malloc). Jednak nie wiedząc, który kompilator i standardową bibliotekę wybrałeś, to tylko zgadnij.

Możliwe jest również, że, jak sugerują komentarze do twojego pytania, winę za ten fragment kodu należy uznać przed (i/lub później). Być może mógłbyś wyprodukować mcve?

Prosimy o komentarz pod tą odpowiedzią po zaktualizowaniu, aby podać więcej informacji, a ja z przyjemnością opracuję więcej informacji.

+0

Dziękuję za odpowiedź. Koduję za pomocą programu do kompozytu kodu z texas instrument 5.4.0.00091. Zmieniłem moje pytanie, aby podać więcej kodu. (choć w tych liniach nie ma nic więcej poza tym) – LandonZeKepitelOfGreytBritn

0

Otrzymano wyjątek procesora, a nie przerwanie. Wszystkie są mapowane do tego samego programu obsługi, co jest powszechną praktyką. Zakładam, że masz błąd sprzętowy. Możesz sprawdzić rejestry, aby zobaczyć, co spowodowało wyjątek. Użyj this code jako odniesienia do ich zbadania. Może to być związane z implementacją libc, jeśli wyjątek występuje wewnątrz malloc.