기타

마이크로 컨트롤러의 코드 최적화

작가: Laura McKinney
창조 날짜: 4 4 월 2021
업데이트 날짜: 16 할 수있다 2024
Anonim
[아두이노 기초] 마이크로컨트롤러와 아두이노
동영상: [아두이노 기초] 마이크로컨트롤러와 아두이노

콘텐츠

저자는 dsPic 마이크로 컨트롤러로 마지막 해 엔지니어링 프로젝트를 완료하여 이러한 장치에 대한 광범위한 통찰력을 얻었습니다.

마이크로 컨트롤러의 C 언어 코드는 특정 고급 애플리케이션에서 최적화가 필요할 수 있습니다. 이 코드 최적화는 두 가지 중요한 사항을 줄이기 위해 실행됩니다.

  1. 코드 크기 : 마이크로 컨트롤러는 제한된 RAM 크기로 인해 제한된 데이터와 명령을 저장할 수 있습니다. 따라서 사용 가능한 명령어와 데이터 메모리를 가장 효율적으로 활용할 수 있도록 코드를 최적화해야합니다.
  2. 코드 실행 시간 : 마이크로 컨트롤러는 한 번에 하나의 명령을 실행하는 순차적 장치입니다. 각 어셈블리 명령어는 자체 실행을 위해 특정 수의 클록 사이클을 소비합니다. 따라서 최소한의 클럭 사이클 또는 어셈블리 명령으로 필요한 작업을 수행하도록 코드를 최적화해야합니다. 코드가 사용하는 클록 사이클이 적을수록 더 빠르게 실행됩니다. 이는 처리 시간이 최소화되기 때문에 응용 프로그램이 더 빠르게 실행될 수 있음을 의미합니다.

이 기사에서는 마이크로 컨트롤러 코드의 크기와 실행 시간을 줄이는 데 사용할 수있는 팁과 트릭을 제공합니다.


Microchip의 MplabX 개발 IDE는 적절한 경우 예제를 시연하는 데 사용됩니다.

코드 실행 시간을 실험적으로 측정하는 방법

코드가 실시간으로 실행되는 데 실제로 걸리는 시간을 파악하려면 실험적으로 측정해야합니다. 로직 애널라이저는 코드 실행 시간을 측정하는 데 편리하게 사용할 수 있으며 관심있는 사람들은 저에게 이메일로 프로세스에 대해 문의 할 수 있습니다. 이 옆에:

  • 일부 컴파일러는 코드가 소비 할 클럭주기를 계산할 수 있습니다.
  • 예를 들어 마이크로 칩의 ICD 3과 같은 일부 디버거는 스톱워치를 통해 실행 시간을 직접 측정 할 수 있습니다.

1. 마이크로 컨트롤러의 처리 능력 및 메모리 크기 파악

마이크로 컨트롤러의 처리 속도에 대한 실제 그림을 제공하는 것이 항상 클럭 주파수 (Mhz)는 아닙니다.보다 현실적인 측정은 MIPS (초당 메가 명령) 또는 MCU가 1 초에 실행할 수있는 명령 수입니다.

MCU는 일반적으로 고급 범주의 60–70 MIPS에서 20 MIPS 8 비트 AVR까지 다양합니다. 높은 MIPS 마이크로 컨트롤러는 저가형 장치보다 더 비쌀 가능성이 있으므로 여기에서 비용과 처리 속도 사이의 균형을 맞출 수 있습니다.


마이크로 컨트롤러에는 데이터 및 프로그램 코드를 저장하기위한 별도의 메모리가 있습니다. 둘 다의 크기는 데이터 시트에서 찾을 수 있습니다. 코드가 상당히 큰 경우 메모리 크기가 더 큰 MCU가 필요할 수 있습니다.

2. 코드 크기 최적화를위한 변수 선택

마이크로 컨트롤러는 데이터 메모리가 제한적이며 일반적으로 1 ~ 4KB 범위입니다. 이 경우 저장되는 날짜의 예상 범위에 따라 가장 적절한 변수 유형을 선택하는 것이 좋습니다. 아래 표에는 이러한 변수가 요약되어 있습니다.

C 언어에서 사용되는 변수 요약.

가변형크기 (바이트)범위

부울

1

0 또는 1 만

1


-128에서 127

int

2

-32,768에서 32,767

서명되지 않은 정수

2

0에서 65,535

4

-2,147,483,648에서 2,147,483,647

흙손

4

소수점 이하 6 자리까지 정확

더블

8

소수점 이하 15 자리까지 정확

롱 더블

10

소수점 이하 19 자리까지 정확

