고급 개발자로 가는 길
반응형

분류 전체보기 115

[Python] 윈도우 환경에 파이썬 설치하기

윈도우에 파이썬 설치하기 https://www.python.org/downloads/ Download Python The official home of the Python Programming Language www.python.org 파이썬 공식 홈페이지 다운로드 페이지에서 윈도우용 파이썬 언어 패키지 다운을 진행 한다. 필자는 python-3.10.2-amd64 버전으로 진행 하였다. install exe 을 실행한 후, Add Python 3.10 to PATH 를 체크한다. "Add Python 3.7 to PATH" 옵션을 누락하면 이후 실습할 때, 오류 발생 할 수 있다. 만약 Python 이 설치되는 경로와 PATH 에 대한 사전 지식이 있는 사용자라면 이 옵션을 생략해도 된다. 아래와 같이..

Python 2022.03.04

[Firmware - STM] 링커 스크립트 LD, 심볼 및 map 할당

링커 스크립트(ld)를 통해 원하는 해당 심볼을 특정 sector 영역에 할당 가능하다. 영역 설정 후 빌드하여 링커에 의해 원하는 주소에 적재 되었는지 확인하기 위해서 map 파일의 심볼 주소영역을 확인 또는 Trace32 dump 등으로 확인 해야 한다. 즉, object 인 input file 의 section 을 output file 인 elf 와 map 로 어떻게 진행해야 하는지 memory map 을 어떻게 잡는지에 대하여 스크립트로 설정하는 것이다. RWW 인 Read While Write 라고하여 Partition 이 나누어져 있다. RRW0 의 경우 Security 가 아닌 code data flash 영역이며 RRW1 의 경우 HSM code 관련 RRW2 의 경우 EEPROM 등, R..

Firmware/STM 2022.03.01

[Linux Kernel] 테스크 디스크립터 매크로 함수

매크로 얘기에 앞서, 프로세스 생성 시 copy_process 함수를 통해 최종적으로 task_struct 메모리 영역을 슬럽 캐시를 통해 미리 할당해 놓고, ARMv7 의 경우 mmu에 page 2개로 할당하여 0x2000의 스택 메모리 영역을 할당 받게 된다. 참고로 스택영역은 페이지 사이즈의 2배이다. 실제 소스에서 PAGE_SIZEfiles, 0, nofile, flags); } 실제 위 함수는 프로세스의 파일 디스크립터 할당을 위한 함수로 current 매크로를 통해 files 에 접근해 전달 한다. 실제 전역이나 지역변수로 할당은 안되어 있지만, task_struct * 와 같이 동작하게 된다. 이 밖에도 수 많은 함수에서 current 매크로 확인이 가능하다. 즉, 현재 구동 중인 프로세스의..

[Linux Kernel] 스레드 자료구조 thread_info 간단 설명

thread_info 구조체 task_struct 는 프로세스의 속성을 관리하고, thread_info 구조체는 프로세스 실행 동작을 관리한다. 테스크 디스크립터는 프로세스의 공통 속성 정보를 저장하고 관리하는데, 실제 세부 실행 정보를 저장 또는 로딩하는 자료구조로는 thread_info 가 사용 된다. 구조체의 특징으로는 선점 스케줄링 실행 여부 시그널 전달 여부 인터럽트 컨텍스트와 soft irq 상태 휴면 상태로 진입하기 직전 레지스터 세트를 로딩 및 백업 thread_info 구조체는 프로세스 스택의 최상단 주소에 있다. 프로세스 마다 자신의 스택영역이 있으니, 즉, 프로세스 마다 1개의 thread_info 구조체가 있는 것이며, ARM32bit 에서 프로세스 실행되는 스택의 크기는 0x200..

[Linux Kernel] 테스크 디스크립터 자료구조

