2014-09-18 1 views
1

저는 ARM 플랫폼 및 PowerPC 플랫폼 용 임베디드 응용 프로그램을 개발 중입니다. 이 응용 프로그램은 베어 메탈 응용 프로그램이므로 아무런 OS가 없습니다. 그것은 내 메인 어플리케이션 로직이 상주 할 무한 루프에 들어가기 전에 하드웨어의 모든 초기화를 수행합니다.임베디드 응용 프로그램에 인터럽트를 어떻게 실제로 포함시킬 수 있습니까?

내 주요 질문은 인터럽트가 하드웨어의 특정 특성과 하드웨어 하위 시스템 오류를 확인하고 재설정을 일으키고 발생을 기록하는 등의 비동기 동작 (기능과 유사한 스레드)을 수행하는 데 사용될 수있는 방법입니다. 워치 독 (watchdog)과 같은 것을 구현하려고 시도하고 있지만, 비동기 적으로 완벽하게 동작하고 (주력 응용 프로그램에 의한 개입을 필요로하지 않고 (워치 독을 걷어차는 것과 같은) 필요 없음) 감사!

+1

인터럽트 원본이 무엇인지에 따라 다릅니다. 플랫폼에 일종의 주기적 타이머가 있습니까? – Notlikethat

+0

@ 제목 내부 및 외부 모두 많은 인터럽트 소스가 있습니다. 여러 플랫폼에서 발견되는 인터럽트에 대한 가설적인 사용에 대해 알고 싶습니다. 예를 들어, 우리가 RaspberryPi를 사용하고 있다고 가정 해 봅시다. – penguin4hire

+0

나는 따라 할 수 있을지 모르겠다. 가상의 경우 인터럽트가 발생한다. 당신은 응답으로 물건을합니다. 이러한 인터럽트가 발생할 때, 따라서 실제 시스템과 운영 환경에 따라 유용합니다. 기본적으로 가벼운 RTOS를 설명하는 것 같습니다. 운 좋게 그것들은 벌써 물건이다. – Notlikethat

답변

1

전경 핸들러를 호출하는 중앙 루프가 무엇을 제안합니다.

인터럽트 서비스 루틴은 바이트 값을 어딘가에 넣습니다.

전경 핸들러

은 일부 의사 코드를 해당 바이트

전경과 배경 그 바이트와 "통신"(또는 어떤 종류의 구조) 다음

에서

The_Top_Of_This_Loop: 

      Call Check_What_ISR_01_Did 
      Call Check_What_ISR_02_Did 
      Call Check_What_ISR_03_Did 
      Call Check_What_ISR_04_Did 

      Call Update_The_Rest_Of_The_System 

      Jump The_Top_Of_This_Loop 

전경을 것 보면 서브 루틴은 이런 식으로 처리 할 것입니다 (다시 말하면, 의사 코드, 당신은 진짜 무엇인가를 씁니다)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    ;              ; 
    ; Subroutine name: Check_What_ISR_01_Did    ; 
    ;              ; 
    ; Looks at the indicator from the background and takes ; 
    ; the appropriate action.        ; 
    ;              ; 
    ; On Entry:  Nothing         ; 
    ;              ; 
    ; On Exit:  Reg_00 is messed up, don't believe it ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


    Check_What_ISR_01_Did: 

      Move Reg_00.Byte, The_ISR_01_Flag ;The ISR Set this if he did anything 
      Cmp  Reg_00.Byte, Nothing_Happened ;Did anything happen since last time ? 
      Jz  We_Are_Done      ;No, there's nothing to do 

      ;          ;else yes, so examine what to do 
      ;          ;and so on 
      ;          ; blah 
      ;          ; blah 
      ;          ; blah 


    We_Are_Done: 

      Return         ;End of foreground routine 
실제 ISR 이런 식으로 뭔가를 할 것입니다

...

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    ;              ; 
    ; Interrupt Service Routine 01       ; 
    ;              ; 
    ; Checks to see if a button was pushed.     ; 
    ;              ; 
    ; On Entry:  Nothing         ; 
    ;              ; 
    ; On Exit:  The_ISR_01_Flag is updated to hold  ; 
    ;    a value which the foreground will  ; 
    ;    use to make a decision     ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;              ; 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


    ISR_01: 

      Push {All The Registers And Flags} ;This is the background; leave with no trace 
      ;          ;Do whatever 
      ;          ; your real 
      ;          ; code needs 
      ;          ; to do to look 
      ;          ; at a button 

      Move Reg_00.Byte, Nothing_Happened ;This is a defined constant value somewhere 
      Move The_ISR_01_Flag, Reg_00.Byte ;The foreground routine will see this 
      Jump We_Are_Done      ;There's nothing else to do now 

    We_Are_Done: 

      Pop  {All The Registers And Flags} ;Don't forget the stack 

      IntReturn        ;End of ISR 