예:

  • 두 개의 변수 X와 Y가 추가되고 결과가 Z에 저장되지만 Z의 값이 추가 후 65,535보다 클 것으로 예상되면 Z는 long으로 선언되고 X와 Y는 부호없는 것으로 선언 될 수 있습니다. int, X 및 Y 값도 음수가 될 것으로 예상되지 않습니다. 이렇게하면 모든 변수가 오랫동안 선언 된 경우 사용되었을 데이터 메모리에 04 바이트가 절약됩니다.
  • 값이 정수로 예상되는 두 개의 변수 X와 Y는 나뉘지만 나눗셈의 결과는 십진수를 산출 할 수 있으며, X와 Y는 int로 선언 될 수 있으며 결과는 다음에 따라 float 또는 double로 선언 될 수 있습니다. 필요한 정밀도.

많은 수의 요소를 포함하는 배열을 선언 할 때 데이터 유형을 선택하는 것이 중요 할 수 있습니다.

3. 코드 실행 시간 최적화를위한 변수 선택

  • 부동 소수점 계산이 고정 소수점 계산보다 더 오래 걸린다는 것은 이미 입증 된 사실입니다. 10 진수 값이 필요하지 않은 경우 부동 소수점 변수를 사용하지 마십시오. 가능하면 부호없는 정수로 작업하십시오.
  • 지역 변수는 전역 변수보다 선호됩니다. 변수가 함수에서만 사용되는 경우 전역 변수에 액세스하는 것이 지역 변수보다 느리기 때문에 해당 함수에서 선언해야합니다.
  • 8 비트 MCU는 1 바이트 크기의 변수에 더 빠르게 액세스 할 수 있으며 16 비트 MCU는 생성 된 주소 길이로 인해 2 바이트 변수에 더 쉽게 액세스 할 수 있습니다.

4. 산술 연산 최적화

산술 연산은 다음과 같은 방법으로 최적화 할 수 있습니다.

  1. Sine 또는 기타 삼각 함수 또는 코드에서 사전에 결과를 알 수있는 기타 연산을 평가하는 대신 미리 계산 된 값의 조회 테이블을 사용합니다.
  2. 사인 룩업 테이블이 이미 메모리에 저장되어있는 경우 90도에 해당하는 배열 포인터를 전진시켜 코사인을 평가할 수 있습니다.
  3. 네 가지 산술 연산 중에서 나누기와 곱하기는 처리 시간이 가장 많이 걸리며 실제로는 부동 소수점 값의 경우 수백 마이크로 초 정도의 범위 일 수 있습니다.
  4. 나누기 및 곱하기 대신 비트 시프트 명령어를 사용하십시오. 오른쪽 시프트 명령 3은 2로 나누는 역할을합니다.3 왼쪽 시프트 명령 1은 2를 곱하는 역할을합니다.1.

5. 집중적 인 계산을 위해 DSP 지원 마이크로 컨트롤러 사용

일부 마이크로 컨트롤러에는 아키텍처에 내장 된 기존 ALU 이외의 DSP 처리 장치가 있습니다. 이 DSP 엔진은 ALU보다 몇 배 빠른 클럭 사이클 (대부분의 경우 하나)에서 매우 빠르게 산술 계산을 수행하도록 설계되었습니다.

DSP 프로세서가 ALU보다 빠르게 수행 할 수있는 명령은 다음과 같습니다.

  • 비트 시프트 및 회전 명령.
  • 곱셈, 나눗셈 및 기타 산술 연산.
  • 사인 및 기타 삼각 함수 평가.
  • FFT, DFT, 컨볼 루션 및 FIR 필터링과 같은 모든 DSP 작업.

마이크로 컨트롤러의 DSP 엔진을 사용하려면 다음이 필요합니다.

  • 별도의 DSP 라이브러리가 프로젝트에 통합됩니다.
  • 함수의 이름은 C 언어의 표준 수학 라이브러리와 다릅니다. 이러한 라이브러리 및 기능에 대한 문서는 각 제조업체 웹 사이트에서 사용할 수 있습니다.
  • DSP 엔진은 다른 변수 유형 '분수'를 사용합니다. dsp 라이브러리 함수를 진행하기 전에 분수 형 변수를 사용하는 방법을 알아 봅니다.

표준 수학 라이브러리 함수는 ALU 어셈블리 명령어로 변환되기 때문에 DSP 엔진을 호출하지 않습니다.

6. 인터럽트 작업

다음과 같은 특정 기능을 수행하려면 인터럽트를 사용하십시오.

  • ADC 값 읽기.
  • UART에서 송수신.
  • PWM 듀티 사이클 레지스터 업데이트.
  • CAN 또는 I2C 통신.

인터럽트는 함수 호출 또는 인라인 코드를 통해 본문에서 수행하는 것과 비교하여 이러한 함수를 빠르게 서비스합니다.