테스크 디스크립터 task_struct 구조체로, 프로세스의 속성 정보를 표현하는 가장 중요한 자료구조이다. TCB Task Control Block 이라고 Context switch 시 TCB 를 참고하여 진행이 된다. TCB 는 프로세스의 정보를 표현하는 자료구조이다. 리눅스 커널에서 프로세스의 정보를 표현하는 자료구조가 바로 테스크 디스크립터 인 것이다. 리눅스 bash 를 통해 입력되는 ps 정보 또한 테스크 디스크립터 필드에 저장 된 값을 읽어서 표현된다. 리눅스 시스템에서 구동중인 프로세스 목록 또한 init_task.tasks 인 연결리스트에 접근해 출력 된다. 그럼 각 중요 항목들을 정리해보면, 프로세스 식별 필드 pid_t pid; 정수형인 프로세스 ID 값인 pid 이다. char co..

[C++] vector 컨테이너 구현

C++로 개발 시 에서 자주 활용되는 컨테이너 이기도 하다. 다양한 기능들을 제공하여 배열보다 사용이 매우 편하며, 활용성이 좋다. 사용 예시인 코드를 구현해 보겠다. #include #include using namespace std; int main(void) { vector vecVal; vecVal.push_back(1); vecVal.push_back(3); vecVal.push_back(5); vecVal.push_back(7); vecVal.push_back(9); //vector vecData(5); vector vecData(5, 3); //vecVal.assign(vecData.begin(), vecData.end()); vecVal.assign(5, 4); vector::iterato..

C++ 2022.02.20

[C++] set, multiset 컨테이너 구현

set 컨테이너 set 은 기본적으로 less 정렬이 되며, 중복되는 value 가 insert 되면 중복 삽입하지 않음 insert, begin, end, count, find, lower 기능 제공 구현할 내용 간략 set 컨테이너 set, pair 컨테이너 복합 구현 (equal_range 방식) 탐색기능 count, find 구현 iterator 구현 조건자를 통해 key_comp 비교(less, greater 활용) lower_bound, upper_bound 구현 multiset 컨테이너 구현(find count lower, upper, equal) 구현 내용은 아래 소스와 같다. #include #include #include // greater stl 사용시 using namespace s..

C++ 2022.02.20

[C++] map, pair 컨테이너 구현

이번 글에서는 map 컨테이너와 pair 컨테이너를 동시에 사용하는 방식을 구현해 볼 것이다. map을 pair 로 구현 map 컨테이너에서 제공하는 lower_bound, upper_bound, find, insert, erase 등 구현 #include #include using namespace std; int main() { map mapData; pair pair_map; pair_map = mapData.insert(pair(0, 50)); pair_map = mapData.insert(pair(1, 51)); pair_map = mapData.insert(pair(2, 52)); pair_map = mapData.insert(pair(2, 53)); if (!pair_map.second) {..

C++ 2022.02.20

[C++] pair, multimap, adjacent_find 구현

이번 글에서는 C++ 에서 pair 컨테이너, multimap 컨테이너의 lower_bound, upper_bound 그리고 adjacent_find 에 대해 설명 해 볼 것이며, template 화 하여 함수포인터 및 객체화 방식을 구현해 볼 것이다. pair 의 경우 2가지의 다른 타입 or 같은 타입의 변수를 저장 가능한 컨테이너 multimap 의 경우 2가지의 다른 타입 or 같은 타입의 변수를 저장 가능한 컨테이너 이다. pair 의 집합이라고 봐도 된다. adjacent_find 는 중복되는 값을 빠르게 탐색하여 찾아준다.(template 함수 포인터, 객체화 방식이 존재) 구현 해볼 내용으로는 아래와 같다. 1. lower, upper_bound 구간 검색 2. adjacent_find 사..

C++ 2022.02.20

[C++] count, count_if, equal을 위한 template 함수, 함수 포인터, 객체 컨테이너 구현

