2017-04-19 15 views
2

긴 - 시간 사용자, 여기에 처음으로 포스터. 비슷한 질문을했지만 아무것도 찾을 수 없었습니다.#define에서 고정 수식을 사용하는 경우 숫자를 사용하는 것보다 효율적이지 않습니까?

Keil μVision의 C로 작성된 Cortex-M3의 일부 기존 코드를 통해 작업하고 있습니다.

ADC에서 값을 기록하는 함수에서 비트를 다시 볼트로 변환하는 데 배율 인수가 사용됩니다.

내 질문은 헤더 파일에 정의 된 배율, 중심으로 돌아 가지 :

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

그래서이, 4095과 동일는 12 비트 ADC이기 때문에 의미가있다. 내가 가진 질문은 "INPUT_VALUE_MAX"값을 수식으로 정의하는지 여부가 사용될 때마다 마이크로 컨트롤러가 값을 다시 계산해야한다는 것입니다.

간단히 수행합니다

#define INPUT_VALUE_MAX (uint16_t)4095 :

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

보다 처리 시간이 더 걸릴?

누구든지 제공 할 수있는 도움에 미리 감사드립니다!

+0

사용 된 컴파일러에 따르면 최적화를 위해 두 번째와 같이 첫 번째를 다시 작성하므로 동일하다고 생각합니다. –

+1

(거의?) 모든 컴파일러는 컴파일 타임에 상수를 평가하고 코드에 '4095'를 붙입니다. – TripeHound

+0

Brilliant! 귀하의 신속하고 유용한 답변에 감사드립니다. –

답변

3

아니요, 런타임 처리 시간이 필요하지 않습니다. 전체 매크로는 정수 상수 표현이며 컴파일시 계산됩니다. 당신이 생성 된 어셈블리를 보면

, 당신은 표현이 상수 표현은 다음과 같이 C에 의해 정의 된 상수 4095


로 대체되는 것을 C11 6.6를 볼 수 있습니다 :

상수 표현식은 런타임 대신 변환 중에 평가 될 수 있으므로 상수가 일 수있는 모든 위치에서 사용할 수 있습니다.

제약

상수 표현은 평가되지 않는 부분 식에 포함되는 경우를 제외하고 할당, 증가, 감소, 함수 호출, 또는 쉼표 연산자를 포함하지 않는다.

각 상수 표현식은 해당 유형에 대해 값을 나타내는 범위의 상수로 평가됩니다.

/-/

는 정수형을 가지며 만 정수 상수 열거 상수 문자 상수, 그 결과 정수를 sizeof 표현식 피연산자를 갖는다 정수 상수 표현식 캐스트의 즉치 피연산자 인 상수, _Alignof 식 및 부동 상수.정수 상수 표현식의 캐스트 연산자는 sizeof 또는 _Alignof 연산자에 대한 피연산자의 일부로 만 산술 유형을 정수 유형 ( )으로 변환해야합니다.

+0

자세한 답변을 주셔서 감사합니다. –