English

커널구조-태스크 컨트를 블록 #2

2008.02.26 10:44

권오용 Views:2936 Recommend:45

uc/os-ii는 Task가 생성할때 그에 해당하는  Task 블록을 할당하며,



이 Task컨트를 블록의 역할은 해당 Task가 다른 우선순위가 높은 Task에의해  선점될때 해당 Task의 상태를 유지하기위한



구조체이며 CPU로 하여금 다시 제어권을 받을때 이를 다시 불러와 선점당하기 전상태부터 다시 실행할수 있게한다.  



즉, 이것은 예를들어 abcd라는 문자중에 현재 ab를 치고있다가 스케쥴링이 발생해 다른 태스크가 실행되면 나중에 ab값 이후



알파벳을 치기위해 현재ab를 친상태를 저장하는 곳이라 생각하면된다



이런 모든 Task 컨트를 볼록은 RAM에 존재하며 이러한 컨트를 블록 구조체의 멤버를 살펴보면 다음과 같다.



1. OSTCBStkPrt : 현재 Task가 마지막으로 사용한 스택의 위치를 가리키는 포인터이다. 즉, 스케쥴링이 일어나기 직전에

                         Task가 실행한영역이라(?)  생각하면된다.



2. OSTCBExtPtr : 사용자 정의 태스크 컨트롤 블록을 가리키는 포인터.  즉,태스크 컨트롤 블록을 사용자 용도에 맞게 수정하고

                         싶을때 이필드를 사용하며 OSTaskCreateExt()함수만 이필드를 사용할수있다. 또한 이필드를 사용하려면

                         OS_TASK_CREATE_EXT_EN == 1 로 설정해야한다.



3. OSTCBStkBottom : 태스크가 사용하는 스택영역의 끝부분을 나타냄.

                              0x09,0x08,0x07......0x01 이런식으로 낮은주소방향으로 스택포인터가 증가하는 시스템일경우 이필드는

                              0x01을 가리키며 0x01,0x02,0x03.....0x09 이런식으로 높은주소방향으로 스택포인터가 증가하는 시스템일

                              경우 이필드는 0x09를 가리킨다. 이필드를 통해 각 Task에 할당된 스택공간중 사용하지 않은 공간을 알수

                              있으며 이러한 스택검사기능은 OSTaskCreateExt()함수로 태스크를 생성할때만 이용할수있음.

                               OS_TASK_CREATE_EXT_EN == 1 로 설정해야한다.



4. OSTCBStkSize : 스택의 크기를 바이트가 아닌 항목개수로 나타내는 필드. 예를들어 32bit 시스템에서 이값이 1000일때

                           실제스택의 크기는 4,000바이트가 되며 16bit시스템일때 2,000바이트가 된다. OSTCBStkBottom필드와

                           마찬가지로 OSTaskChk()함수에서 쓰이며 OS_TASK_CREATE_EXT_EN == 1 로 설정해야한다.



5. OSTCBOpt : OSTaskCreateExt()를 사용해 Task를 생성할경우, 옵션에 해당하는 값을 보관하는 필드 3가지 값이있다.

                      (1) OS_TASK_OPT_STK_CHK : 생성하는 Task에 대해 스택검사를 사용하겠다고 OSTaskCreateEx()에 알림

                           OSTaskStkChk()를 호출해 스택검사를 수행



                      (2) OS_TASK_OPT_STK_CLR : Task를 생성할때 스택공간을 0으로 클리어함

                           OSTaskStkChk()를 이용해 스택검사를 할때 이옵션을 활성화해야한다.



                      (3) OS_TASK_OPT_SAVE_FP : Task가 부동 소수점 연산기능을 사용할경우 사용하는 옵션

                           하드웨어적으로 부동연산을 지원하는 코프로세서를 사용한다면 문맥전환이 발생할경우 코프로세서의

                           레지스터들을 문맥에 포함하여 처리하도록 해야 함.



6. OSTCBId : 태스크의 ID를 나타내며 추후 확장을 위해 정의함



7. OSTCBNext 와 OSTCBPrev : 커널내부의 생성된 태스크 컨트를블록을 이중연결리스트로 관리하기 위해 사용하는 필드



8. OSTCBEventPtr : 이벤트 컨트를 블록을 가리키는 포인터



9. OSTCBMsg : 태스크로 보낸메세지를 가리키는 포인터



10 . OSTCBFlagNode : 이벤트 플래그 노드를 가리키는 노드 이필드는 이벤트 플래그 그룹에서 대기중인 태스크를 삭제할때

                                OSTaskDel()함수가 이용함. OS_CFG.H파일의 OS_FLAG_EN == 1로 설정



11. OSTCBFlagsRdy : 이벤트 플래그 그룹에서 대기중인 Task를 준비상태로 만드는 이벤트 플래그를 포함.

                                OS_CFG_H의 OS_FLAG_EN == 1로 설정



12. OSTCBDly : Task를 일정틱동안 지연할 필요있거나 타임아웃과 함께 이벤트를 기다릴때 사용하는 필드

                       지연시간 / 대기시간 틱값을 가지며 이값이 0일때 태스크는 지연되지않는다.



13. OS_TCBStat : 태스크의 상태를 나타내는 필드 예를들어 이값이 OS_STAT_READY이면 태스크가 준비상태임

                         Ucos_II.H와 연관되어있다.



14. OSTCBPrio : 태스크의 우선순위를 나타내는 필드. 우선순위가 높아질수록 낮은 Prio값을 갖는다.

                        즉 , 낮은Prio값을 가지면 우선순위가 높다.



15. OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY : 태스크가 실행될수 있는 상태임을 표시하거나 이벤트를 기다리는 상태라는

                        것등등의 것을 빠르게 판단하기위해 하는 연산을 빠르게 수행하기위해 사용하는 필드이다.



16. OSTCBDelReq : 태스크가 삭제 요청을 받았는지 여부를 나타내는 필드. OS_CFG.H 파일의 OS_TASK_DEL_EN==1로 설정



사용 가능한 태스크 컨트를 블럭의 갯수는 사용할수있는 태스크의 최대 갯수가 와같으며 이값은 OS_CFG.H의 OS_MAX_TASK



값으로 알수있으며 시스템 내부적인 사용을위해 ON_N_SYS_TASK만큼의 태스크 블록을 더할당한다, 이값은 Ucos_ii.h에 정의



되어 있다. 따라서 최대 사용한 가능한 컨트롤 블럭의갯수는 OS_MAX_TASK+ON_N_SYS_TASK가 된다.



모든 태스크 컨트롤 블럭은 OSTCBTbl[] 배열로 할당되며 배열 내의 모든 태스크 컨트를 블럭은 자유리스트에 단일 링크드 리스



트 형태로 삽입되며 컨트롤 블럭의 할당이 필요할경우 OSTcbFreeList로 유지되는 자유리스트에(즉 OSTCBTbl배열에서)서



태스크 컨트를 블럭을 하나 꺼내 할당해주고 태스크가 OSTaskDel함수에 의해 삭제되면 해당컨트를 블럭을 다시 자유리스트에



삽입된다.