• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    미해결

태스크 별 주기 주는 방법

23.05.17 15:53 작성 조회수 498

1

안녕하세요

task 1, task 1, task 1 이 있다고 가정할때 각각 100 200 500ms마다 한번씩 해야한다고 가정할 경우 어떻게 주기를 관리하나요?

 

예를 들어 단순하게 osdelay(100); 한다면 단순히 0.1초만 보장하기 때문에 나중에는 누적되어서 오차가 생길거라고 생각되어집니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. 이상민님

task1, task2, task3 for/while 과 같은 루프문의 회전 주기로 각 100, 200, 500ms 을 보장하고 싶으신 것으로 질문을 이해하였습니다. 맞나요?

그 경우는 vTaskDelay 보다는 vTaskDelayUntil 을 써주는 것이 맞습니다.

결과적으로 회전 주기가 정확하게 보장됩니다. 자세한 내용은 아래 링크를 참조바랍니다.

https://www.freertos.org/vtaskdelayuntil.html

 

이상민님의 프로필

이상민

질문자

2023.05.18

답변주셔서 감사합니다. 현재 주기적으로 xTaskGetTickCount가 사라지는 현상이 있어 질문드렸습니다.
혹시 이런 경우 어떻게 디버깅 해야할지 노하우가 있으실까요??

imageimage

 

더 확인해보니 다른 태스크7 실행 주기를 delayuntil을 통하여 100ms마다 하기로 했는데

500ms나 그 이상의 속도로 실행되고 있습니다.

어떤 것을 확인해봐야 하나요?

질문하시면서 소스코드를 첨부하거나 더 자세한 정황을 설명하시면 더 좋은 양질의 답변을 받으실 수 있습니다. 참고해주세요~

보내주신 정보에 근거하여 제 의견을 드립니다.

하나,

보여주신 로그 시간 정보에 따르면 5532 ~ 5760 시간 구간에서 다른 태스크나 인터럽트에 의해서 선점당한 것으로 볼 수 있지 않을까요?

강의 영상중 '섹션 17. 데드락과 디버깅 도구 > LogicSniffer의 활용방법 소개' 을 참고하시면 이와같은 상황의 문제 해결에 도움이 되실 것으로 생각됩니다.

두울,

아래 코드 예시처럼 이 코드 블럭을 'xLastWakeTime = xTaskGetTickCount(); '

for 루프문 직전에 호출해보세요. 그리고, 시간을 100으로만 하지 마시고 값에 변화를 주시면서 (예를들면 200, 700), 루프 회전 주기의 추이를 지켜보세요.

// Perform an action every 10 ticks.
 void vTaskFunction( void * pvParameters )
 {
 TickType_t xLastWakeTime;
 const TickType_t xFrequency = 100;
     .
     .
     사용자 코드
     .
     .
     // Initialise the xLastWakeTime variable with the current time.
     xLastWakeTime = xTaskGetTickCount();

     for( ;; )
     {
         // Wait for the next cycle.
         vTaskDelayUntil( &xLastWakeTime, xFrequency );

         // Perform action here.
     }
 }
이상민님의 프로필

이상민

질문자

2023.05.22

답변주셔서 감사합니다.
말씀주신대로 다른 태스크에서 선점되는것으로 파악되었습니다.
RTOS에 대한 질문이 생기는데, rtos가 시간을 지킬수 있게 제가 관리해야 하는 것으로 이해했습니다. os없이 그냥 펌웨어로 해도 시간을 제가 지킬수 있는데 rtos사용 이유와 범위를 여쭙고 싶습니다.

예를 들어 이런 어플리케이션은 펌웨어가 맞는데, 이런 어플리케이션은 rtos가 적합하다
이런 어플리케이션은 이러한 이유 때문에 rtos를 써야한다

라는 범위가 궁금합니다.

질문의 취지는 다른 의도는 1도 없고 rtos에 쓰기 적합한 어플리케이션이 어떤 것인지 몰라서 여쭤봅니다

펌웨어로 개발하다가 멀티태스킹 요구사항이 생기면 보통 RTOS 사용을 검토하게 됩니다. RTOS 기반 제품은 이런점에서 네트웍 지원, 오픈소스 사용 등의 복잡한 고려사항 때문에 선택하게 되는 임베디드 리눅스 기반 제품과 차별화됩니다.

RTOS 시스템은 멀티태스킹이 가능한 펌웨어로 생각하면 좋겠다는 것이죠.

RTOS(RealTime Operating System) 은 멀티태스킹을 수행하면서 실시간도 보장해 준다고 하는 숨은 뜻을 이해하시면 좋겠습니다.

프로그램의 복잡도가 높지않다는 전제 조건이 있다면, 배경프로세스(메인함수에서 실행되는 프로세스) 와 전경프로세스(인터럽트핸들러) 로만 동작하는 펌웨어야 말로 가장 실시간 시스템이라고 생각하시면 됩니다.