概要
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がずっと続く