C에서 @로 변수 선언


11

나는 C 코드를 읽고 프로그램 에서이 선언을 보았습니다.

unsigned char serv_ctr @0x0002;

누군가 나를 문서화하거나 Mplab XC8 v1.35 C 컴파일러에서 "@ 0x0002" 가 무엇인지 설명 할 수 있습니까 ?


14
변수를 특정 주소에 배치하는 것이 컴파일러 확장이라고 생각합니다.
유진 Sh.

2
질문은 #mplab 태그에 도움이 될 수 있습니다. 이것은 Mplab에만 해당되기 때문입니다.
sylvainulg

이해하기 :이 사이트의 주제입니까? 나는 이것이 SO에 속한다고 생각합니다. 아니면 여기서 마이크로 컨트롤러 프로그래밍을 요청해도됩니다. 이것은이 질문이 어디에 있어야하는지 불분명합니다.
안녕 안녕

6
@KamiKaze 여기서 어떤 주제를 물어볼 수 있습니까? "맨 메탈 또는 RTOS 응용 프로그램 용 펌웨어 작성"을 주제로, "PC 용 소프트웨어 프로그래밍"을 주제로 나열합니다. 이것은 임베디드 시스템 프로그래밍에 관한 것으로 보이므로 한 눈에 주제로 보일 것입니다. 그것은 수 있음을 또한 스택 오버플로에 대한 주제에있을하지 않습니다 자체에 의해 여기에 주제와 그것을합니다.
CVn

@KamiKaze 문의 해 주셔서 감사합니다. 비슷한 질문이 있습니다. (이 SE의 일반 사용자는 아닙니다)
GPPK

답변:


20

변수를 배치 할 절대 주소를 지정합니다.
로부터 XC8 컴파일러 매뉴얼 27 페이지, 절대 주소 2.5.2 섹션 :

변수와 함수는 __at()구문 을 사용하여 절대 주소에 배치 할 수 있습니다
.......
2.5.2.2 차이점
8 비트 컴파일러는 @ 기호 를 사용하여 절대 주소를 지정했습니다.


6

@C 언어에 대한 일반적인 비표준 확장으로 특정 주소에서 변수를 선언 할 수 있습니다. 메모리 매핑 된 하드웨어 레지스터 등에 사용할 수 있습니다.이 경우 변수도 선언해야 volatile하므로 예제가 올바르지 않습니다.

다른 컴파일러는 __attribute__(section...or 와 같은 것을 사용 #pragma ...하며 모두 비표준 C입니다.

툴 체인이이를 수행하는 유일한 합리적인 이유는 크 래피 디버거에서 레지스터 디버깅을 활성화하는 것입니다. 비표준 구문은 레지스터가 링커 출력 및 디버그 정보의 일부가되도록합니다. 그러면 다른 변수를 볼 수 있듯이 크 래피 디버거에서 레지스터를 볼 수 있습니다.

좋은 디버거가 있으면 특정 MCU를 지원하고 인식하게됩니다. 그런 다음 C 코드에 비표준 쓰레기가 필요하지 않지만 대신 순수하고 휴대용 표준 C를 작성할 수 있습니다.

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
컴파일러는 후자의 형식을 수용해야하지만 구현에서는 숫자가 주소에 적합한 방식으로 매핑 될 수 있습니다. 또한, 내가 본 대부분의 컴파일러는 @여러 메모리 공간 또는 기타 문제가있는 표기법 대상 플랫폼을 사용 하므로 @표기법을 사용하여 선언 된 대부분 은 확장없이 수행 할 수있는 것과 다르게 작동합니다.
supercat

1

짧은 확장명 :

xc8 2.0 이상부터는 더 이상 작동하지 않습니다. 이제 다음과 같이 작성해야합니다.

unsigned char serv_ctr __at(0x0002);

serv_ctr절대 주소 ( 0x0002)에 변수 ( ) 를 넣습니다 .

XC8 2.0 @에서는 컴파일러 설정이 "C90"형식을 사용하도록 설정 한 경우 구문을 사용하여 이전 코드를 컴파일 할 수 있습니다. 설정은 "XC8 Global Options"아래에 있으며 "C standard"라고합니다.


다른 많은 임베디드 시스템 컴파일러는 @Mplab뿐만 아니라 구문도 지원합니다 .
Lundin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.