概要
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秒が測定できるはず。
コード(測定部分のみ)
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で↓な記述があった。測定は大丈夫そう。
/* Canonical definitions for peripheral PSU_CORTEXR5_0 */
#define XPAR_CPU_CORTEXR5_0_CPU_CLK_FREQ_HZ 500000000
単純なプリエンプト性能
TaskPri00 優先度0
TaskPri01 優先度1
として
- TaskPri01がSuspend
- TaskPri02がResume
- 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がずっと続く