임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. A.2 ABI - Application Binary Interface의 약자 - 바이너리 수준에서 애플리케이션이 호환 가능하도록 만든 인터페이스 (*바이너리 수준 = 컴파일이 완료된 오브젝트 파일) 💡 ABI는 링커가 오브젝트 파일(라이브러리 포함)들을 링킹할 수 있도록 함수 호출 방법을 정의한 인터페이스 호출 방법 = 실행 파일 형식, 자료형, 레지스터 사용, 스택 프레임 조직, 호출 규칙 호출 방법 실행 파일 형식 컴파일러가 생성하는 바이너리 파일의 구조를 정의 자료형 프로그래밍 언어가 사용하는 자료형의 실제 크기를 정의 레지스터 사용 파라미터와 로컬 변수가 레지스터를 몇 개나 사용하는지에 대한 내용을 정의 스택 프레임 조직 스택을 어떻게 만들지 정..
임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. 시작하기 전에 나빌로스 비선점형 스케줄링 태스크가 명시적으로 Kernel_yield()를 호출해야만 다른 태스크로 컨텍스트가 넘어가므로 싱글코어 환경에서는 동기화 문제가 발생x => 동기화를 다루지 않아도 됨 동기화 (synchronization) : 운영체제에서 어떤 작업을 아토믹 오퍼레이션 (atomic operation)으로 만들어 준다는 의미 아토믹 오퍼레이션 (atomic operation) : 억지로 번역을 하면 '단일 작업' 혹은 '원자 작업' 정도가 되는데, 번역이 실제 의미를 제대로 전달하지 못함 => 아토믹 오퍼레이션 혹은 아토믹 동작이라는 용어 사용 어떤 작업이 아토믹하다 = 해당 작업이 끝날 때까지 컨텍스트 스위칭이 발생하지 않는다..
임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. 시작하기 전에 이벤트 보내기 - 인터럽트 핸들러에서 태스크로 - 태스크에서 태스크로 * 이벤트 이상의 더 많은 정보를 보낼 수 없음! 메시징 : 임의의 데이터를 메시지라는 이름으로 전송하는 기능 이벤트와 메시징을 섞어서 사용 -> 인터럽트 핸들러에서 이벤트 외에 별도 데이터를 더 보내고 싶으면 메시징 기능을 이용해서 데이터를 보내고 이벤트를 보냄-> 태스크에서 이벤트를 처리할 때 이벤트 핸들러에서 메시지를 읽어와서 처리하는 것 12장 메시징 12.1 메시지 큐 - 큐의 구현을 따름 - FIFO 선입선출 - 임베디드 시스템에서는 동적 할당을 피하는 것이 좋으므로 배열을 사용 kernel/msg.h #ifndef KERNEL_MSG_H_ #define KE..
임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. 시작하기 전에 이벤트 : 인터럽트와 태스크 간의 연결 매체 11장 이벤트 11.1 이벤트 플래그 - 이벤트는 개발자가 정한 어떤 값으로 전달됨. 이벤트를 비트맵(bitmap)으로 만들기 - 각각의 이벤트 값을 겹치지 않는 비트 위치에 할당. - 이벤트 플래그(event flag) : 특정 비트 위치에 독립된 이벤트를 할당해서 이벤트가 있다 없다를 표시하는 방식. kernel/event.h 이벤트 플래그를 처리하는 함수와 이벤트 플래그 자체를 선언 #ifndef KERNEL_EVENT_H_ #define KERNEL_EVENT_H_ typedef enum KernelEventFlag_t { KernelEventFlag_UartIn = 0x00000001,..
임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. 시작하기 전에 컨텍스트 스위칭 : 컨텍스트를 전환(switching)한다는 것 태스크 : 동작하는 프로그램 컨텍스트 : 동작하는 프로그램의 정보컨텍스트를 어딘가에 저장하고 또 다른 어딘가에서 컨텍스트를 가져다가 프로세서 코어에 복구하면 다른 프로그램이 동작함=> 태스크가 바뀐 것! 10장 컨텍스트 스위칭 나빌로스의 태스크 컨텍스트를 태스크의 스택에 저장 나빌로스의 컨텍스트 스위칭 1. 현재 동작하고 있는 태스크의 컨텍스트를 현재 스택에 백업 2. 다음에 동작할 태스크 컨트롤 블록을 스케줄러에서 받기 3. 2에서 받은 태스크 컨트롤 블록에서 스택 포인터 읽기 4. 3에서 읽은 태스크의 스택에서 컨텍스트를 읽어서 ARM 코어에 복구 5. 다음에 동작할 태스..
임베디드 OS 개발 프로젝트를 읽고 작성하였습니다. 시작하기 전에 스케줄러란? 지금 실행 중인 태스크 다음에 실행할 태스크가 무엇인지 골라주는 것 효율적으로 만드는지에 따라 RTOS의 성능이 좌우될 정도로 중요함! 9장 스케줄러 9.1 간단한 스케줄러 스케줄러 : 다음에 실행할 태스크가 무엇인지 골라주는 것 가장 간단한 방법? => 라운드 로빈 (round robin) 알고리즘 현재 실행 중인 태스크 컨트롤 블록의 바로 다음 태스크 블록을 선택하는 것!추가 계산 없이 인덱스를 계속 증가시키면서 대상을 선택하는 알고리즘중요한 점은 끊임없이 증가하는 것이 아니라 정해진 최댓값에 이르면 다시 0이 된다는 것 kernel/task.c 스케줄러 역시 태스크 관련 작업이므로 kernel/task.c에서 수정 sta..