본문 바로가기

한국으로/ARM15

ARM의 특수 용도 레지스터 ARM의 특수 용도 레지스터R13 ( SP : Stack Pointer ) : C/C++ 에서 stack 을 관리 하기 위해 포인터관리 용도로 사용. R14 ( LR : Link Register ) : 특정 함수 호출 뒤 return 될 위치를 저장할 목적으로 사용. R14 ( PC : Program Counter ) : 실행되는 code 의 위치 저장. 다른 platform 과 동일. CPSR ( Current Porcessor Status Register ) : 연산 결과, IRQ/FIQ 금지 및 동작 모드 등을 설정함. 2018. 7. 21.
호출 규약 __cdecl 과 __stdcall의 차이점 __cdecl (C declaration)함수를 호출한 쪽(Caller)에서 인자를 제거하고 스택을 정리.가변인자 사용 가능. __stdcall (standard call)호출된 쪽(Callee)에서 직접 스택을 정리.가변인지 사용 불가능. 호출된 함수가 인자의 개수를 알 수 없어서 인자에 대한 스택정리에 오류있음. __fastcall호출된 쪽(Callee)에서 직접 스택을 정리. 공통적으로 인자는 우측부터 높은 주소가 전달된다.ARM은 __cdecl과 __fastcall을 섞어쓴다.그리고 OS가 호출하는 함수는 되도록이면 __stdcall을 쓰자. 2018. 7. 21.
volatile이 필요한 경우 volatile 메모리를 다른 프로세스, CPU, 주변장치 등과 공유하는 경우 volatile이 필요하다. volatile이 필요한 경우:Memory Mapped I/O하드웨어적으로 값이 변경됨.주변장치는 반드시 volatile unsigned가 필요!외부적으로 바뀔 가능성있는 변수는 volatile을 써야함. ex) #define REG0 (*(volatile unsigned short*)0x1000) DMA에 의한 전송DMA로 데이터 이동 시 CPU는 메모리 변화를 알지 못함. 인터럽트 처리루틴인터럽트 처리루틴과 Main 루틴의 공유 변수의 경우 volatile 필요.컴파일러는 인터럽트 처리함수가 CPU가 호출하는 함수인 지 알지 못함.따라서 컴파일러가 최적화하면서 컴파일러가 볼 때 불필요한 코드 영.. 2018. 7. 21.
C Runtime Startup C Runtime Startup crt0crt0는 C로 작성된 프로그램의 메인 함수를 호출하기 전에 필요한 초기화를 수행하는 루틴의 집합으로 프로그램에 링크되어 있다. 보통 어셈블리어로 작성되며, 빌드 시에 링커에 의해 자동으로 실행 파일에 포함된다. crt0는 runtime 라이브러리의 가장 기본적인 부분을 포함한다. 정확히 하는 일은 프로그램의 컴파일러, 운영체제 그리고 C 표준 라이브러리의 구현에 달려 있다. 환경과 툴체인에 필요한 초기화 작업 외에도, crt0는 C++의 전역 생성자나 GCC의 ((constructor)) 속성을 포함하는 C 함수를 실행하는 것 같이 프로그래머에 의해 정의된 추가적인 작업을 할 수 있다. XIP (Execute in Place)XIP는 메모리 상에서 직접 프로그램/.. 2018. 7. 21.