ESP8266_RTOS_SDK V3を使ってみる

常駐タスクの一覧


esp-open-rtos

esp-open-rtosでは以下のコードで常駐しているシステムタスクの一覧を表示することができます。
WiFi接続は使わないモードで起動しています。
/* The example of esp-free-rtos
 *
 * This sample code is in the public domain.
 */
#include <stdlib.h>
#include "espressif/esp_common.h"
#include "esp/uart.h"
#include "FreeRTOS.h"
#include "task.h"

void user_init(void)
{
    uart_set_baud(0, 115200);
    printf("SDK version:%s\n", sdk_system_get_sdk_version());
    printf("pcTaskGetName=%s\n",pcTaskGetName(0));
    printf("uxTaskPriorityGet=%d\n",(int)uxTaskPriorityGet(0));
    sdk_wifi_set_opmode(NULL_MODE);

    TaskStatus_t *pxTaskStatusArray;
    volatile UBaseType_t uxArraySize, x;
    //unsigned long ulTotalRunTime, ulStatsAsPercentage;
    uint32_t ulTotalRunTime, ulStatsAsPercentage;

    /* Take a snapshot of the number of tasks in case it changes while this
    function is executing. */
    uxArraySize = uxTaskGetNumberOfTasks();
    //uxArraySize = uxCurrentNumberOfTasks();
    printf("uxArraySize=%d\n",(int)uxArraySize);

    /* Allocate a TaskStatus_t structure for each task.  An array could be
    allocated statically at compile time. */
    pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
    //printf("pxTaskStatusArray=%x\n",(int)pxTaskStatusArray);

    if( pxTaskStatusArray != NULL )
    {
       /* Generate raw status information about each task. */
       uxArraySize = uxTaskGetSystemState( pxTaskStatusArray,
                                 uxArraySize,
                                 &ulTotalRunTime );

       /* For percentage calculations. */
       printf("ulTotalRunTime=%d\n",(int)ulTotalRunTime);
       ulTotalRunTime /= 100UL;

       /* For each populated position in the pxTaskStatusArray array,
       format the raw data as human readable ASCII data. */
       for( x = 0; x < uxArraySize; x++ ) {
         /* What percentage of the total run time has the task used?
         This will always be rounded down to the nearest integer.
         ulTotalRunTimeDiv100 has already been divided by 100. */

         ulStatsAsPercentage = 0;
         if ( ulTotalRunTime > 0)
           ulStatsAsPercentage =
              pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;

         UBaseType_t HighWaterMark =
              uxTaskGetStackHighWaterMark ( pxTaskStatusArray[ x ].xHandle );


         if( ulStatsAsPercentage > 0UL ) {
            printf( "%-20s\t%d\t%lu\t%lu\t%lu\t%lu\t%lu%%\r\n",
                   pxTaskStatusArray[ x ].pcTaskName,
                   pxTaskStatusArray[ x ].eCurrentState,
                   (unsigned long)pxTaskStatusArray[ x ].xTaskNumber,
                   (unsigned long)pxTaskStatusArray[ x ].uxCurrentPriority,
                   (unsigned long)HighWaterMark,
                   (unsigned long)pxTaskStatusArray[ x ].ulRunTimeCounter,
                   (unsigned long)ulStatsAsPercentage );
         } else {
            /* If the percentage is zero here then the task has
            consumed less than 1% of the total run time. */
            printf("%-20s\t%d\t%lu\t%lu\t%lu\t%lu\t<1%%\r\n",
                   pxTaskStatusArray[ x ].pcTaskName,
                   pxTaskStatusArray[ x ].eCurrentState,
                   (unsigned long)pxTaskStatusArray[ x ].xTaskNumber,
                   (unsigned long)pxTaskStatusArray[ x ].uxCurrentPriority,
                   (unsigned long)HighWaterMark,
                   (unsigned long)pxTaskStatusArray[ x ].ulRunTimeCounter );
         }

       } // end for

       /* The array is no longer needed, free the memory it consumes. */
       vPortFree( pxTaskStatusArray );
    }
}

実行すると以下の様に表示されます。
uiTは自分自身なので、6個のシステムタスクが動いています。
SDK version:0.9.9
pcTaskGetName=uiT
uxTaskPriorityGet=14
uxArraySize=7
ulTotalRunTime=0
uiT                     0       4       14      897     0       <1%
rtc_timer_task          1       7       12      178     0       <1%
tcpip_thread            1       3       10      458     0       <1%
Tmr Svc                 1       6       2       490     0       <1%
pmTask                  1       2       1       154     0       <1%
IDLE                    1       5       0       104     0       <1%
ppTask                  2       1       14      433     0       <1%


ESP8266_RTOS_SDK

ESP8266_RTOS_SDKでuxTaskGetSystemState()を使うためには、menuconfig で以下の項目を有効にする必要が有りま す。


少し前のバージョンではこの項目はありません。
以下のスクリーンはSDK versionが「v3.2-dev-44-g5e98e3f-dirty」の時の物ですが、
「v3.2-dev-133-g5f2fd09c」では全く違うスクリーンになっています。


