나는 C 코드를 읽고 프로그램 에서이 선언을 보았습니다.
unsigned char serv_ctr @0x0002;
누군가 나를 문서화하거나 Mplab XC8 v1.35 C 컴파일러에서 "@ 0x0002" 가 무엇인지 설명 할 수 있습니까 ?
나는 C 코드를 읽고 프로그램 에서이 선언을 보았습니다.
unsigned char serv_ctr @0x0002;
누군가 나를 문서화하거나 Mplab XC8 v1.35 C 컴파일러에서 "@ 0x0002" 가 무엇인지 설명 할 수 있습니까 ?
답변:
변수를 배치 할 절대 주소를 지정합니다.
로부터 XC8 컴파일러 매뉴얼 27 페이지, 절대 주소 2.5.2 섹션 :
변수와 함수는
__at()
구문 을 사용하여 절대 주소에 배치 할 수 있습니다
.......
2.5.2.2 차이점
8 비트 컴파일러는 @ 기호 를 사용하여 절대 주소를 지정했습니다.
@
C 언어에 대한 일반적인 비표준 확장으로 특정 주소에서 변수를 선언 할 수 있습니다. 메모리 매핑 된 하드웨어 레지스터 등에 사용할 수 있습니다.이 경우 변수도 선언해야 volatile
하므로 예제가 올바르지 않습니다.
다른 컴파일러는 __attribute__(section...
or 와 같은 것을 사용 #pragma ...
하며 모두 비표준 C입니다.
툴 체인이이를 수행하는 유일한 합리적인 이유는 크 래피 디버거에서 레지스터 디버깅을 활성화하는 것입니다. 비표준 구문은 레지스터가 링커 출력 및 디버그 정보의 일부가되도록합니다. 그러면 다른 변수를 볼 수 있듯이 크 래피 디버거에서 레지스터를 볼 수 있습니다.
좋은 디버거가 있으면 특정 MCU를 지원하고 인식하게됩니다. 그런 다음 C 코드에 비표준 쓰레기가 필요하지 않지만 대신 순수하고 휴대용 표준 C를 작성할 수 있습니다.
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
여러 메모리 공간 또는 기타 문제가있는 표기법 대상 플랫폼을 사용 하므로 @
표기법을 사용하여 선언 된 대부분 은 확장없이 수행 할 수있는 것과 다르게 작동합니다.
짧은 확장명 :
xc8 2.0 이상부터는 더 이상 작동하지 않습니다. 이제 다음과 같이 작성해야합니다.
unsigned char serv_ctr __at(0x0002);
serv_ctr
절대 주소 ( 0x0002
)에 변수 ( ) 를 넣습니다 .
XC8 2.0 @
에서는 컴파일러 설정이 "C90"형식을 사용하도록 설정 한 경우 구문을 사용하여 이전 코드를 컴파일 할 수 있습니다. 설정은 "XC8 Global Options"아래에 있으며 "C standard"라고합니다.
@
Mplab뿐만 아니라 구문도 지원합니다 .