다시 말하지만,이 모든 의사 코드는, 그래서 진짜 구문과를 사용합니다.

1

Round-Robin Scheduling - 구현 중이거나 이미 존재하는 것만 사용해야합니다 (그 중 다수는 개방되어있어 인터넷에서 액세스 가능함).

라운드 로빈 (RR)은 컴퓨팅에서 프로세스 및 네트워크 스케줄러가 사용하는 알고리즘 중 하나입니다. 용어가 일반적으로 사용되므로 시간 조각은 각 프로세스에 동등한 부분 및 순환 순서로 할당되어 우선 순위없이 모든 프로세스를 처리합니다 (주기적 실행이라고도 함). 라운드 로빈 스케줄링은 간단하고, 구현하기 쉽고, 기아가 발생하지 않습니다. 라운드 로빈 스케줄링은 컴퓨터 네트워크의 데이터 패킷 스케줄링과 같은 다른 스케줄링 문제에도 적용될 수 있습니다. 운영 체제 개념입니다.

라운드 로빈 스케줄러는 프로세스를 공정하게 스케줄하기 위해 일반적으로 각 작업에 시간 슬롯 또는 퀀텀 (CPU 시간 허용)을 제공하고 그때까지 작업이 완료되지 않으면 작업을 중단합니다. 해당 작업에 시간 슬롯이 할당되면 다음에 작업이 재개됩니다. 시간 공유가 없거나 퀀텀이 직업의 크기에 비하면 큰 일자리를 창출 한 프로세스가 다른 프로세스보다 선호 될 것입니다.

라운드 로빈 알고리즘은 시간 할당량이 만료되면 스케줄러가 CPU에서 프로세스를 강제 종료하므로 선점 알고리즘입니다.

예를 들어 시간 슬롯이 100 밀리 초이고 job1이 완료하는 데 총 250 밀리 초가 걸리는 경우 라운드 로빈 스케줄러는 100 밀리 초 후에 작업을 일시 중단하고 다른 작업에 CPU 시간을 부여합니다. 다른 작업이 동일한 점유율 (각 100ms)을 가지면 job1은 또 다른 CPU 시간 할당을 얻게되고주기가 반복됩니다.이 프로세스는 작업이 완료되고 CPU에서 더 이상 시간이 필요하지 않을 때까지 계속됩니다.

하지만 응용 프로그램에 RR을 가져 오기 전에 먼저 타이머 인터럽트 및 해당 처리기를 활성화하고 조정할 수 있어야합니다. 타이머 IRQ를 처리하면 RR이나 간단한 RTOS에 대해 생각할 수도 있습니다.

1

타이머를 사용하여 하드웨어 특성을 정기적으로 확인할 수 있습니다. 그러나 타이머가 일정하고 시계와 동기화되어 있으면 동기식 인터럽트입니다.

비동기 적으로 발생하는 모든 인터럽트 (즉, 클럭과 동기화되지 않음)는 ISR에서 처리 할 수 ​​있습니다. ARM에서는 인터럽트를 예외로 간주합니다. 하드웨어 검증에 필요한 시간을 기반으로, 하드웨어 예외를 확인하는 루틴은 이러한 예외 핸들러에서 수행 될 수 있습니다.

RTOS의 주요 목적 중 하나는 시간 제한 결과를 제공하고 실시간 비동기 이벤트/인터럽트를 처리하는 것입니다. 그러나 RTOS는 컨텍스트 스위치에 의존하는 스케줄러의 존재로 인해 이러한 여러 비동기 작업/인터럽트를 처리 할 수 ​​있습니다. 따라서 베어 메탈에 스케쥴러의 얇은 레이어가 필요할 수 있습니다. 기간별 스케줄러 유형은 요구 사항에 따라 다릅니다. 시간이 문제가되지 않는다면, 대기열에 계속 들어가서 자신의 시간에 처리 할 수 ​​있습니다. 그렇지 않으면 적절한 스케줄러가 필요할 수 있습니다.

관련 문제