CAFE

uC/OS-II

Re:OSUnMapTbl[]에 관해서

작성자kroot|작성시간02.08.05|조회수907 목록 댓글 0



안녕하세요? 카페 시삽입니다.
요즘은 기술이 너무나 빠르게 변하고 있어서, 모든 것이 힘들게
느껴지는 때가 많은 것 같습니다. 그도 그럴 것이, 연구 개발하는
사람은 많은 시행착오를 거쳐가면서 해낸 것을, 한순간에 따라가려니
그만큼 시간이 모자란 탓이겠지요. 하지만 어떤 것은 가장 단순한
방법으로 문제를 해결할 수 있는 것도 있기 마련입니다. 보통은 어떤
알고리즘을 생각하느라 어렵고 효과적인 방법이 없나 고민하면서, 쉬우
면서도 빠른 방법에는 덜 신뢰하기 마련이죠. 우리에게 주어진 짧은
시간 속에서 문제를 해결하는 것이 최선책인 경우도 있는데 말입니다.
여담이 길어지는 군요. ^^


질문하신 OSUnMapTbl에서, 저도 무슨 알고리즘을 사용한 줄 알았는데,
책에 보면 1:1 매핑이라고 적어 놓았더군요. 그래서 보니 그냥 풀어
놓은 것에 불과 했습니다. 가장 높은 우선순위를 찾기 위해서는
먼저 그룹은 검사하고 그 그룹내에서 비트의 위치를 찾아야 겠지요.
이것 하려면 여러번 값을 비교해야 합니다. 그러면 당연히 실행시간이
길어지겠죠. 주기적으로 이런 일을 반복한다면 커널 성능이 많이 떨어
지겠지요. 그래서 여러번 검사하지 않고 빠르게 검사할 수 있는 방법을
가장 쉬운 방법으로 찾아 낸 것입니다.

우선 OSRdyGrp도 8bit 이고, OSRdyTbl도 8bit로 구성되어 있으니까
1:1 대응을 시키기 위해서 256 (2^8) byte가 필요합니다.
가장 높은 우선 순위를 알아내기 위해서는, OSRdyGrp를 알아내기 위한
table과 OSRdyTbl 내에서의 bit위치를 알아내기 위한 table이 두개
필요하게 됩니다. 하지만 두 table의 값이 같기 때문에 OSUnMapTbl
하나 만을 사용하게 됩니다. 또한 낮은 값이 우선 순위가 가장 높은
값이 되니까 이에 따라서 table을 만들면 됩니다.
하나의 예를 보신다면 쉽게 이해가 되실 같군요.

우선 OSRdyGrp 값이 00000000 이 된다면, Ready 된 타스크 값이 없는
것이니 당연히 OSUnMapTbl[0] 값이 0가 되겠지요. (이해가 되지 않으
시는 분께서는 uC/OS-II 한글판 pp.82~84 를 참조 하시기 바랍니다.)
Ready 된 task가 존재한다는 것은 최소한 OSRdyGrp 값이 1 이상이라는
것을 의미합니다. 이때 bit 0가 1이 되어 있다는 것은 최상위 그룹이
Ready 되어 있다는 의미입니다. 따라서 다른 비트가 1이 되어 있어도
가장 높은 우선 순위 그룹은 bit 0에 속한 그룹이라는 말이 됩니다.
그러니 OSUnMapTbl[11111111], OSUnMapTbl[1111 1101], OSUnMapTbl
[1111 1011] ... OSUnMapTbl[0000 0001] 등 OSUnMapTbl 내에 있는 짝수
번째 인덱스 값이 "0" 가 되게 됩니다.
그다음으로 bit0 는 0이고 bit1이 1인 경우 도 마찬가지로 계산할 수
있습니다. 또한 bit0와 bit1이 0이고 bit 2가 1인 경우에 등 차례로
값을 계산해서 table을 만들면 OSUnMapTbl을 만들 수 있게 됩니다.



--------------------- [원본 메세지] ---------------------
가장 높은 우선순위를 찾는 코드를 보면 OSUnMapTbl[]을 참조하여 찾고있는걸 알수가 있습니다.
참 신기하게도 이 테이블을 보면서 계산을 하면 가장 높은 우선순위가 어떤 경우에도 딱 맞아 떨어지는데...

어떤 알고리즘을 통해서 이 테이블을 만든걸까요 ?
이 테이블을 보면서 계산은 가능합니다만 역으로 어떻게 하면 이런 테이블을 만들수 있는지 아시는분 부탁하겠습니다


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