M5StickC의 FreeRTOS 태스크 정보 취득을 실현합니다

M5StickC의 FreeRTOS 작업 정보 취득을 실현합니다!

1 소개



작업이 어떤 상태인지 알고 싶어지고,
태스크 정보 취득의 vtaskList를 호출하면 지원 밖이었다.
신경이 쓰여서 작업 정보를 얻을 수 있는 방법을 찾았습니다.

(2021/7/16 추가) Espressif32v3.2에서 확인한 기사입니다.

2 준비



2.1 ESP-IDF 준비



htps : // 이 m / ld 또는 st / ms / c6d 2a 3a 09 예 d58 a 894
3.2 esp-idf 준비를 참조하십시오.

2.2 ESP-IDF.CMD를 엽니다.



2.3 빌드 가능한 프로젝트로 이동



cd\exmple\get-start\hello_world

2.3 프로젝트 설정 메뉴를 엽니다.



idf.py menuconfig

2.4 freertos로 이동





2.5 vtasklist를 활성화하는 옵션을 설정합니다.





2.6 vTaskGetRunTimeStats를 활성화하는 옵션을 설정합니다.





2.7 save하고 종료



2.8 빌드


idf.py build

2.9 라이브러리 복사



만약을 위해 덮어 쓰는 동안 라이브러리를 백업하는 것이 좋습니다.

복사 소스

esp-idf\examples\get-started\hello_world\build\esp-idf\freertos\libfreertos.a

복사 대상

platformio\packages\framework-arduinoespressif32\tools\sdk\lib\libfreertos.a

준비가 완료

3 함수 설명



3.1 태스크의 상태 취득



함수 이름
void vTaskList (char * pcWriteBuffer);

설명
htps //w w. f r와 s. rg / 00021. html#v sk ぃst

예: 결과
~~~
vtasklist
loopTask R 1 6200 12 1
IDLE0 R 0 1108 6 0
IDLE1 R 0 1092 7 1
Tmr Svc B 1 1564 8 0
ipc0 B 24572 2 0
esp_timer B 22 4148 1 0
ipc1 B 24540 3 1
~~~


작업 이름
작업 실행 상태
현재 스택 크기
작업 번호


xTaskCreate로 설정된 문자열
‘B’(Blocked) ‘R’(Ready) ‘D’(Deleted:waiting clean up) ‘S’(Suspended, or Blocked without a timeout)



3.2 작업 실행 시간



함수 이름
void vTaskGetRunTimeStats (char * pcWriteBuffer);

설명
htps //w w. f r와 s. rg / 00021. HTML #v sk 게 t 룬치메 S ts

예: 결과
vruntime
loopTask        159393          <1%
IDLE0           36000081                49%
IDLE1           35852602                49%
Tmr Svc         727             <1%
esp_timer       29              <1%
ipc1            21132           <1%
ipc0            2610            <1%

4 샘플 전체 코드



4.1 헤더 코드



PRIVILEGED_FUNCTION을 주석 처리합니다.

변경할 task.h 폴더
platformio\packages\framework-arduinoespressif32\tools\sdk\include\freertos\freertos\task.h

task.h
void vTaskList( char * pcWriteBuffer );// PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */

void vTaskGetRunTimeStats( char *pcWriteBuffer ); // PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */

4.2 소스 코드



B 버튼을 누를 때마다 작업 정보와 작업 시간을 출력합니다.
#include <M5StickC.h>
#include <LovyanGFX.hpp>

static LGFX lcd;

// button gpio number
const uint8_t buttonA_GPIO = 37;
const uint8_t buttonB_GPIO = 39;

static void buttonA_isr(void) {
  M5.update();
  Serial.printf("%d A interrupt\n", millis() );
}

static void buttonB_isr(void) {
  M5.update();
  Serial.printf("%d B interrupt\n", millis() );
}

void setup() {
  char msg_buffer[512];

  // put your setup code here, to run once:
  Serial.begin(115200);

  // Initialize the M5Stack object
  M5.begin();

  lcd.init();                       // 初期化

  // START
  lcd.fillScreen(BLACK);
  lcd.setCursor(10, 10);
  lcd.setTextColor(WHITE);
  lcd.setTextSize(1);
  lcd.printf("START");

  attachInterrupt(digitalPinToInterrupt(buttonA_GPIO), buttonA_isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(buttonB_GPIO), buttonB_isr, CHANGE);

  vTaskList(msg_buffer);

  Serial.println("vtasklist");
  Serial.printf("%s", msg_buffer);

}

void loop() {
  // put your main code here, to run repeatedly:

  if(M5.BtnB.wasPressed() != 0 ) {
    char msg_buffer[512];
    Serial.printf("%d was pressB\n", millis() );
    lcd.println("was pressB");

    vTaskList(msg_buffer);

    Serial.println("vtasklist");
    Serial.printf("%s", msg_buffer);

    Serial.println("vruntime");
    vTaskGetRunTimeStats(msg_buffer);
    Serial.printf("%s", msg_buffer);

    delay(10);
  }

  delay(1);
}

좋은 웹페이지 즐겨찾기