C++ 에서 컨테이너 구현 방식으로 class 외에도 함수 포인터 방식이 존재한다. count, count_if 를 통해 list 중 find 하는 기능을 함수로 제공한다. count_if 의 경우 컨테이너를 3번째 인자로 전달한다. equal 의 경우 template 함수, 함수 포인터, template 함수 객체화 하여 전달하는 방식을 제공한다. 하여, 위의 내용들을 활용하여 C++ 로 구현을 해보겠다. 그럼 바로 소스를 통해 알아가 보도록 하자. 아래는 필자가 직접 구현한 소스이다. #include #include //#include #include using namespace std; bool(*pCompare)(int, int); template bool Compare(T nVal1) { if ..

C++ 2022.02.20

[C++] Compare 컨테이너 구현(vector 활용)

c++ 은 Standard Template Library 에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class 를 의미한다. 이말은 즉, template 를 통해 연산자 오버로딩 등 다양한 기법들을 개발자 편의대로 사용 할 수 있다. 또한 iterator 를 통해 반복문을 사용 할 수 있다. 이번 글에서는 Compare 하는 기능의 class 를 만들어 template 으로 컨테이너 화 해보겠다. 아래 소스는 필자가 직접 구현한 소스이다. #include #include #include #include using namespace std; template class CCompare { public: bool operator () (T nVal1, T2 nVal2 ) { if (nVal1 < nV..

C++ 2022.02.20

[Firmware - RTOS] RTOS 개념, 차이점, 방식

RTOS가 무엇인지, 그리고 왜 쓰는지, 어떻게 쓰는지에 대해 기술해 볼 것이다. 보통은 미사일을 예로 많이드는데 너무 실시간성만 얘기하기 보다는 조금 더 자세히 들여다 볼 것이다. RTOS 는 해당 보드의 지원되는 OS 종류에 따라 동기화 방법이 다르다.(Semaphore / Mutex) RTOS의 이해 Real Time 이란 임의의 정보가 시스템에 입력이 되었을 때, 주어진 시간안에 작업이 완료되어 결과 도출 되는 것을 의미 결국 신속응답 처리를 위해 일반 펌웨어의 main 시퀀스 외에 여러 Task 를 만든다는 것을 의미한다. RTOS 와 Windows or Linux 차이점 RTOS - 자원을 낭비하더라도 작업의 시간 제한을 맞추는데 포커스 Windows or Linux - 자원을 얼마나 공평하게..

Firmware/RTOS 2022.02.20

[Arm 아키텍처] ARM 레지스터 : 스페셜 레지스터

아래는 ARMv8 A 기준 스펙 문서이다. https://developer.arm.com/documentation/ddi0487/latest Documentation – Arm Developer developer.arm.com ARM Register 아래 표는 ARM 아키텍처에서 사용되는 Register 이다. 실제 예전에 히언님의 쓰신 Embedded Recipe 를 보며 도움이 많이 되었던 내용이기도 하다. 아래 내용을 모르면 ARM 에 모른다고 봐도 무방할 정도이다. System and User FIQ Supervisor Avort IRQ 등 각 모드별로 사용 되는 Register 들이 조금씩 다르다. 공통으로 사용되는 Register 가 있는 반면, 그 목적에 맞게 다르게 사용되는 Register..

[Arm 아키텍처] AAPCS(Calling Convention)

AAPCS(Calling Convention) 을 알아야 하는 이유 프로그래밍의 근본 동작 원리 파악이 가능 실제 Arm 코어는 c 코드가 아니라 어셈블리 명령어를 실행함 대부분 c 코드는 함수로 구성 됨 안정적이고 최적화된 이쁜 코드 작성 할 수 있는 기반 지식 함수에 전달되는 인자의 갯수 프로세스의 스택을 최대한 사용하지 않는 코드 설계를 해야 함 디버깅 실력을 키우고 이는 문제 해결 능력으로 이어짐 스택 오버플로우, 스택 Corruption 콜 스택 복원 objdump 나 trace32 를 통해 어셈블리 영역을 볼 수 있다. 또한, 함수 호출 시 인자의 갯수를 전달 할 수 있는 레지스터는 8개로 한정되어있다. 8개 초과 시 해당 프로세스의 스택영역에 할당하여 컨텍스트 스위칭을 진행하게 된다. 물론 ..

