2009-04-10 6 views
2

여러 응용 프로그램을 실행할 수있는 임베디드 장치 용 프레임 워크를 작성하고 있습니다. 응용 프로그램간에 전환 할 때 현재 응용 프로그램의 상태가 올바르게 정리되도록하려면 어떻게해야합니까? 예를 들어 하나의 응용 프로그램에서 집중적 인 루프를 실행 중이며 해당 루프가 아직 완료되지 않은 상태에서 두 번째 응용 프로그램을 실행하라는 요청이 있다고 가정 해보십시오. 루프가 완료 될 때까지 루프가 포함 된 개체를 삭제할 수 없습니다. 그러나 루프 할 개체를 삭제할 준비가 된 상태로 유지하는 방법을 확신 할 수 없습니다. 완료 될 때 알려주는 일종의 폴링 메커니즘이나 이벤트 콜백이 필요합니까?C++에서 인터럽트 처리

감사합니다.

+0

인터럽트 일 경우 스케줄링 및 멀티 태스킹에 관한 질문 일 수 있습니까? 인터럽트는 일반적으로 낮은 수준의 외부 트리거를 나타냅니다. – lothar

답변

1

일반적으로이 유형의 작업을 수행해야하는 경우 OS가 간단한 자작 유형 일지라도 여러 작업을 처리 할 수있는 OS/RTOS가 필요합니다.

이미 RTOS가없는 경우 (수백 사용할 수있다) 하나를 들여다 보거나 protothreads 같은 간단한 일 통합을 조사 할 수 있습니다 : 그래서 당신은 두 개의 스레드가 http://www.sics.se/~adam/pt/

1

을 하나의 실행 커널과 하나는 애플 리케이션을 실행? 커널에서 ReadyToYield() 함수를 호출하여 응용 프로그램이 닫을 수있을 때 호출 할 수있는 함수를 만들어야합니다. ReadyToYield()는 커널 스레드에 플래그를 지정하여 좋은 소식을 제공 한 다음 커널 스레드가 수행 할 작업을 결정할 때까지 기다렸다가 대기합니다. 커널 스레드 호출에

void ReadyToYield(void) 
{ 
    continueWaitingForKernel = true; 
    appWaitingOnKernel = true; 
    while(continueWaitingForKernel == true); 
} 

: 응용 프로그램 스레드 호출에

volatile bool appWaitingOnKernel = false; 
volatile bool continueWaitingForKernel; 

: 그것은 다음과 같이 보일 수 분명히

void CheckForWaitingApp(void) 
{ 
    if(appWaitingOnKernel == true) 
    { 
     appWaitingOnKernel = false; 

     if(needToDeleteApp) 
      DeleteApp(); 
     else 
      continueWaitingForKernel = false; 
    } 
} 

, 실제 구현은 여기에 기본에 따라 달라집니다 O/S하지만 이것은 요지입니다.

존.

0

(1) 스레드 안전 코드를 작성해야합니다. 이는 임베디드 시스템에만 국한된 것은 아닙니다.

(2) 컨텍스트 전환을 수행 할 때 상태를 저장해야합니다.