esp-open-rtosを使ってみる

IdleHoolとTickHook

FreeRTOSでは、全てのタスクが待ち状態になっているときは、IDLEタスクが動きます。
IDLEタスクが動いているときは、vApplicationIdleHook()が呼ばれます。
examples/tick_idle_hooksに、vApplicationIdleHook() と vApplicationTickHook() のサンプルが有りますが、
今一つ良く分からないので、以下のコードで確認してみました。
/* The example of esp-open-rtos
 *
 * This sample code is in the public domain.
 */
#include "espressif/esp_common.h"
#include "esp/uart.h"
#include "FreeRTOS.h"
#include "task.h"
//#include "queue.h"

long idle_count = 0;
long tick_count = 0;

//時間稼ぎ
void ConsumptionTick(int delay) {
    TickType_t startTick;
    TickType_t endTick;
    TickType_t nowTick;
    startTick = xTaskGetTickCount();
    endTick = startTick + delay;
    //printf("startTick=%d endTick=%d\n",startTick,endTick);
    while(1) {
      nowTick = xTaskGetTickCount();
      if (nowTick > endTick) break;
    }
}

void vApplicationIdleHook(void)
{
    idle_count++;
}

void vApplicationTickHook(void)
{
    tick_count++;
}

void user_init(void)
{
    TickType_t nowTick;
    uart_set_baud(0, 115200);
    nowTick = xTaskGetTickCount();
    printf("[%d] SDK version:%s\n",nowTick,sdk_system_get_sdk_version());

    int idle_rate;
    idle_count = 0;
    tick_count = 0;
    ConsumptionTick(200);
    nowTick = xTaskGetTickCount();
    idle_rate = idle_count / tick_count;
    printf("[%d] idle_count=%ld tick_count=%ld idle_rate=%d\n",
      nowTick,idle_count,tick_count,idle_rate);

    idle_count = 0;
    tick_count = 0;
    vTaskDelay(1);
    nowTick = xTaskGetTickCount();
    idle_rate = idle_count / tick_count;
    printf("[%d] idle_count=%ld tick_count=%ld idle_rate=%d\n",
      nowTick,idle_count,tick_count,idle_rate);

    idle_count = 0;
    tick_count = 0;
    vTaskDelay(10);
    nowTick = xTaskGetTickCount();
    idle_rate = idle_count / tick_count;
    printf("[%d] idle_count=%ld tick_count=%ld idle_rate=%d\n",
      nowTick,idle_count,tick_count,idle_rate);

    idle_count = 0;
    tick_count = 0;
    vTaskDelay(100);
    nowTick = xTaskGetTickCount();
    idle_rate = idle_count / tick_count;
    printf("[%d] idle_count=%ld tick_count=%ld idle_rate=%d\n",
      nowTick,idle_count,tick_count,idle_rate);
}

結果は以下の様になります。
ConsumptionTick()が呼ばれて、CPUが全速力で動いているときはvApplicationIdleHook()は一度も呼ばれ ません。
vTaskDelay()で適当な待ち時間を与えてやると、vApplicationIdleHook()が定期的に呼ばれます。
vApplicationTickHook()では経過時間を知ることができるので、これを使ってidle_rateを求めることができます。
idle_rateとはCPUの「暇さ加減」を数値で表したもので、0は「余裕なし」、20000(ぐらい)は「ものすごく暇」となります。
[0] SDK version:0.9.9
[201] idle_count=0 tick_count=201 idle_rate=0
[202] idle_count=17865 tick_count=1 idle_rate=17865
[212] idle_count=198968 tick_count=10 idle_rate=19896
[312] idle_count=1994814 tick_count=100 idle_rate=19948

続く....