2010-08-07 2 views
1

우선 순위 기반의 선점 형 스케줄러를 사용하는 RTOS를 설계하고 있습니다. PCB에는 무엇이 들어 있습니까? 필자는RTOS 용 프로세스 제어 블록 유형은 무엇입니까?

나는 또한 마감? 아니면 다른 어떤을 포함해야

1) PID 2) 우선 순위 3) 프로그램 카운터 4) 상태 5) 일부 플래그를 등록이 항목을 마련 할 수 있었다 fields

+0

향후 사용을 위해 레이블이 지정된 큰 블록 블록. 이전/다음 PCB에 대한 포인터. – dbasnett

답변

0

이것은 작성한 아키텍처에 다소 좌우됩니다.

상태 레지스터뿐 아니라 모든 레지스터 [1]가 필요합니다.

스택 포인터. 아마도 스택 크기.

인터럽트 마스크 상태

당신의 OS는 부동 소수점을 지원하고 CPU가 부동 소수점 유닛이있는 경우, 또한 그 레지스터를 저장하는 것을 잊지 마세요.

[1] 여러 가지 레지스터 뱅크가있는 ARM과 같은 코드를 작성하지 않는 한 [1]. 이 경우 정상적인 작동에 사용되는 뱅크 만 저장하면됩니다.

0

전체 레지스터 세트는 스레드의 스택에 저장되는 경우가 많습니다. 즉, 프로그램 카운터, 상태 레지스터 및 컨텍스트 전환이 필요한 다른 레지스터를 저장하는 데 필요한 스택 포인터가 모두 하나 일 수 있습니다. 여기

가 몇 달 전에-소스 열 내가 RTOS에서 실제 예제 TCB/PCB입니다 ( Atomthreads) :

스택 포인터에서 별도로
typedef struct atom_tcb 
{ 
    /* Thread's current stack pointer */ 
    POINTER sp_save_ptr; 

    /* Thread priority (0-255) */ 
    uint8_t priority; 

    /* Thread entry point and parameter */ 
    void (*entry_point)(uint32_t); 
    uint32_t entry_param; 

    /* Queue pointers */ 
    struct atom_tcb *prev_tcb; /* Previous TCB in doubly-linked TCB list */ 
    struct atom_tcb *next_tcb; /* Next TCB in doubly-linked list */ 

    /* Suspension data */ 
    uint8_t suspended;   /* TRUE if task is currently suspended */ 
    uint8_t suspend_wake_status; /* Status returned to woken suspend calls */ 
    ATOM_TIMER *suspend_timo_cb; /* Callback registered for suspension timeouts */ 

} ATOM_TCB; 

, 다음과 같이 내가 필요한 핵심 요소가 있었다 :

  • 우선 순위
  • 링크리스트의 포인터 : 간단한 큐 - 바의 준비 큐의 스레드를 관리하려면 sed scheduler 또는 특정 세마포어에서 대기중인 스레드의 큐를 처리합니다.
  • 일시 중지 상태 : 세마포어 보류와 같은 작업을 처리합니다. 일시 중지 시간 초과 (예 : 큐 라이브러리의 시간 초과 처리기 일 수 있음) 호출 된 스레드에 상태 코드를 다시 전달할 때 호출 할 콜백 함수를 등록하는 데 사용됩니다.

이것이 유일한 방법은 아닙니다. RTOS 디자인을 시작하고 다양한 OS 기본 (세마포, 큐 등)을 구현할 때 자신의 특정 요구 사항이 명확 해짐을 알 수 있습니다.

관련 문제