본문 바로가기

전체 글59

GCC attribute GCC __attribute__(())gcc 컴파일러가 제공하는 확장 기능으로 속성을 지정하는 키워드해당 키워드를 통해서 변수 혹은 함수에 대한 속성을 지정할 수 있음. 종류__attribute__((__used__)): 컴파일 시 최적화를 통해 사용하지 않는 변수들을 제외하는데 해당 속성을 지정하게 되면 사용하지 않는 변수에 대해서 제외시키지 않음__attribute__((__aligned__(x))): 선언한 변수의 메모리 주소를 x 크기로 align__attribute__((__packed__)): 구조체 변수에 대해서 padding을 하지 않고 실제 data의 size만큼 할당. (4byte align)ex)  1번 case의 경우 padding에 의해 8byte 메모리를 할당. / 2번 case.. 2024. 8. 9.
Cache(1) Overview요즘 processor의 clock speed는 external memory에 접근하는 bus speed에 비해 매우 빠른 속도를 가지고 있는데, 때문에 상대적으로 느리게 메모리에 접근하여 처리하는 동안 processor는 유휴 상태가 된다. 이와 같은 속도 차이때문에 발생하는 낭비를 막기 위해  cpu와 가까이 메모리를 위치시키고 미리 외부 메모리로 부터 data를 미리 가져옴으로써 성능을 향상하는 기법을 caching 기법이라 한다. Memory Hierarchy 일반적으로 memory는 core와 근접해 있을수록 낮은 latency를 가지고 있어 속도면에서는 장점이 있으나 사이즈나 비용적인 측면에서 제한적이며 반대로 core와 멀어질수록 큰 size의 메모리를 구성할 수 있으나 속도 .. 2024. 8. 9.
ARM Memory System Memory TypeARM architecture에서 memory는 크게 두 가지 type으로 분류 됨. Normal Memory일반적으로 data나 code가 load되어 처리되는 영역으로서 R/W나 RO로 동작ARM processor는 해당 영역에 대하여 cache 기법을 적용할 수 있음 또한 성능 향상이나 최적화를 위해 하기와 같은 기법을 사용할 수 있음. Merge access연속된 메모리 공간에 접근하는 2개 이상의 명령어를 한번에 처리. ex) 0xF000_0000. 0xF000_0004, 0xF000_0008의 연속된 메모리에 대해 4byte씩 접근하는 경우 3번의 access를 수행하여야 하는데, 이때 다수의 access를 merge하여 0xF000_0000으로 부터 한번의 transact.. 2024. 8. 9.
Yocto Project Yocto Project는 임베디드 소프트웨어를 위한 사용자 정의의 리눅스 배포판 생성을 가능하게 하는 절차들과 도구를 만들어내기 위한 오픈소스 프로젝트 Bitbake는 python과 shell script로 작성되어 embedded linux의 크로스 컴파일 과정을 위한 패키지와 관련파일들을 빌드하는데 사용되는 tool(상기 이미지의 파란색 부분) Poky는 yocto의 reference system으로서 가장 2024. 8. 9.
CMake CMake개요기존 Makefile를 조금 더 쉽고 편리하게 작성할 수 있는 툴로써, 프로젝트의 규모가 커짐에 따라 관리해야하는 소스 파일의 양이 많아지고, 의존성이 많이 생겨 소스 관리가 어려워지는 Makefile의 한계를 해결하기 위해 탄생하였습니다. 소스 코드와 결과물 사이의 추상화를 통해 프로젝트 관리가 쉬워지는 장점이 있음 "CMake는 프로젝트를 빌드하는 것이 아닌 빌드 스크립트 파일(Makefile)을 생성해주는 프로그램" How to useCMake를 사용하기 위해서는 가장 먼저 CMakeLists.txt를 작성해주어야 함 1.기본 CMakeLists.txtCMakeLists.txt에는 반드시 CMake 최소 버전과 프로젝트 버전을 반드시 기재해 주어야 함# 요구 CMake 최소 버전cmak.. 2024. 8. 9.
[C/C++] Volatile volatile의 필요성/* 작성 코드 */u32 *ptr = (u32 *) 0xE0000300;*ptr = 0x1234;*ptr = *ptr & 0xFF; /* 컴파일러에 의한 최적화 */u32 *ptr = (u32 *) 0xE0000300;*ptr = 0x1234 & 0xFF;상기 예제의 경우 Compiler는 최적화를 위해 *ptr = 0x1234; 를 건너뛰고 맨 마지막 코드처럼 *ptr = 0x1234 & 0xFF; 으로 실행 But, 메모리 주소에 연결된 H/W 레지스터에 값을 쓰는 프로그램의 경우 각각의 write 동작이 H/W에 특정 명령을 전달하는 것이므로, 주소가 같다는 이유만으로 중복되는 write명령을 축약해 최적화 해버리면 H/W가 오동작 이러한 이유에 의해 volitile 키워.. 2024. 8. 9.
[C++] 가상함수(Virtual function)와 다형성 이 페이지는 상속(Inheritance)에 대하여 어느 정도 사전지식이 있다고 생각하고 서술하였습니다. C++의 객채지향프로그래밍의 가장 중 큰 특징 중 하나인 가상함수와 다형성에 대하여 알아볼 것이다. 가상함수(Virtual Function)이란 자식클래스에서 이미 정의되어 있는 부모클래스의 멤버함수를 오버라이딩(재정의)한 멤버함수를 의미한다. 먼저 코드를 통해 가상함수의 기본적인 개념인 '오버라이딩'에 대해 알아보자#include #include using namespace std;class Parent { public: void WhoIam() { cout WhoIam(); // delete p1; Child *c1 = new Child(); c1.. 2024. 8. 9.
Memory type 메모리 영역 typeCode 영역: 프로그램 명령 코드 자체를 저장하는 메모리 영역으로, Hex(16진수) 파일이나 BIN(2진수) 파일이 저장되는 영역 Data 영역: 전역변수, 정적변수, 배열, 구조체 등 valid한 값들로 초기화된 변수들이 저장되는 영역초기화 되지 않은 변수는 BSS(Blocked Stated Symbol)영역(= .ZI영역, 0으로 초기화된)에 저장 Heap 영역: malloc(), new() 같은 동적인 메모리를 할당할 때 위치하는 메모리 영역 -> 힙의 경우 하위주소에서 상위주소로 할당을 진행 Stack 영역: 지역변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 임시 데이터를 저장하는 영역 -> 스택의 경우 상위주소에서 하위 주소로 할당을 진행data영역과 bss 영역.. 2024. 8. 9.
728x90