[Linux Kernel] gcc 컴파일 옵션

gcc 옵션 -v : 컴파일 상태 출력 -O2 : 최적화 레벨 2 적용 -E : 전처리 과정 결과 출력. --save-temps 옵션 사용 추천 -S : cc1으로 전처리된 파일을 어셈블리 파일(.s) 까지만 컴파일 -c : as에 의한 어셈블까지만 수행하고 링크하지 않음 --save-temps : 전처리 파일(*.i) 과 어셈블리 파일(*.s) 를 지우지 않고 현재 디렉토리에 저장 (컴파일 오류 분석용) cpp0 옵션 (전처리기) -I : 헤더 파일 경로 (ex. -I/usr/local/include) -D[매크로]=[값] : #define 매크로 (ex. -DDEBUG, -DPACKAGE=1) -U[매크로] : #undef 매크로 -M : make를 위한 소스 파일의 모든 종속 항목 출력 -MM : ..

[Linux Kernel] ftrace 를 통한 유저 레벨 프로세스 분석(POSIX exit 종료 방식)

프로세스 종료 방식 프로세스 종료 방식은 크게 두 가지로 나뉜다. 1, 유저 레벨에서의 Signal 종료 아래 경로 글에서 Signal 방식의 종료에 대하여 ftrace 를 통해 분석하였다. 2022.02.07 - [Embedded/Linux Kernel] - [Linux Kernel] ftrace 를 통한 유저 프로세스 분석 [Linux Kernel] ftrace 를 통한 유저 레벨 프로세스 분석 먼저 유저 프로세스 생성을 위한 raspbian_test.c 파일 이다. #include #include #define PROC_TIMES 500 #define SLEEP_DURATION 3 // second unit int main() { int proc_times = 0; for(proc_times = 0..

[Linux Kernel] 프로세스 소멸 과정 소스 분석

프로세스 종료 방식 프로세스 종료 방식은 크게 두 가지로 나뉜다. 1, 유저 프로세스 레벨에서의 Signal 종료 아래 글에서 Signal 방식의 종료에 대하여 ftrace 를 통해 분석하였다. 2022.02.07 - [Embedded/Linux Kernel] - [Linux Kernel] ftrace 를 통한 유저 프로세스 분석 [Linux Kernel] ftrace 를 통한 유저 레벨 프로세스 분석 먼저 유저 프로세스 생성을 위한 raspbian_test.c 파일 이다. #include #include #define PROC_TIMES 500 #define SLEEP_DURATION 3 // second unit int main() { int proc_times = 0; for(proc_times =..

[C++] 동적 바인딩 과 정적 바인딩

객체지향 언어에서 빠질 수 없는 동적바인딩 기법에 대해 알아보자. 예시는 C++ 언어로 아주 예전에 ModbusTCP Protocol 을 개발했던 프로젝트로 할 것 이다. git log 를 보니 정확히 금일 날짜 기준 593일 전에 git push 되었다. 소스는 아래경로에 올려 두었다. 필자가 예전에 직접 짠 코드라 프리하게 오픈 가능해서 편하다. https://github.com/Anthony8062/ModbusTcp GitHub - Anthony8062/ModbusTcp: 프로젝트 프로젝트. Contribute to Anthony8062/ModbusTcp development by creating an account on GitHub. github.com 정적 바인딩 정적 바인딩은 컴피일 시점에 그..

C++ 2022.02.14

[Trace32] T32 Header 구성품

