FreeRTOS 이해 8(타이머)

11574 단어 FreeRTOSM5stack

소프트웨어 타이머



이번에는 FreeRTOS의 타이머 기능을 사용해 본다. 그다지 좋은 예제는 아닐지도 모르지만, M5Stack에서 기동으로부터의 경과 시간을 표시해 본다.

환경



Arduino IDE에서 M5Stack 사용.

내용



기동으로부터의 경과 시간을 밀리 세컨드로 돌려주는 millis()를 사용해, 「분:초:밀리 세컨드」를 M5Stack LCD에 표시한다. 밀리초에 대해서는 10밀리초마다 표시를 갱신한다.

타이머 API



xTimerCreate 에 의해 타이머를 작성. 여기 에 있는 샘플을 참고로 만든다. 타이머 시작에는 xTimerStart 을 사용한다. 여기에서는 10msec, second, min의 각각에 대해 타이머를 설치했다.

소스 코드



우선 타이머 관련 설정.
#include <M5Stack.h>

TimerHandle_t xMsec, xSec, xMin;
void MsecCallback(TimerHandle_t);
void SecCallback(TimerHandle_t);
void MinCallback(TimerHandle_t);

void MsecCallback(TimerHandle_t xTim) {
  char buf[4];
  uint32_t current = millis();
  sprintf(buf, "%02d", (current%1000)/10);
  M5.Lcd.fillRect(210, 100, 70, 40, BLACK);
  M5.Lcd.drawString(buf, 210, 100);  
}

void SecCallback(TimerHandle_t xTim) {
  char buf[4];
  uint32_t current = millis();
  sprintf(buf, "%02d:", (current/1000)%60);
  M5.Lcd.fillRect(140, 100, 70, 40, BLACK);
  M5.Lcd.drawString(buf, 140, 100); 
}

void MinCallback(TimerHandle_t xTim) {
  char buf[4];
  uint32_t current = millis();
  sprintf(buf, "%02d:", (current/(60*1000))%60);
  M5.Lcd.fillRect(70, 100, 70, 40, BLACK);
  M5.Lcd.drawString(buf, 70, 100);   
}

매 10밀리초, 초당 매분마다 호출되는 콜백 함수의 정의. M5Stack의 묘화 API를 사용해, 이전의 표시 수치의 삭제(검은 채우기) 및 신수치의 표시를 실시한다. 좌표와 검정 채우기 크기는 트라이 & 에러로 결정했다. 1밀리초 단위 표시는 무시.
void setup() {
  M5.begin();
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(4);
  M5.Lcd.drawString("00:", 70, 100);  // min
  M5.Lcd.drawString("00:", 140, 100); // sec
  M5.Lcd.drawString("00", 210, 100);  // msec

  xMsec = xTimerCreate("MsecTimer", pdMS_TO_TICKS(10), pdTRUE, (void*)0, MsecCallback);
  xSec = xTimerCreate("SecTimer", pdMS_TO_TICKS(1000), pdTRUE, (void*)0, SecCallback);
  xMin = xTimerCreate("MinTimer", pdMS_TO_TICKS(60*1000), pdTRUE, (void*)0, MinCallback);
  xTimerStart(xMsec, 0);
  xTimerStart(xSec, 0);
  xTimerStart(xMin, 0);
}

void loop() {
  // Nothing
}


setup()에서, LCD의 초기화 처리 및 「00:00:00」표시, 타이머의 작성(TimerCreate()) 및 개시(TimerStart())를 행한다. 콜백 함수로 모든 것을 핸들링하기 때문에 loop()는 아무것도 하지 않고, (delay()를 넣는 것이 낫지?).

실험




성공.

사실은



시간 초과시 호출되는 콜백 함수로 장시간 처리하는 것은 바람직하지 않습니다. 속편(스톱워치)으로 이 개선을 실시한다.

좋은 웹페이지 즐겨찾기