ARM 기반 MCU 개발시 디버그 메시지 출력용으로 사용할 여분의 Serial 입/출력 포트가 없는 경우 Semihosting 을 이용하면 printf/scanf 등의 표준 입출력함수를 이용하여 디버거 에이전트를 통해서 디버그 메시지 출력이 가능하다. SWD (Serial Wire Debugger) 를 사용한다면 SWDIO, SWCLK 기본 2핀에 추가로 SWO 핀을 사용하여 디버그 메시지를 출력하는 방법도 있다. 하지만 SWD 2핀만 연결된 보드를 사용하여 개발하는 경우나 Jtag 를 사용하는 경우에는 semihosting 을 이용하는 방법을 정리해두록 한다. 개발 환경은 SW4STM + ST-Link V2 이다. 우선 semihosting 의 정의는 아래와 같다. http://infocenter.ar..
커널 소스코드 에서 자주 볼 수 있는 __init 와 __initdata 는 초기화시에만 사용하고 사용되지 않는 함수와 데이터를 지정할때 사용되어진다. 커널 소스코드의 include/linux/init.h 에 아래와 같이 정의되어 있다. include/linux/init.h #define __init __section(.init.text) __cold notrace#define __initdata __section(.init.data) include/linux/compiler.h#define __section(S) __attribute__ ((__section__(#S))) 컴파일러는 __init 로 지정된 함수와 __Initdata 로 지정된 데이터는 커널 초기화과정 이후에 해제되는 영역에 배치함으로서..
리눅스 커널 소스를 보다보면 심심치 않게 __read_mostly 매크로를 마주하게된다. unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; __read_mostly 매크로를 통해서 프로그래머는 컴파일러에게 " 이 데이터는 자주 수정되지 않으며 대부분 읽기 연산만 이루어진다" 라는 것을 알려준다. __read_mostly 는 다음과 같이 정의 되어있다. #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 보통 SMP 를 고려한 코드 내에서 자주 볼수가 있는데, 컴파일러는 __read_mostly 로 선언 되어있는 데이터들을 바이너리 파일의 일정 부분에 모여있게 하여, 코어(core)..