임베디드 코드 최적화 질문 드립니다.

idaga의 이미지

안녕하세요.

임베디드 코드 최적화 관련 질문이 있어 글을 올립니다.

현재 80Mh의 속도를 가진 16bit 마이컴을 사용하고 있습니다.

아래와 같은 코드가 있다고 가정할때

이중 for loop 실행시간이 약 150us 정도 발생하고 있습니다.

150us 어떻게 보면 정말 짧은 시간이지만.. 조금이라도 이 시간을 줄여야만 합니다.... 가능할지는 모르지만

절반 정도로 줄여야 하는데요..

코드 최적화를 시키고 싶은데.. 어떻게 하면 될지.. 고수 분들의 많은 답변 부탁드립니다.

감사합니다 ^^

signed char data[250];
unsigned char index;
signed int sum_data[10];
signed long temp_data;

index = 0;
temp_data = 0;

for(i=0;i<10 {
for(j=0; {
temp_data += data

    ;
    index++;
    }
    sum_data[i] = temp_data / 1000;
    }

    idaga의 이미지

    코드부분이 짤려있네요.. 글은 수정이 안되고..

    코드부분이 다시 올립니다.

    signed char data[250];
    unsigned char index;
    signed int sum_data[10];
    signed int temp_data;

    index = 0;
    temp_data = 0;

    for(i=0;i<10;i++)
    {
    for(j=0;j<25;j++)
    {
    temp_data += data

      ;
      index++;
      }
      sum_data[i] = temp_data / 1000;
      }

      라스코니의 이미지

      우선 for loop에 들어있는 연산 행위는 몇개가 있나 살펴 보면

      1. access data[j]
      2. temp_data += 값;
      3. index++;
      4. i++, j++ ==> ++i, ++j 로 수정

      이정도인데 3 번은 솔직히 필요없죠.

      loop 바깥으로 빼내고 index = sizeof(data) 하면 될듯...

      그러면 성능 25% 이상 달성할 듯요.

      라스코니의 이미지

      제 생각에

      i = 250;
      temp_data = 0

      while(i-- > 0) {
      temp_data += data[i];
      }

      이런 거는 어떨지....

      idaga의 이미지

      1

      shint의 이미지


      while(1)
      {
      if(i >= max) break;
      a[i+0] = a[i+0] + 1;
      a[i+1] = a[i+1] + 1;
      a[i+2] = a[i+2] + 1;
      i = i + 3;
      }

      이런 방식도 있다고 합니다.
      하나의 루프안에 여러 명령을 같이 처리할 수 있도록 합니다.

      ----------------------------------------------------------------------------
      젊음'은 모든것을 가능하게 만든다.

      매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
      정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

      각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

      simminjo의 이미지

      루프를 어셈블리어로 변경해보면 조건판단문이 들어갑니다.
      그리고, increment statement도 들어가죠.
      이런 명령어를 줄이면 가능하지 않을까 싶습니다.
      흔히 최적화시에 짧은 루프문은 풀어서 쓰기도 합니다. 윗분 말씀대로죠.

      250개를 다 풀어서 쓰기엔 너무 한듯하니,
      25개의 inner loop를 일단 다 풀어서 써보시는건 어떨지요? 25번에 해당하는 increment구문과, 조건판단문은 빠질테니까요...(컴파일러 최적화를 안했다는 전제입니다. )

      컴파일러 최적화시에는 위와같은 최적화는 옵션에따라 기본적으로 처리해줍니다.

      ---------------------------------------------------------------
      Opensource에 기여하는 것이 꿈입니다.
      내가 만든 코드를 모두가 사용할 때 까지~

      snowall의 이미지

      data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+...

      이렇게 바꾸는 거군요.

      진짜로 배열이 250개로 고정되어 있다면 성능을 위해서 250개를 다 써주는 것도 나쁘지 않아보이는데요

      피할 수 있을때 즐겨라! http://melotopia.net/b

      댓글 달기

      Filtered HTML

      • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
      • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
      • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
      • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
      댓글 첨부 파일
      이 댓글에 이미지나 파일을 업로드 합니다.
      파일 크기는 8 MB보다 작아야 합니다.
      허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
      CAPTCHA
      이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.