2012-01-05 2 views
2

인터럽트가 가능하면 스케줄러가 RTOS의 컨텍스트를 특정 태스크로 전환하도록하십시오. 나는 마이크로 코스 OS와 함께 일하고있다uC/OS (임베디드 시스템)의 컨텍스트 스위칭

여기 keyscan을 수행하고 편지를 글 상자에 게시하는 작업이있다. 나는이 코드에 debounce와 자동 반복과 같은 몇 가지 기능을 추가해야하지만 트리거를 분류해야한다. 그것을 제대로 작동시키는 메커니즘.

나는 스케줄러는 일반적으로이 작업을 수행이

 static void AppTaskKeyscan (void *p_arg) 
    { 
     CPU_INT08U debouncing = 1; 
     CPU_INT16U key; 
     key_t button={0,0,0}; 

     (void)p_arg; 

     while (DEF_TRUE) 
     { 
      static CPU_INT08U pattern; 
      key=P10; 

      OSTimeDlyHMSM(0, 0, 0, 50); 
      P10=0x0E; 
      if ((pattern=P10)==0xee) 
       {button.data='1', button.live=1;}  
      else if (pattern==0xde) 
       {button.data='4', button.live=1;} 
      else if (pattern==0xbe) 
       {button.data='7', button.live=1;} 
      else if (pattern==0x7e) 
       {button.data='*', button.live=1;} 
      else 
      { 
       P10=0x0d; 
       if ((pattern=P10)==0xed) 
        {button.data='2', button.live=1;} 
       else if (pattern==0xdd) 
        {button.data='5', button.live=1;} 
       else if (pattern==0xbd) 
        {button.data='8', button.live=1;} 
       else if (pattern==0x7d) 
        {button.data='0', button.live=1;} 
       else 
       { 
        P10=0x0b; 
        if ((pattern=P10)==0xeb) 
         {button.data='3', button.live=1;} 
        else if (pattern==0xdb) 
         {button.data='6', button.live=1;} 
        else if (pattern==0xbb) 
         {button.data='9', button.live=1;} 
        else if (pattern==0x7b) 
         {button.data='#', button.live=1;} 
        else 
        { 
         P10=0x07; 
         if ((pattern=P10)==0xe7) 
          {button.data='A', button.live=1;} 
         else if (pattern==0xd7) 
          {button.data='B', button.live=1;} 
         else if (pattern==0xb7) 
          {button.data='C', button.live=1;} 
         else if (pattern==0x77) 
          {button.data='D', button.live=1;} 
         else 
          button.live=0; 
        } 
       } 
      } 

      P10=pattern; 

      if (button.live==0) 
       OSTimeDlyHMSM(0, 0, 0, 50); 
      else 
      { 
       if (P10==pattern) 
       OSTimeDlyHMSM(0, 0, 0, 50); 
       else 
       button.live=0; 
      } 

      P10=0x00;    
      if (button.live)  //if button live, set unread flag to 1 and start count down 
      { 
       button.unread=1; 
      } 

      if(button.unread&&button.data!='X') 
      { 
       key=button.data; 
       OSMboxPost(KeyMbox, (void *) &key); 
       button.live=0; 
       button.unread=0; 
      } 

      OSTimeDlyHMSM(0, 0, 0, 200); 
     } // End of While 
    } 
+0

왜 '{button.data ='A ', button.live = 1;}'형식의 줄에 쉼표 연산자를 사용하고 있습니까? – Dan

답변

0

을 달성하기 위해 폴링 또는 인터럽트를 사용하는 방법을 모르겠습니다. 프로세스/스레드의 우선 순위 (주어진 스레드/프로세스를 알고 스케줄러)를 기반으로 컨텍스트 전환을 할 때 알고 그것의 일이다

편집 :

이 완료되지 않은 이유에 이유

침입자가 어떤 mallicious 페이로드

+0

keyscan 작업을 작성할 때 어떤 키를 눌렀을 때 인터럽트를 원할 때 이것을 인식하는 스케줄러를 얻으려면 어떻게해야합니까? – Amanni

+0

@Amanni 일반적으로 키보드 인터럽트가있는 경우 키보드 프로세스로 누른 키를 사용하여 메시지를 보냅니다. 스케줄러는 눌려진 키로 보내는 메시지를 수령 할 키보드 프로세스를 언제 실행할 것인지를 알게되고 그것을 표시하거나 원하는대로 무엇이든 표시합니다. – Adrian

+0

죄송합니다. 죄송하지만 키보드 프로세스는 무엇을 의미합니까? – Amanni

2

키보드 처리 작업 그쪽을하는 것이 작업을 수행하는 일반적인 방법을 실행에 컨텍스트 스위치에 CPU를 (에서 높은 우선 순위의 작업을 말한다) 강제 낮은 우선 순위 작업을 산란 상상 t에는 세마포어에 걸려있는 루프가 있습니다. 키보드 인터럽트 처리기는 세마포어를 게시하므로 처리 작업이 준비되고 실행됩니다.

0

작업에 신호를 보내려면 사용 가능한 인터럽트 호환 (즉, 비 차단) IPC 메커니즘을 사용해야합니다. 키보드를 서비스하는 가장 간단한 방법은 ISR이 키 코드를 대기열에 넣는 것입니다. 사용자 입력을 원하는 모든 작업은이 대기열에서 읽습니다.

또는 ISR이 카운팅 세마포를 증가시키고 키보드 디코드를 작업으로 연기 할 수 있습니다. 그러면 작업이 사용자 입력을 읽는 작업에서 읽을 수있는 문자를 대기열에 배치 할 수 있습니다. 이는 디코드가 길거나 실행 시간이 가변적 인 경우에 바람직 할 수 있습니다.

특히 uC/OS-II에서 스케쥴러를 실행해야하는 ISR은 OSIntEnter() 및 OSIntExit() 호출을 사용해야합니다. 마지막으로 중첩 된 인터럽트가 완료 될 때 스케줄러를 실행하게하는 것은 OSIntExit()입니다. 그런 다음 예약 정책에 따라 작업이 예약됩니다. 스케줄링 정책에 맞춰 특정 태스크를 강제 실행하기 위해 정책을 우회하는 것은 불가능합니다. 특정 작업을 실행해야하는 경우 우선 순위를 가장 높게 설정하십시오.

일반적으로 ISR 프롤로그/에필로그 기능은 OS 호출을하는 ISR에만 필요합니다. 스케줄러를 실행하지 않아도되기 때문에입니다.

관련 문제