임베디드

임베디드250703 - RTOS

_KDE_ 2025. 7. 3. 16:02

1. Process와 Thread의 차이

프로세스 (Process) 스레드 (Thread)

정의 실행 중인 프로그램 하나 프로세스 안의 작은 실행 단위
메모리 각각 독립된 메모리 사용 (코드, 데이터, 힙, 스택 분리) 같은 프로세스의 메모리 공유 (코드, 데이터, 힙은 공유, 스택은 따로)
독립성 완전히 독립됨 → 다른 프로세스에 영향을 주지 않음 같은 프로세스 내에서 다른 스레드와 영향을 줌
생성 비용 무겁고 비용이 큼 (시간과 자원 많이 듦) 가볍고 빠름 (비용 적음)
예시 Word, Chrome, PowerPoint 같은 앱들 각각 크롬에서 여러 탭이 각각 스레드로 작동

프로세스1이 프로세스2의 메모리 공간에 접근하는 것은 불법

하지만 필요한 경우가 있는데 이를 "Debugger' 라고 함

 

프로세스와 프로세스간에 통신을 하고싶다.

->IPC(Inter Process Communication)


Controller, Presenter는 Model을 값이들어왔나 안들어왔나 계속 체크하다가 들어오면 동작

 

이러한 구조는 유지보수성이 좋다

 

신제품이 나오면 이전 코드를 유지하면서 업그레이드(ex 갤럭시 시리즈 s23, s24, s25....)

 

 

Controller, Listener, Presenter이렇게 분리해서생각해보자

 

 

만들려는 STOPWATCH의 구조 Design(설계)

 

처음에 만들 때 무작정 만들기보다는 Data 중심에서 코딩을 하자.

 

그리고 생각하기

 

STOP, RUN, CLEAR 이런 정보는 Listener, Controller, Presenter 어디에 넣는게 좋을까?

 

셋 전부 사용하면 Model이라는 곳에 만드는게 좋지 않을까?

 

STOP, RUN, CLEAR는 StopWatch의 "상태 정보"임

 

예전에는 약자를 많이 썼지만 최근에는 full name 사용

 

변수명은 회사마다 룰이 다를 수 있음

estopWatchState_t -> enum 정보인데 stopWatch의 State를 가지고 있는 자료형이구나 알 수 있음

 

 

 

 

 

이 state를 get, set하는 방식으로 만들 것임

 

 

이 함수를 통해서 state를 가져오거나 설정해라. 외부에서 접근해서 가져오지 말아라는 의미

 

Controller에 필요할 함수들 일단 선언

 

StopWatch.c

 

 

그리고 위 그림처럼 큰 틀부터 코딩

 

시, 분, 초, ms 전부 StopWatch의 데이터 -> 구조체로 묶자

 

 

생각해보면 위 구조체를 Controller, Presenter에서 다 쓸 것 같음

-> Model에 이 구조가 있어야할 것 같음

StopWatch.c

 

StopWatch_Stop()을 작성하다 보니 EVENT라는게 필요

(event란 버튼의 눌림?)

model의 header에 정의

 

 

Model_StopWatch.h

 

위와 같은 구조로 코드를 짤 거임

osEvent 자료형으로 evt에 들어온 값을 저장(non blocking임)

evt의 status가 osEventMessage이면(이벤트가 들어오면)

evtState에  evt의 value(정수형 값)을 넣어 줌

 

그리고 Queue가 필요함

 

Model_StopWatch.c

Model_StopWatch.c에 아래와 같이 작성(Model은 thread가 아니라 공유자원임)

Model.c에 위와 같이 선언

stopWatchEventMsgBox라는 msgbox를 선언 그리고 16비트 정수형 큐4 개로 만들어줌

header에는 위와 같이 선언

 

main에 위와같이 선언

Interrupt 코드는 굉장히 짧아야 함

 

 

상태변경은 Controller에서 하는 것임. Listener나 Presenter는 상태 정보값만 읽어옴

 

 

Listener.c

.

StopWatch.c

1. *pStopWatchData의 주소를 동적으로 할당

2. stopWatchData의 주소를 pStopWatchData에 copy 크기는 stopWatch_t만큼

3. pStopWatchData의 주소가 Que에 들어감

 

위 함수가 1ms안에서도 수십차례 돌 수도 있음

 

 

memcpy 의 return값: 첫 번째 인수가 크면 0보다 큰값 작으면 0보다 작은 값 같으면 1