2015-04-27 22 views
7

Tôi đang viết một hàm trên vi điều khiển 32-bit vỏ m4. Chức năng này phải có khả năng nhân các ma trận với các kích cỡ khác nhau mà tôi không thể dự đoán được. Vì vậy, tôi đã sử dụng một malloc ...vi điều khiển không thành công tại malloc

Nhưng tôi không hiểu tại sao mc tôi luôn luôn đi vào xử lý ngắt mặc định khi nó thực hiện dòng sau:

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

Đây có phải là mc không thể xử lý này loại hoạt động? Trong khi điều này hoạt động hoàn toàn tốt trên máy tính xách tay của tôi!

** EDIT *

đây bởi một số mã khác (mà vẫn cần phải được sửa đổi ...): Vâng tất cả malocs bất cứ nơi nào thất bại. Tôi không thể chỉ định bất kỳ giá trị nào cho mảng "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

có thể anh ta không hỗ trợ dấu chấm động? – Zelldon

+1

Cách tốt nhất để tách biệt vấn đề dấu chấm động như @Zelldon gợi ý. Điều gì sẽ xảy ra nếu bạn malloc (20) vào một int *? –

+2

Bạn có chắc chắn 100% đó là cuộc gọi malloc thất bại, và không phải một số mã sau nó?Afaik bạn nên phân bổ '3 * sizeof (double)' (ít nhất nếu tôi hiểu nó đúng - mã của bạn rất khó đọc do cách bạn sử dụng dấu cách) - đó có thể gấp đôi số byte là '3 * sizeof (double *) 'để bạn có thể truy cập dữ liệu giới hạn ở đâu đó – stijn

Trả lời

0

Có phải malloc() hoạt động tốt trong phần khác của mã này? Khi bạn đang lập trình một thiết bị nhúng, heap có thể chưa được khởi tạo đúng cách hoặc nó đã được khởi tạo cho một chức năng khác như tùy chỉnh malloc().

+0

Điều này thực sự là malloc duy nhất tôi sử dụng. Tôi không làm gì cả. Dưới đây là một ảnh chụp màn hình: http://imgur.com/JT5W5tK – LandonZeKepitelOfGreytBritn

+0

Vâng tất cả malocs bất cứ nơi nào thất bại. Tôi không thể chỉ định bất kỳ giá trị nào cho mảng "malloced". – LandonZeKepitelOfGreytBritn

+1

Bạn cần kiểm tra trình biên dịch/trình liên kết tài liệu để khởi tạo chính xác libc và/hoặc bạn heap. Nếu bạn có đủ RAM và không có chủ đề, một giải pháp đơn giản hơn nhiều là phân bổ một biến toàn cầu cho phân bổ lớn nhất có thể và sử dụng nó. – calandoa

0

Có hai loại hợp lệ triển khai trong C: tổ chứcfreestanding. Các chương trình được viết cho việc triển khai được lưu trữ có thể sử dụng bất kỳ tiêu đề thư viện chuẩn nào. Tuy nhiên, việc triển khai freestanding chỉ cần thiết để hỗ trợ <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, và <stdnoreturn.h>.

Nó không phải là hiếm đối với vi điều khiển để có hỗ trợ tối thiểu, vì vậy có lẽ trình biên dịch C của bạn (hoặc đúng hơn, thư viện chuẩn) không có hỗ trợ đầy đủ cho <stdlib.h> (và do đó malloc). Tuy nhiên, không biết biên dịch và thư viện chuẩn nào bạn đã chọn để sử dụng, đó chỉ là một phỏng đoán.

Cũng có thể, như các nhận xét cho câu hỏi của bạn đề xuất, một điều gì đó trước (và/hoặc sau) đoạn mã này là để đổ lỗi. Có lẽ bạn có thể sản xuất mcve?

Xin vui lòng bình luận bên dưới câu trả lời này khi bạn đã cập nhật để cung cấp thêm thông tin và tôi sẽ vui vẻ xây dựng để cung cấp thêm thông tin.

+0

Cảm ơn bạn đã trả lời. Tôi đang viết mã bằng cách sử dụng nhà soạn nhạc mã từ texas instrument 5.4.0.00091. Tôi đã chỉnh sửa câu hỏi của mình để cung cấp thêm một số mã. (độ cao là không có gì nghiêm ngặt hơn trước đó để những dòng) – LandonZeKepitelOfGreytBritn

0

Những gì bạn nhận được là ngoại lệ của bộ xử lý, không phải là gián đoạn. Chúng đều được ánh xạ tới cùng một trình xử lý, đó là một thực tế phổ biến. Tôi cho rằng bạn gặp lỗi phần cứng. Bạn có thể kiểm tra sổ đăng ký để xem điều gì gây ra ngoại lệ. Sử dụng this code làm tài liệu tham khảo để kiểm tra chúng. Nó có thể liên quan đến việc thực hiện libc nếu ngoại lệ xảy ra bên trong malloc.

Các vấn đề liên quan