JA(EOGH) Q&A Carroty

메모리 부족 문제 메모리 늘리는법 질문

풀등 2018. 8. 17. 11:50



메모리 부족 문제 메모리 늘리는법 질문|자유 게시판
2017.11.29. 12:21

u8 TEST[3][204]={0,};  배열 크기를 다음과 같이 잡으면


다음과 같음 오류가 납니다.


u8 TEST[3][104]={0,};  다음과같이 줄이면 오류가 나지 않습니다. (이 배열은 선언만 한것이 아닌실제 연산하며 동작중인 배열 입니다.)  MCU의 메모리 가 부족해서 그러는것인가요? 아니면 자료형 때문에 문제가 되는 건가요?(자료형때문이라면 int로 바꾸기에는 무리가 있습니다) 크기를 u8 TEST[3][204]로 늘릴수 있는 방법은 무엇이 있을까요?

혹시 메모리 용량 문제라면 메모리를 사용자가 할당해서 늘릴수도 있나요?


툴은 ATMEL STUDIO를 쓰고 있습니다.


MCU는 ATmega164A를 쓰고 있습니다.  

  • 이전에 쓴 글하고 연계해서 답글을 답니다.
    1. 세개의 기기의 결과값을 위 어레이에 ascii로 저장할 필요없습니다.
    바이너리 값으로 한바이트(값)만 넣으면 기기당 20 바이트,
    20 x 3개의 기기 = 60 바이트이면 됩니다.
    2. 저장한 TEST 값을 시리얼로 보낼때 ascii로 보내면 됩니다.

    u8 TEST[3][20]; // 이미 array의 위치가 데이타 위치를 의미하므로 쌍으로 넣을 필요없음, value만저장

    for(num = 0 ; num < 3 ; num ++)
    for( i = 0 ; i < 20 ; i ++)
    {
    char string[10];
    sprintf(string,"(%d)[%d],",i, TEST[num][i]);
    uart출력
    }

  • 프로필
    eogh작성자
    2017.11.29. 14:21답글

    신고

    답변 감사합니다^^ (%02d)[%03d],이것의 값은 총 10 바이트 이잖아요 
    이 10바이트를 1바이트에 저장할수 있다는 말씀이신가요? 그럼 u8 TEST[3][104]={0,}; 값을
    u8 TEST[3][20]={0,};으로 바꿔서 진행해도 된다는 말씀이신가요?



  • eogh 위 char string[10] => string[12] 정도 늘려야 하구요
    값은 binary로 가지고 있고 uart로 보낼때 한 기기이 한 데이타분량만 ascii string으로 바꿔서
    보내기를 반복하면 된다는 드ㄸㅆ입니다.
    u8 TEST[3][20];
    이것만 잡혀 있어도 되구요..
    각 기기의 값을 TEST[x][y]에 저장해야죠..

    또한

    만약 TEST라는게 단순 출력을 위해 필요한 공간이었다면
    이 조차도 필요없습니다.
    TEST에 옮기는 원래 위치에 저장된 걸 string으로 바꿔서 바로 보내도 됩니다.


  • 임베디드홀릭 이미 코드에 char sensor[60];
    이게 있잖아요?
    j = 1;
    for( i = 0 ; i < 60 ; i ++)
    {
    char buf[16];
    sprintf(buf,"(%d),[%d],",j++,sensor[i]);
    if(j > 20) j = 1;
    tx_data0(buf,strlen(buf));
    }
    tx_data0("\r\n",2); // LF+CR

  • 프로필
    eogh작성자
    2017.11.29. 21:43답글

    신고

    임베디드홀릭 오늘 모두 해결했습니다.감사합니다^^

  • 2017.11.29. 12:43답글

    신고

    1. 메모리 확보
    컴파일시 생성된 전체 map 파일(메모리 할당 결과)을 보고 뭘 더 줄여야 612바이트 이상이 확보될지 확인해보시고요.

    2. 구조변경
    정말 그렇게 메모리를 확보할 필요가 있는가? 하는 문제는 별도의 문제죠. 인베디드홀릭님 글 참조하시고, 그런 형태로 프로그램의 구조나 동작 형태를 변경하면 무리해서 메모리 확보를 하지 않아도 되는 방법이 존재합니다.