임베디드 코드 최적화 질문 드립니다.
글쓴이: idaga / 작성시간: 일, 2013/09/01 - 1:21오전
안녕하세요.
임베디드 코드 최적화 관련 질문이 있어 글을 올립니다.
현재 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;
}
Forums:
코드부분이 짤려있네요.. 글은 수정이 안되고..
코드부분이 짤려있네요.. 글은 수정이 안되고..
코드부분이 다시 올립니다.
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에 들어있는 연산 행위는 몇개가
우선 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 =
제 생각에
i = 250;
temp_data = 0
while(i-- > 0) {
temp_data += data[i];
}
이런 거는 어떨지....
1
1
주워 듣기로는
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
..
루프를 어셈블리어로 변경해보면 조건판단문이 들어갑니다.
그리고, increment statement도 들어가죠.
이런 명령어를 줄이면 가능하지 않을까 싶습니다.
흔히 최적화시에 짧은 루프문은 풀어서 쓰기도 합니다. 윗분 말씀대로죠.
250개를 다 풀어서 쓰기엔 너무 한듯하니,
25개의 inner loop를 일단 다 풀어서 써보시는건 어떨지요? 25번에 해당하는 increment구문과, 조건판단문은 빠질테니까요...(컴파일러 최적화를 안했다는 전제입니다. )
컴파일러 최적화시에는 위와같은 최적화는 옵션에따라 기본적으로 처리해줍니다.
---------------------------------------------------------------
Opensource에 기여하는 것이 꿈입니다.
내가 만든 코드를 모두가 사용할 때 까지~
data[1]+data[2]+data[3]+data[
data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+...
이렇게 바꾸는 거군요.
진짜로 배열이 250개로 고정되어 있다면 성능을 위해서 250개를 다 써주는 것도 나쁘지 않아보이는데요
피할 수 있을때 즐겨라! http://melotopia.net/b
댓글 달기