aug 02, 2019
admin
0
16

rtos 프로그래밍 예제

참고: FreeRTOS 작업이 구현되는 방법의 예이지만 작업을 수행하려면 다음 게시물에서 강조 표시될 몇 가지 추가 단계를 수행해야 합니다. 무한 루프에 추가하려면 일부 시간적 제어가 필요합니다. 예를 들어 … : // 플래그는 // 제어 주기가 시작되는 시간을 표시하는 데 사용됩니다 (이 예제에서는 무시되는 상호 제외 // 문제). int 타이머만료됨; 타이머 인터럽트에 대한 서비스 루틴입니다. 이 // 모든 10ms를 실행 하도록 구성 됩니다. void TimerInterrupt (void) { 타이머만료 = true; } // Main() 여전히 무한 루프를 포함합니다 – // 플랜트 컨트롤에 대한 호출이 추가되었습니다. int main(void) { 초기화(); { // 다음 // 사이클에 대한 시간이 될 때까지 회전. 타이머만료됨 = false; 스캔키패드(); 업데이트액(); LED는 // 인터럽트 수 또는 // 다른 타이머의 수를 사용할 수 있습니다. 프로세스 LED(); Comms 버퍼는 10ms의 // 데이터를 담을 수 있을 만큼 커야 합니다.

프로세스RS232문자(); 프로세스HTTP요청(); } // 프로세서는 어떤 // 인터럽트에 의해 깨어 제공 여기에 잠을 넣을 수 있습니다. } // 여기에 오지 말아야합니다. return 0; } … 그러나 이것은 허용 가능한 솔루션이 아닙니다: 휴먼 인터페이스 함수는 최대 제한만 지정하기 때문에 다른 유형의 타이밍 요구 사항을 갖습니다. 예를 들어 키패드는 적어도 10ms마다 스캔해야 하지만 최대 10ms의 속도는 허용됩니다. 각 함수를 전체적으로 실행하도록 허용하는 데 시간이 너무 오래 걸립니다. 각 함수를 여러 상태로 분할하여 방지할 수 있습니다. 각 호출마다 하나의 상태만 실행됩니다. 컨트롤 함수를 예로 사용하여 컨트롤 주기 함수의 상태를 정의합니다.

typdef 열거형 eCONTROL_STATES { eStart, // 새 주기를 시작합니다. eWait1, // 첫 번째 센서 응답을 기다립니다. eWait2 // 두 번째 센서 응답을 기다립니다. } eControlStates; void PlantControlCycle (void) { 정적 eControlState eState = eStart; 스위치 (eState) { 사례 eStart : transmitRequest (); eState = eWait1; break; 케이스 eWait1; (첫 번째 센서에서 데이터를 얻었다) { eState = eWait2; } / 어떻게 시간 시간을 처리 할 수 있습니까? (첫 번째 센서에서 데이터를 얻었다) { 수행 제어 알고리즘(); 전송 결과(); eState = eStart; } // 시간 외는 어떻게 처리됩니까? 휴식; } }이 함수는 이제 구조적으로 더 복잡하며 추가 일정 문제가 발생합니다. 코드 자체는 시간 시간 및 오류 조건을 처리하는 등의 추가 상태가 추가될 때 이해하기 어려워집니다. 또는 무한 루프 솔루션은 각 루프에서 다른 함수를 호출하도록 수정할 수 있습니다 . 초기화(); 각 함수는 상태 // 기계로 구현되므로 // 빠르게 실행되도록 보장되지만 자주 호출되어야 합니다. 타이머 빈도가 상승했습니다. ( ;; ) ) { 경우 (타이머 만료) { 카운터 ++; 스위치 (카운터) { 케이스 0 : ControlCycle(); 스캔키패드(); 휴식; 사례 1 : UpdateLCD(); 휴식; 사례 2 : 제어 주기(); 프로세스RS232문자(); 휴식; 사례 3 : 프로세스HTTPRequests(); 카운터 = -1을 시작으로 돌아가십시오. 휴식; } 타이머만료됨 = false; } } // 여기에 오지 말아야합니다. return 0; } 더 많은 인텔리전스를 이벤트 카운터를 통해 도입할 수 있으며, 이에 따라 우선 순위가 낮은 기능은 서비스가 필요한 이벤트가 발생한 경우에만 호출됩니다. { if (타이머 만료됨) { 카운터 ++; // 다른 루프마다 제어 주기를 처리합니다.

POST CATEGORIES

Okategoriserade