안녕하세요.

 

 

최근에 엄청난 속도 최적화를 해야 될 일이 있어서 몇달간 고생을 조금 하였습니다.

 

STM32H7 하에서 이루어진 작업이므로 모든 프로젝트에 적용하기는 어렵습니다만,

거의 공통적인 부분이라 ARM 계열은 최소한 비슷하리라 생각됩니다.

 

너무 뻔한 내용일 수도 있으니 병아리들만 보셔도 좋습니다.

 

일단 어떤 기법보다 확인하는 툴이 중요하겠지요.

 

[Tool]

1. Diassembly 디버깅

  1) 컴파일러 툴을 이용하여 디어셈블하면서 내 코드가 어떻게 변환되는지 확인한다.

  2) 어셈블리 코드를 몰라도 되며 몇줄로 바뀌는지만 확인하면 충분하다.

 

2. CPU Counter 레지스터가 있으면 원하는 함수 시작부터 마칠때까지 CPU 카운트를 확인하여

    몇 카운트가 흘렀는지를 확인하여 수치로 정확하게 확인해본다.

 

도구가 준비되었으면 이제는 내 머리가 준비되면 됩니다.

[기본 지식]

1. 속도와 용량 둘다 잡을 수 없다. 싸고 좋은 물건은 없다.

   속도가 빠르면 용량이 크고 , 용량이 좋으면 속도가 느리다.

 

2. 위 1번 툴을 이용하여 C 코드가 어떻게 변경되는지 감을 조금 잡는다.

 

-아래부터는 STM32 쪽

3. 라이브러리는 끝까지 추적해서 직접 제어 하도록 한다.

    STM32 의 경우 HAL 라이브러리는 되도록 자제하고 직접 레지스터를 제어한다.

    그렇다고 무식하게 번지를 그냥 입력해서 가독성이 떨어지도록 할 필요는 없다.

 

4. 컴파일러 옵션은 speed 최대

 

5. 시스템의 캐쉬를 켤수 있다면 On ( 7-10배 증가)

 

6. DTCM 과 ITCM 이해

 

7. Bus 아키텍처를 보고 가장 짧은 라인으로 데이터가 움직이도록 처리

 

8. 되도록 DMA 처리

 

9. flash 보다는 ram 에서 실행하는게 더 빠르겠지요.

 

 

+ Recent posts