인터럽트는 필요할 때만 트리거되는 반면 본문에 코딩 된 경우 코드는 while (1) 루프의 모든 반복에서 실행됩니다.

7. 사용 가능한 최상의 컴파일러 사용

컴파일러는 적절하게 구성된 경우 코드를 C 언어에서 어셈블리 언어로 변환하는 동안 위에서 설명한 일부 최적화를 자동으로 구현할 수 있습니다. 컴파일러에서 최적화 옵션을 찾고 가능한 경우 더 강력한 코드 최적화 프로그램이므로 전문 버전의 컴파일러로 업그레이드하십시오.

8. 조건문을 지능적으로 사용

  • 일련의 if-else 문을 사용할 때 가장 가능성이 높은 조건을 먼저 유지하십시오. 이렇게하면 MCU가 실제 조건을 찾은 후 모든 조건을 스캔 할 필요가 없습니다.
  • switch-case 문은 일반적으로 if-else보다 빠릅니다.
  • 일련의 문 대신 중첩 된 if-else 문을 사용합니다. 문이 많은 if-else 블록은 최악의 경우 (마지막) 조건을 최적화하기 위해 더 작은 하위 분기로 나눌 수 있습니다.

9. 인라인 함수 사용

코드에서 한 번만 사용되는 함수는 정적으로 선언 될 수 있습니다. 이렇게하면 컴파일러가 해당 함수를 인라인 함수로 최적화하므로 함수 호출을 위해 어셈블리 코드가 변환되지 않습니다.

  • 함수는 'static'키워드를 함께 사용하여 인라인으로 선언 할 수 있습니다.

10. 감소 된 루프 사용

감소 된 루프는 증가 된 루프에 비해 더 적은 어셈블리 코드를 생성합니다.

이는 증분 루프에서 루프 인덱스가 최대 값에 도달했는지 확인하기 위해 루프 인덱스를 모든 루프의 최대 값과 비교하는 비교 명령이 필요하기 때문입니다. 반대로 감소 루프에서는 루프 인덱스의 감소 결과가 0에 도달하면 SREG에 0 플래그를 설정하므로이 비교는 더 이상 필요하지 않습니다.

루프가 100 번 반복되어야한다는 점을 감안할 때, 루프에서 하나의 명령을 줄이면 루프가 여러 번 반복되어야 할 때 영향이 더 커질 수 있으므로 루프에서 명령 하나가 100 번 실행되는 것을 방지 할 수 있습니다.

마무리

이 팁은 도움이 될 수 있지만 실제 적용 및 기능은 프로그래머의 기술과 코드에 대한 명령에 따라 다릅니다. 프로그램의 크기가 항상 실행 시간을 결정하는 것은 아닙니다. 일부 명령어는 다른 명령어보다 더 많은 클럭 사이클을 소비 할 수 있으므로 다시 한 번 프로그램의 기술이 그 역할을해야합니다.

이 기사는 저자가 아는 한 정확하고 사실입니다. 콘텐츠는 정보 제공 또는 오락 목적으로 만 제공되며 비즈니스, 재정, 법률 또는 기술 문제에 대한 개인 상담이나 전문적인 조언을 대체하지 않습니다.

새로운 출판물

매혹적인 출판물

사진 및 비디오 슬라이드 쇼를 만들기위한 최고의 소프트웨어는 무엇입니까?
컴퓨터

사진 및 비디오 슬라이드 쇼를 만들기위한 최고의 소프트웨어는 무엇입니까?

슬라이드 쇼는 페인팅, 인쇄 또는 사진 이미지를 화면에 투영 할 수있는 마법의 등불 시대로 거슬러 올라갑니다. 이미지는 한 번에 하나씩 변경해야했습니다. 이러한 장치는 결국 35mm 슬라이드로 작동하는 슬라이드 프로젝터로 대체되었습니다. 자동화는 일반적으로 슬라이드 변경을위한 유선 연결 제어로 제한되었으며, 프로세스는 기계적으로 실행되었으며 슬라이드가 자주...
Aukey 범용 및 무선 충전 전원 은행 검토
컴퓨터

Aukey 범용 및 무선 충전 전원 은행 검토

Krzy ztof는 Apple, am ung, Google 및 Amazon과 같은 회사의 최신 기사를 조사하는 평생 미래의 기술 중독자입니다.Aukey의 26800mAh 및 10000mAh 범용 전원 은행은 전력 공급 및 빠른 충전, 동시 충전을위한 다중 포트, 심지어 무선 충전까지 제공합니다.이 파워 뱅크는 12.9 형 iPad Pro, 새로운 MacBo...