이전에 사용하던 STM 사 SPC 계열 MCU 수급문제로 인해 MCU 변경이 필요했다. Infineon cypress MCU 를 사용하게 되면서, T32 Header 도 변경이 필요하다. 아래는 새로 구매하게 된 T32 Header 이다. 구성은 아래와 같이 되어있다. software licenses / Debug Cable / Header 이 있다. 아래는 기존에 사용중이였던, STM SPC 계열 T32 기기 풀 셋 이다. 펌웨어 개발 시 디버깅의 모든 것이 가능한 기기이다. 실제 메모리 덤프, 디버깅 그 외 많은 기능들이 제공 된다.

Firmware/Trace32 2022.02.12

[Firmware-모터 제어] 모터 PID 제어

PID 제어란 비례 / 적분 / 미분 제어로서 P I D 의미를 갖는다. 자동제어로 센서로부터 I/O 신호를 읽고 목표치와 비교하며, 운전 등 조작량을 제어하므로써 목표 값에 근사하게 유지하는 방식이다. 즉, 조작량을 비례 한 크기로 제어하는 방식이다. PID 제어를 증명하려면 사실 어렵긴하지만, 이 글에서는 PD제어에 대하여 설명 할 것이다. PD 제어 PD 제어는 Proportional Derivative 제어 (비례 미분 제어) 로서, 아래의 수식을 갖는다. 별칭으로는 폭주하는 제어를 잠재우기 위한 미분제 라고도 하며, 실제로 모터 사용 시 아래와 같이 모듈레이션이 좋지 않은걸 스코프로 측정 할 수 있다. 이러한 경우 모터 구동 시 RPM 이 일정하지 않으며, 소음 등이 정상 제어가 되지 않는다. ..

[Linux Kernel] ftrace 를 통한 유저 레벨 프로세스 분석(Signal 종료 방식)

먼저 유저 프로세스 생성을 위한 raspbian_test.c 파일 이다. #include #include #define PROC_TIMES 500 #define SLEEP_DURATION 3 // second unit int main() { int proc_times = 0; for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) { printf("raspbian tracing \n"); sleep(SLEEP_DURATION); } return 0; } 위의 .c 파일을 빌드 하기 위한 Makefile 이며, make 를 통해 빌드 진행 하여 raspbian_proc 실행 파일 생성 raspbian_proc: raspbian_test.c gcc -o ra..

[Linux Kernel] 커널 스레드(프로세스) 생성 과정 소스 분석

systemd 프로세스는 유저 공간에서 생성된 프로세스의 부모 프로세스 역할을 수행한다. 보통은 init 프로세스라 부르기도 한다. 보통 유저 프로세스에서 부모 프로세스가 소멸 되면, init 프로세스가 부모 역할을 수행하게 된다. ps -ejH 프로세스 생성 과정 크게 두가지로 분류 할 수 있다. 1. 유저 레벨에서 생성된 프로세스 라이브러리(GNU C : glibc) 의 도움을 받아 커널에게 프로세스 생성 요청 2. 커널 레벨에서 생성된 프로세스 커널 내부의 kthread_create() 함수를 호출하여 커널 프로세스 생성 대부분 이를 커널 스레드 라고 부른다. 둘의 공통점은 _do_fork() 함수를 호출한다는 점이다. init 프로세스 : 유저 레벨 프로세스 생성 kthreadd 프로세스 : 커널..

[Linux Kernel] 커널에서의 프로세스 테스크 스레드 이해

실제로 개발을 하면서 프로세스, 테스크, 스레드 등을 자주 사용 한다. 객체지향인 C++ 에서도 API 에서 제공하는 스레드를 사용하기도 하고 MFC 로 개발할 경우 MFC 에서 제공하는 스레드를 사용하곤 한다. 물론 스레드는 프로세스와 다르게 메모리를 공유하여 컨텍스트 스위칭이 빠른 장점도 있지만, 그 만큼 임계영역을 나누어야 하며, 필자는 실무로 C++ 개발 시 임계영역으로 Critical Secsion 을 사용했었다. 이렇듯, OS 별로 사용 방식이 상이하다. 리눅스에서도 위의 개념이 존재하게 되는데, 유저영역과 커널영역에 따라 나누어진다. 이 글에서는 리눅스 시스템에서의 프로세스에 대하여 알아가 보도록 하자. 프로세스 우선 프로세스는 실제 리눅스 시스템 메모리에서 실행 중인 프로그램을 뜻한다. 리..

