LoginSignup
2
2

More than 3 years have passed since last update.

FreeRTOSスケジューリング性能測定

Posted at

概要

FreeRTOSのスケジューリングレスポンス性能を測ってみる

事前知識

FreeRTOSスケジューリング機能まとめ
ARM Cortex-R5(Armv7-R) PMU使い方(パフォーマンス測定方法)
FreeRTOS Debug, Utility系のTips

測定

以下、いくつかのパターンを測定します。

共通環境

FreeRTOSConhig.h

Config 設定値
configUSE_PREEMPTION 1
configUSE_TIME_SLICING 1
configUSE_PORT_OPTIMISED_TASK_SELECTION 1
configIDLE_SHOULD_YIELD 1

この設定で行う。変更する場合は、各項目に記載する。
Configの意味は FreeRTOSスケジューリング機能まとめ 参照。

評価ボード

Ultra96
https://www.96boards.org/product/ultra96/
http://zedboard.org/product/ultra96

CortexR5のsingle coreで測定

ちゃんと測定できているか確認

タスク1つで1秒delayさせた前後で測定してみる。プリエンプトされるこないのでほぼ1秒が測定できるはず。

コード(測定部分のみ)

main.c
unsigned long start, end;
static TaskHandle_t TaskHdlPri01;
static void TaskPri01( void *pvParameters ) {
    while(1) {
        start = pmon_start_cycle_counter();
        vTaskDelay(pdMS_TO_TICKS(1000));
        end = pmon_read_cycle_counter();
        xil_printf("time = %ld\r\n", end - start);
    }
}

int main( void )
{
    ...
    xTaskCreate(TaskPri00,"TaskPri00", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, &TaskHdlPri00 );
    ...

結果

time = 499993470
time = 499992880
time = 499996332
time = 499996662

あれ、スペックではR5は600MHzのはずだが、、
xparameters.hで↓な記述があった。測定は大丈夫そう。

xparameters.h
/* Canonical definitions for peripheral PSU_CORTEXR5_0 */
#define XPAR_CPU_CORTEXR5_0_CPU_CLK_FREQ_HZ 500000000

単純なプリエンプト性能

TaskPri00 優先度0
TaskPri01 優先度1
として
1. TaskPri01がSuspend
2. TaskPri02がResume
3. TaskPri01がRunnning状態
2-3を測定する。

環境

コード(測定用の部分のみ)

unsigned long start, end;
static TaskHandle_t TaskHdlPri00;
static TaskHandle_t TaskHdlPri01;
static void TaskPri00( void *pvParameters ) {
    while(1) {
        //xil_printf("%s\r\n", GetTaskName(xTaskGetCurrentTaskHandle()));
        vTaskDelay(pdMS_TO_TICKS(1000));
        start = pmon_start_cycle_counter();
        vTaskResume(TaskHdlPri01);
    }
}
static void TaskPri01( void *pvParameters ) {
    while(1) {
        //xil_printf("%s\r\n", GetTaskName(xTaskGetCurrentTaskHandle()));
        vTaskSuspend(NULL);
        end = pmon_read_cycle_counter();
        xil_printf("time = %ld\r\n", end - start);
    }
}

int main( void )
{
    xTaskCreate(TaskPri00,"TaskPri00", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, &TaskHdlPri00 );
    xTaskCreate(TaskPri01,"TaskPri01", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &TaskHdlPri01 );

結果

time = 1424 (/500MHz = 2.848[us])
time = 463 (/500MHz = 0.926[us])
time = 456 (/500MHz = 0.912[us])
time = 456 (/500MHz = 0.912[us])
あとは456がずっと続く

割り込み性能

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2