임베디드 시스템에서 다음을 정의하십시오.
#define Row1_PORT GPIOD
#define Row1_PIN GPIO_PIN_4
#define Row2_PORT GPIOD
#define Row2_PIN GPIO_PIN_7
#define Row3_PORT GPIOD
#define Row3_PIN GPIO_PIN_1
#define Row4_PORT GPIOD
#define Row4_PIN GPIO_PIN_3
//------------
#define Paste2(a,b) a ## b
#define Paste(a,b) Paste2(a,b)
#define NRows 4
위의 정의 된 매크로를 다음과 같은 루프에서 사용하고 싶습니다.
for(i=1;i<=NRows;i++)
{
GPIO_Init(Paste(Paste(Row,i),_PORT),Paste(Paste(Row,i),_PIN),GPIO_MODE_IN_PU_NO_IT);
}
대신에
GPIO_Init(Row1_PORT,Row1_PIN);
GPIO_Init(Row2_PORT,Row2_PIN);
GPIO_Init(Row3_PORT,Row3_PIN);
GPIO_Init(Row4_PORT,Row4_PIN);
가능합니까? __COUNTER__
ANSI C 또는 C ++ 와 같은 것이 필요합니다 . 내 컴파일러는 IAR입니다.
전처리 기는 컴파일 타임에 실행되며 컴파일러에 제공되는 소스 코드를 텍스트로 수정합니다. 당신이하고자하는 것은 불가능합니다. 컴파일러는 런타임에 i
변수 값이 아닌 매크로 확장에 문자 를 포함합니다 i
.
아마도 다음과 같은 것을 사용할 것입니다.
static const int ports[] = { 0, Row1_PORT, Row2_PORT, Row3_PORT, Row4_PORT };
static const int pins[] = { 0, Row1_PIN, Row2_PIN, Row3_PIN, Row4_PIN };
for (int i = 1; i <= NRows; i++)
GPIO_Init(ports[i], pins[i]);
또는 ( '대신'옵션에 표시 한대로) 긴 손으로 작성합니다. 단 4 개의 항목에 대해 약간의 패널티가 있고 약간의 절약이 있습니다. 초기화 할 포트가 100 개라면 물론 루프가 더 좋을 것입니다.
또한 나중에 포트 및 핀 번호를 다시 사용하려는 경우 (초기화 코드가 아닌 코드의 다른 부분에서) 사용 가능한 어레이를 사용하면 더 큰 유연성을 얻을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다