전체 글

전체 글

    [다시 C언어] 시작하며.

    왜 다시 C언어를 공부할까? RTOS를 만들어보는 공부를 시작하면서 잘 모르던 C언어 문법을 만나게 된 것이 계기입니다. 구조체를 이용한 비트 필드 표현이나 가변 인자 함수가 있다는 것을 알게 된 것도 최근 일이지요. 저는 C언어를 그래도 좀 안다고 생각했는데 너무 얕게 알고 있었던 모양입니다. 그래도 개발을 하면서 밥을 벌어 먹고사는 사람이 자신의 주력 언어는 자신 있게 '잘 안다'고 말할 수 있어야 하지 않을까 생각했습니다. 그래서 다시 C언어를 공부하기 시작했습니다. 무슨 책을 참고하지? 제가 처음 C언어를 접하게 된 것은 2013년 대학원 생활을 시작하면서였습니다. 예술과 공학을 융합한 학과에서 '비전공자' 신분으로 개발 공부를 시작하였지요. 그때는 많은 C언어 입문 ..

    C언어에서 가변 인자 함수를 만들려면?

    C언어에서 그게 되는거였어? 최근에 알게 된 사실인데 C언어도 가변 인자 함수를 사용할 수 있습니다. 가변 인자 함수가 무엇이냐 하면 함수의 인자(인수) 개수가 고정되어있지 않은 것을 말합니다. C언어라고 하면 오래된 만큼 조금 고리타분하다는 인상을 받고 있었습니다. 그래서 그렇게 유연한 기능이 있다는 것을 생각지도 않고 있었지요. 그런데 가만히 생각해보면 평소에 가변 인자 함수를 아주 흔하게 사용하고 있었습니다. 바로 printf()함수이지요. 첫 번째 인자에 출력하고자 하는 문자열 형식(template)이 들어가고 그 이후부터는 앞서 정한 형식에 들어가는 변수들을 나열하지요. 문자열 형식을 어떻게 작성했느냐에 따라 뒤따라오는 인자가 0개가 될 수도 있고 2개, 3개, 10개도 될 수 있습니다. 가변 ..

    ABI, EABI 그 의미를 이해하고 툴 체인 이름까지 해석하기

    ABI와 EABI, 그게 뭐야? 아무 생각 없이 공부 자료를 보다가 문득 'ABI'의 의미를 알아야겠다는 생각이 들었습니다. 이에 대해 알아보고 정리한 자료입니다. ABI 'Application Binary Interface'의 약자입니다. 바이너리 수준의 인터페이스 규약을 말합니다. 서로 다른 컴파일러가 소스 코드를 컴파일하더라도 오브젝트 파일끼리 링킹이 될 수 있도록 합니다. EABI 임베디드 환경의 ABI를 의미합니다. ABI와 EABI의 차이점 이런 것들이 있습니다. 권한 명령이 응용 프로그램 코드 안에서 실행됩니다. 동적 링크 요구하지 않으며 아예 허용하지 않을 수도 있습니다. 메모리 저장을 위해 더 작은 스택 프레임을 가집니다. 위에 적힌 차이점 중에서 가장 크게 ..

    Git 커밋 메시지 에디터 변경하기

    Git 커밋 메시지 작성할 때 사용할 에디터를 변경하는 방법입니다. 아래와 같이 명령을 입력합니다. $ git config --global core.editor "편집기 이름" 예를 들어 nvim(neovim)을 에디터로 사용하고자 한다면 이렇게 입력합니다. $ git config --global core.editor "nvim"

    구조체 내부 변수 뒤 이것 ':'의 정체, '비트 필드'

    변수명 뒤에 붙은 이것 ':', 뭐지? 구조체에 포함된 변수명 뒤에 콜론 기호(:)가 붙은 코드를 보게 되었습니다. 여태 본적이 없는 코드라 저것의 정체가 무엇인지 알아보았고, 그 내용을 간단히 정리하였습니다. typedef union UARTDR_t { uint32_t all; struct { uint32_t DATA:8; // 7:0 uint32_t FE:1; // 8 uint32_t PE:1; // 9 uint32_t BE:1; // 10 uint32_t OE:1; // 11 uint32_t reserved:20; } bits; } UARTDR_t; 정답은 비트 필드! 구조체 멤버 변수 뒤에 사용되는 콜론 기호(:)는 비트 필드를 구현할 때 사용하는 것입니다. 레지스터값에 직접 접근하..

    QEMU 사용시 쉘 종류에 따라서 옵션 값이 달라지는 문제

    QEMU에서 지원하는 가상 하드웨어 목록을 확인하는 옵션이 있습니다. 그런데 쉘의 종류에 따라서 입력 가능한 옵션 값이 다른 것을 알게 되어 기록해둡니다. qemu의 man page 기준으로는 아래와 같이 입력해야 합니다. $ qemu-system-arm -machine help 그런데 bash를 사용하는 경우 아래와 같이 사용할 수도 있습니다. $ qemu-system-arm -M ? 참고하던 책에서는 후자의 방법으로 설명되어 있었습니다. 저는 zsh를 사용하고 있는데 -M ?이라는 옵션이 먹히지 않았습니다. 함께 공부하는 분 덕분에 bash에서는 사용 가능하다는 것을 알게 되었습니다. 이유는 아직 잘 모르겠습니다만, 혹시 나중에라도 알게 되면 이곳에 메모를 남겨보도록 하겠습니다.

    Windows 10에서 RTOS 개발환경 구축하기 3 - WSL 2에서 GUI 프로그램을 실행하기 위한 준비

    이제 막 개발환경 구성을 마친 WSL 2에 설치된 리눅스에서 QEMU를 실행하면 아래와 같은 오류 메시지가 출력되고 QEMU가 실행되지도 않을 것입니다. 이 글에서는 이 문제의 원인을 알아보고 어떻게 해결할 수 있는지 설명합니다. Unable to init server: Could not connect: Connection refused ...(생략)... 왜 이런 오류가 발생할까? 이런 오류는 WSL 2에서 GUI 프로그램을 실행 할 때 나타날 수 있습니다. WSL 2는 GUI를 기본으로 지원하지 않습니다. 따라서 GUI 프로그램을 실행할 수 있도록 무언가 작업이 이뤄져야 하지요. QEMU도 역시 GUI 방식으로 실행되는 프로그램입니다. WSL 2에서 GUI 프로그램을 실행하려면 '디스플레이 서버'라는..

    Windows 10에서 RTOS 개발환경 구축하기 2 - 개발 도구 설치하기

    앞서 Windows 10의 WSL 2를 활성화하는 과정을 설명하였습니다. 이제는 일반 리눅스와 거의 똑같이 RTOS 개발 환경을 만들 수 있습니다. 필요한 개발 도구 목록은 다음과 같습니다. 컴파일러: gcc (gcc-arm-none-eabi) 하드웨어 가상화 도구: QEMU 디버거: gdb (gdb-multiarch) 빌드 도구: make 각 도구 설치 방법은 apt 패키지 관리자 기준으로 정리하였습니다. gcc 컴파일러 설치하기 아래의 명령으로 컴파일러를 설치합니다. $ sudo apt install gcc-arm-none-eabi 설치가 완료되었다면 확인을 위해 설치된 컴파일러 버전을 출력해봅니다. $ arm-none-eabi-gcc -v ...(생략)... gcc version 9.2.1 2019..