esp-open-rtosを使ってみる

常駐タスクの一覧

esp-open-rtosではバックグラウンドで常に6つのタスクが動いていることが分かりました。
そこで、常駐で動いているタスクの一覧を表示してみます。
こちらに uxTaskGetSystemState()のサンプルコードが公開されていました。
esp-open-rtosではuxCurrentNumberOfTasks()ではなく、uxTaskGetNumberOfTasks() が実装されています。
以下のコードでタスクの一覧を表示します。
/* 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 );
    }
}

結果は以下の様になりました。

左から
pcTaskName
eCurrentState
xTaskNumber
uxCurrentPriority
HighWaterMark
ulRunTimeCounter

uiTは自分自身なので、それ以外がシステムタスクです。
IDLEタスクは何も処理を行う必要がないときに動くタスク(CPUを消費するタスク)ですが、
それ以外はよく分からないので、深く追及していません。
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%

続く....