2017-02-14 3 views
0

데이터를 처리하는 데 시간이 오래 걸리는 라이브러리가 있습니다. 어떤 경우에는 함수의 결과를 기다릴 수 없지만 수행해야 할 다른 작업이 있습니다. OS가 문제가 아닌 시스템에서 스케줄러가 도움을 줄 수 있습니다. 그러나 OS가없는 시스템도 있습니다. 이 시스템에서 나는 비슷한 것을 달성하기를 원한다. 즉, 함수가 호출되어 주어진 계산 (예 : 10ms) 후에 계산이 수행된다. 그런 다음 다른 작업이 완료되고 데이터 처리 함수가 다시 호출되어 왼쪽으로 이동합니다.OS 스케줄러가없는 시간 조각 기능

while(1) { 
    process_data(); // resumes from where it returned before, runs for 10ms and returns 
    do_other_stuff(); 
    and_some_more_stuff(); 
} 

어떻게 달성 할 수 있습니까?

나는 protothreads의 개념을 이미 발견했으나, 이것은 계산에 10ms가 걸릴 수있는 모든 x 명령문 다음에 PT_WAIT 같은 것을 추가해야한다는 것을 의미합니다. 다른 방법이 있습니까?

+1

외부 컨트롤러에서 트리거 된 인터럽트가 아닌 코드에서 트리거 할 수있는 "예비"인터럽트가있는 경우이를 "후크 할"수 있습니다. 예를 들어 0으로 나누기 (나중에이 SW를 개발할 때 버그를 잡을 능력이 없어지므로이 예제를주의 깊게 살펴보십시오). 그렇지 않으면 시간 슬롯을 정의하고 무한 루프를이 슬롯으로 분할 한 다음 각 슬롯에서 원하는 작업을 수행하십시오. –

+1

Protothreads는 마 법적으로 정지 가능한 함수를 생성하지 않지만 루프 내부에서 항상 벗어나기 위해 함수를 수정해야합니다 (내부 매크로는 C 매크로 안에 숨겨져 있음). 따라서 이것을 수행 할 예정이라면 간단히 작은 덩어리로 작업하는 기능을 수정하지 않는 것이 어떻습니까? 또는 저수준 인터럽트 (예 : 주요 기능)에서 처리를 수행하고 우선 순위가 높은 인터럽트를 사용하여 실행을 중단하고 정기적 간격으로 "더 중요한 작업"을 수행하십시오. – Groo

+0

당신의 문제에 직면했을 때 보통 사람들은 작은 작업 스케줄러 ([this] (http://playground.arduino.cc/Code/TimerScheduler)처럼 간단 할 수 있음)를 추가/생성한다는 것이므로 실제로 여러 개의 작업이 실행 중입니다. 아니면 작은 함수 (예 : do_other_stuff() 및 and_some_more_stuff()와 같이)를 실행합니다.타이머 인터럽트, 또는'process_data()'함수를 재 작성하여 장기간 실행되지는 않지만 단지 작은 데이터를 처리하고 그것이 얼마나 멀리 왔는지 기억하며 다음에 호출 된 다음에 중단 된 곳에서 처리를 재개합니다 . – nos

답변

2

process_data 기능을 상태 시스템으로 구현하십시오. 너무 긴 처리 알고리즘을 여러 짧은 단계/상태로 나눕니다. process_data 내에 정적 상태 변수를 선언하여 각 ​​호출의 이전 상태를 기억하십시오. process_data이 호출 될 때마다 하나의 상태 만 수행됩니다. 그런 다음 다시 호출되면 중단 된 부분을 집어 들고 다음 단계를 수행합니다. 이 메서드를 사용하면 각 호출에 걸리는 시간은 디자인 타임에 단계를 나누는 방법에 따라 결정됩니다. 런타임에 실행 시간을 제한 할 수 없습니다.

처리가 반복 루프에서 수행되는 것이라면 루프의 하드웨어 타이머를 읽고 제한 시간에 도달하면 루프에서 빠져 나올 수 있습니다. 그러나 정적 변수를 사용하여 처리가 중단 된 다음 호출을 기억하십시오.

2

other_stuff이 비교적 짧으면 타이머 ISR에서 수행 할 수 있습니다.

(RT) OS의 작업 컨텍스트를 절약하고 싶지 않은 경우에는 스스로 실행해야합니다. 장시간 실행되는 처리 기능을 여러 조각으로 나눠서 처리 컨텍스트를 저장하고 반환하십시오. 당신의 주요 파견 지점으로 다음 단계가 완료되면 저장된 컨텍스트로 돌아가서 중단 한 부분에서 다시 처리를 시작하십시오. (이것은 어느 정도 protothreads가 무엇입니까)

최종 결과는 작업이 완료되면 멀티 태스킹 시간 슬라이싱 OS의 대부분을 구현했을 수 있다는 것입니다.