[Linux Kernel] 커널 디버깅용 Debugfs 드라이버 코드

우선 해당 드라이버 코드는 [LG전자 김동현님]의 코드를 참조한 것이다. 커널 소스를 수정하여 빌드 할 경우, 잘못 오류를 범하게 되면 커널 패닉이나, 시스템 락이 발생하여, 다시 이미지를 라이팅하는 상황이 발생할 수 있다. 그러한 경우를 방지하기 위해 Debugfs 드라이브 코드를 작성하여, 필요시에만 수정된 소스를 커널에 반영하는 방식을 알아 보도록 할 것이다. 먼저 아래 소스를 참고하면 된다. 내용은 간단하다. get, set 을 통해 raspbian_debug_state 전역변수에 값을 쓰고 읽는다. 눈치를 채신분도 계실텐데, 우리는 저 전역변수를 통해 if 문으로 제어 할 것이다. #include #include #include //#include #include #include #include..

[시] 조지훈 - 사모

사모 조지훈 사랑을 다해 사랑하였노라고 정작 할 말이 남아 있음을 알았을 때 당신은 이미 남의 사람이 되어 있었다. 불러야 할 뜨거운 노래를 가슴으로 죽이며 당신은 멀리로 잃어지고 있었다. 하마 곱스런 웃음이 사라지기 전 두고두고 아름다운 여인으로 잊어 달라지만 남자에게서 여자란 기쁨 아니면 슬픔 다섯 손가락 끝을 잘라 핏물 오선을 그려 혼자라도 외롭지 않을 밤에 울어보리라 울어서 멍든 눈흘김으로 미워서 미워지도록 사랑하리라 한 잔은 떠나버린 너를 위하여 또 한잔은 너와의 영원한 사랑을 위하여 그리고 또 한 잔은 이미 초라해진 나를 위하여 마지막 한 잔은 미리 알고 정하신 하나님을 위하여

혼자끄적 2022.02.06

[시] 이형기 - 낙화

낙화 이형기 가야 할 때가 언제인가를 분명히 알고 가는 이의 뒷모습은 얼마나 아름다운가. 봄 한 철 격정을 인내한 나의 사랑은 지고 있다. 분분한 낙화. 결별이 이룩하는 축복에 싸여 지금은 가야 할 때 무성한 녹음과 그리고 머지않아 열매 맺는 가을을 향하여 나의 청춘은 꽃답게 죽는다. 헤어지자 섬세한 손길을 흔들며 하롱하롱 꽃잎이 지는 어느 날 나의 사랑, 나의 결별 샘터에 물 고이듯 성숙하는 내 영혼의 슬픈 눈 그때가 고점이였으나, 그것을 인지 하지 못한채 하락을 보게되는.. 우상향 중 매도란 쉽지 않다.

혼자끄적 2022.02.06

[Trace32] 커맨드 명령어 사용

섹션 정보 보기 symbol.list.section 주소로 코드 정보 파악 symbol.list.line [address] 전역 변수 확인 var.view [전역 변수 이름] var.view %l %t init_thread_union %l : 필드별 주소 정보 %t : 필드 타임 출력 구조체를 주소로 캐스팅 var.view %l %t (struct thread_info*)0x80c00000 어떤 주소든 지정한 구조체로 캐스팅 가능하다. 어셈블리 코드 보기 data.list [address] 주소에 해당하는 어셈블리 코드를 볼 수 있다.

Firmware/Trace32 2022.02.01
반응형