ESP8266_RTOS_SDKでは以下のコードで常駐しているシステムタスクの一覧を表示することができます。
/* The example of ESP8266_RTOS_SDK
 *
 * This sample code is in the public domain.
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "lwip/init.h"
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "lwip/init.h"

void app_main(void)
{
    printf("SDK version:%s\n", esp_get_idf_version());
    printf("pcTaskGetName=%s\n",pcTaskGetName(0));
    printf("uxTaskPriorityGet=%d\n",(int)uxTaskPriorityGet(0));

    TaskStatus_t *pxTaskStatusArray;
    volatile UBaseType_t uxArraySize, x;
    uint32_t ulTotalRunTime, ulStatsAsPercentage;

    /* Take a snapshot of the number of tasks in case it changes while this
    function is executing. */
    uxArraySize = uxTaskGetNumberOfTasks();
    //uxArraySize = uxCurrentNumberOfTasks();
    printf("uxArraySize=%d\n",(int)uxArraySize);

    /* Allocate a TaskStatus_t structure for each task.  An array could be
    allocated statically at compile time. */
    pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
    //printf("pxTaskStatusArray=%x\n",(int)pxTaskStatusArray);

    if( pxTaskStatusArray != NULL )
    {
       /* Generate raw status information about each task. */
       uxArraySize = uxTaskGetSystemState( pxTaskStatusArray,
                                 uxArraySize,
                                 &ulTotalRunTime );

       /* For percentage calculations. */
       printf("ulTotalRunTime=%d\n",(int)ulTotalRunTime);
       ulTotalRunTime /= 100UL;

       /* For each populated position in the pxTaskStatusArray array,
       format the raw data as human readable ASCII data. */
       for( x = 0; x < uxArraySize; x++ ) {
         /* What percentage of the total run time has the task used?
         This will always be rounded down to the nearest integer.
         ulTotalRunTimeDiv100 has already been divided by 100. */

         ulStatsAsPercentage = 0;
         if ( ulTotalRunTime > 0)
           ulStatsAsPercentage =
              pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;

         UBaseType_t HighWaterMark =
              uxTaskGetStackHighWaterMark ( pxTaskStatusArray[ x ].xHandle );


         if( ulStatsAsPercentage > 0UL ) {
            printf( "%-20s\t%d\t%lu\t%lu\t%lu\t%lu\t%lu%%\r\n",
                   pxTaskStatusArray[ x ].pcTaskName,
                   pxTaskStatusArray[ x ].eCurrentState,
                   (unsigned long)pxTaskStatusArray[ x ].xTaskNumber,
                   (unsigned long)pxTaskStatusArray[ x ].uxCurrentPriority,
                   (unsigned long)HighWaterMark,
                   (unsigned long)pxTaskStatusArray[ x ].ulRunTimeCounter,
                   (unsigned long)ulStatsAsPercentage );
         } else {
            /* If the percentage is zero here then the task has
            consumed less than 1% of the total run time. */
            printf("%-20s\t%d\t%lu\t%lu\t%lu\t%lu\t<1%%\r\n",
                   pxTaskStatusArray[ x ].pcTaskName,
                   pxTaskStatusArray[ x ].eCurrentState,
                   (unsigned long)pxTaskStatusArray[ x ].xTaskNumber,
                   (unsigned long)pxTaskStatusArray[ x ].uxCurrentPriority,
                   (unsigned long)HighWaterMark,
                   (unsigned long)pxTaskStatusArray[ x ].ulRunTimeCounter );
        }

      } // end for

      /* The array is no longer needed, free the memory it consumes. */
      vPortFree( pxTaskStatusArray );
   }
}

実行すると以下の様に表示されます。
uiTは自分自身なので、5個のシステムタスクが動いています。
SDK version:v3.2-dev-44-g5e98e3f-dirty
pcTaskGetName=uiT
uxTaskPriorityGet=14
uxArraySize=6
ulTotalRunTime=0
uiT                     0       1       14      2576    0       <1%
ppT                     1       4       13      1960    0       <1%
rtT                     1       6       12      1960    0       <1%
pmT                     1       5       11      936     0       <1%
Tmr Svc                 1       3       2       1968    0       <1%
IDLE                    1       2       0       680     0       <1%

両方を比べるとこのようになります。
esp-open-rtosにはtcpip_threadタスクが動いています。
また、全体的にESP8266_RTOS_SDKの方が、使用するStackが大きいことが分かります。
こ ちらにESP8266_RTOS_SDKのシステムタスクの詳細が公開されています。
esp-open-rtos rtc_timer_task tcpip_thread Tmr Svc pmTask IDLE ppTask
178 458 490 154 104 433
ESP8266_RTOS_SDK rtT 無し Trm Svc pmT IDLE ppT
1960
1968 936 680 1960



SDKのバージョンを3.2→3.4にアップデートしたら、システムタスクの数が変わりました。
今まで常駐していたppT、rtT、pmTが無くなりました。
ppTとrtTはWiFi関連のタスクで、pmTはシステムスリープ関連のタスクです。
SDK version:v3.4-dev-415-ge09f004f
pcTaskGetName=uiT
uxTaskPriorityGet=1
uxArraySize=3
ulTotalRunTime=0
uiT                     0       1       1       2728    0       <1%
IDLE                    1       2       0       944     0       <1%
Tmr Svc                 2       3       2       1872    0       <1%

続く....