예전에 고민하고 머리를 쥐어뜯던 부분에 대해 좀 정보를 남겨보려고 한다.

어딜 봐도 이런 내용은 거의 없더라

원론적인 내용이라 그런가?

 

최근에는 MCU도 하이 퍼포먼스가 기본이라 SMP형식의 멀티코어 시스템이 등장하고 있다.

여기서 궁금한 부분이 있을 것이다.

 

멀티코어? 그럼 펌웨어를 어떻게 디자인 해야하는거야?

 

2가지 방법이 있다.

하나는 편리하게 자원을 나눠서 하나는 0번 코어에서 돌게 하고 나머지 하나는 1번 코어에서 돌아가게 하고

각자 다른 펌웨어 주고 물론 flash영역도 각자 나눠 갖고 이런식으로 디자인할 수 있다.

2개의 다른 펌웨어가 하나의 MCU에서 돌아가는 형식인거지

 

그럼 다른 방법은?

윈도우나 안드로이드 폰 처럼 하나의 펌웨어에서 SMP 멀티코어를 직접 관리하도록 할 수도 있다.

 

개략적인 그림만 그려보자

이 그림이 잘 안그리고 확신이 안 서서 처음에 삽질을 좀 했다.

별거 아니긴 한데

 

어차피 MCU core라는게 코드가 돌아가는거잖어

reset handler가 시작되어 돌아가는 주소를 어딘가에 설정하면 되는거고 사용하는 sram 영역은 미리 linker descriptor로 디자인 하면 되는거잖어

 

그 HOST core들을 동일한 플래시 펌웨어로 돌릴 수 있도록 단 하나의 펌웨어 파일로 돌아갈 수 있도록 디자인을 해볼 수 있다.

 

대략의 flow는 이런식이다.

MCU 자체 설정에 core를 동시에 켜거나 HOST core의 일부만 먼저 시작하거나 그런식으로 옵션을 설정할 수 있다.

먼저 시작하는 HOST core를 Master Core라고 하자

동시에 시작해도 별 상관은 없다 reset handler에서 디자인을 잘 하면 되니까

 

Master Core가 부팅을 시작하면 reset handler로 시작되겠지?

램 영역은 어느정도 디자인을 잘 해야한다.

Master/Slave Core가 각기 독립적으로 사용하는 sram 영역(stack, bss, data 등)

그리고 둘이 같이 접근해서 공유메모리 처럼 사용할 수 있는 sram 영역

이런식으로 디자인을 잘 해야 한다.

 

인제 Master Core가 리셋 핸들러를 탐험하기 전 먼저 자기가 master core인지 slave core인지 HW를 통해 확인을 해야한다.

보통 SMP 시스템에서는 자기가 어떤 코어이고 코어의 상태가 어떤지 알 수 있다.

ready 상태인지 아니면 열심히 달리고 있는 상태인지 꺼져있는지 등등

 

자신이 Master Core라는 것이 확인 되었으면 OS로 사용하는 램 영역을 초기화하고 자기가 필요한 램 영역을 초기화 한다

디자인하기 나름이지만 Slave Core영역도 미리 초기화 해줄 수도 있고 이건 뭐 상관 없다.

 

그럼 main으로 점프해서 클럭설정도 하고 HW 초기화를 잘 진행한다.

그럼 Slave Core는 뭘 하고 있는가?

HW적으로 설정하여 POR이후 즉시 대기 상태로 있을 수 있으면 그대로 기다리고 있는다.

만약 그런게 불가능하면 자신이 Slave Core임을 확인하고 Master Core가 어떠한 flag 세팅을 하기를 기다리며 계속 대기 상태로 유지 되고 있으면 된다.

 

Master Core가 자기 세팅할 것을 완료했다면 Slave Core를 활성화 시킨다.

HW 설정으로 동작하도록 할 수도 있고 sram의 flag를 세팅하여 코드 진행을 가능하도록 할 수도 있다.

 

즉 쉽게 말해서 같은 코드를 디자인하여 사용하더라도 내부에 조건문으로 core 1일 때 core 0일 때의 루틴을 나누면 된다는 이야기

 

램? 램은 위에서 말했듯 각자 core가 사용할 수 있는 독립적인 영역을 미리 linker descriptor에 잘 디자인 해야 한다.

core 2개가 동시에 stack을 사용할 수는 없잖어

 

보통 Core의 권한 레벨에 따라 Stack Pointer 같은 것을 설정할 수 있는 레지스터들이 존재하며(MSP, PSP 같이)  이것을 Reset Handler에서 램 초기화 하기 전에 미리 세팅을 해줘야 한다.

 

그럼 뭐 펌웨어 하나로 각자 램 사용해서 잘 굴러갈 수 있는거지 뭐

물론 해당 코드는 어느 하나 코어의 독점 사용이 아니라 동시에 이용할 수 있다는 점

 

이걸 사용해서 동일한 연산을 수행하여 결과를 동시에 받아 그것을 비교하여 다수결로 사용하는 lockstep을 구현할 수도 있겠으나 실제 어떤식으로 구현 되어있는지는 잘 모르겠다 궁금하긴 하다.

 

lockstep으로도 사용할 수 있을 것 같기도 하고 SMP니까 병렬처리로 사용할 수도 있을 것 같고 실제 어떤 식으로 쓰는지는 몰?루

 

그리고 보통 SMP 시스템에는 HW 적인 semaphore을 지원하여 서로 동시성 문제 없이 통신을 할 수 있도록 한다.

 

OS 스케쥴러는 어떤식으로 디자인 되어있을랑가

실제 본적은 없는데 멀티코어면 코어당 내부 timer 있으니까 timer 주기 마다 각자 OS sram 영역에서 스케쥴링 하는건가

그럼 각 멀티코어의 스케쥴 끼리는 통신하는게 거의 없는 건가

윈도우 SMP 시스템이랑 다르게 MCU는 레지스터 백업해서 stack 메모리에 넣는걸 굳이 shared 메모리에 넣어서 idle 코어가 뭔지 찾은다음 idle코어에서 복구한다음 돌리지 않아도 될 것 같은데 그게 나으려나?

그게 되긴 하겠네 그러겠네여 그럼 slave core는 timer가 안 돌면 스케쥴링이 뭐 어떻게 되냐?

master core에서 HW irq 발생 시켜서 slave core 쪽 int handler에 해당 HW irq 등록하고 그럼 해당 HW irq에서 권한 상승 시켜서 context switching...?

느릴 것 같은뎅

core간 cross로 context switch를 해도 되고 그정도 까지는 안 해도 되고

궁금하네잉

 

 

Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함