데이터를 처리하는 데 시간이 오래 걸리는 라이브러리가 있습니다. 어떤 경우에는 함수의 결과를 기다릴 수 없지만 수행해야 할 다른 작업이 있습니다. 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 같은 것을 추가해야한다는 것을 의미합니다. 다른 방법이 있습니까?
외부 컨트롤러에서 트리거 된 인터럽트가 아닌 코드에서 트리거 할 수있는 "예비"인터럽트가있는 경우이를 "후크 할"수 있습니다. 예를 들어 0으로 나누기 (나중에이 SW를 개발할 때 버그를 잡을 능력이 없어지므로이 예제를주의 깊게 살펴보십시오). 그렇지 않으면 시간 슬롯을 정의하고 무한 루프를이 슬롯으로 분할 한 다음 각 슬롯에서 원하는 작업을 수행하십시오. –
Protothreads는 마 법적으로 정지 가능한 함수를 생성하지 않지만 루프 내부에서 항상 벗어나기 위해 함수를 수정해야합니다 (내부 매크로는 C 매크로 안에 숨겨져 있음). 따라서 이것을 수행 할 예정이라면 간단히 작은 덩어리로 작업하는 기능을 수정하지 않는 것이 어떻습니까? 또는 저수준 인터럽트 (예 : 주요 기능)에서 처리를 수행하고 우선 순위가 높은 인터럽트를 사용하여 실행을 중단하고 정기적 간격으로 "더 중요한 작업"을 수행하십시오. – Groo
당신의 문제에 직면했을 때 보통 사람들은 작은 작업 스케줄러 ([this] (http://playground.arduino.cc/Code/TimerScheduler)처럼 간단 할 수 있음)를 추가/생성한다는 것이므로 실제로 여러 개의 작업이 실행 중입니다. 아니면 작은 함수 (예 : do_other_stuff() 및 and_some_more_stuff()와 같이)를 실행합니다.타이머 인터럽트, 또는'process_data()'함수를 재 작성하여 장기간 실행되지는 않지만 단지 작은 데이터를 처리하고 그것이 얼마나 멀리 왔는지 기억하며 다음에 호출 된 다음에 중단 된 곳에서 처리를 재개합니다 . – nos