66521
現在、Spresense SDKを使ってWorkerに処理をオフロードする実装をしています。

Worker側に移した処理がどの程度時間がかかっているのか、を測りたいのですが、  
何か良い方法はあるでしょうか。

Coretex-M4のCPUカウンタとか、使えるのでしょうか。  
Workerでの使い方など、よくわからないので、知っている方がいたら、教えていただけないでしょうか。

やりたいこと：  
Worker側で、

```

       while(1){
          処理１();
          処理２();
       }
    
```

というようなコードがあった場合に、  
メインコアだと、gettimeofday()などを使って、  
時刻差からかかった時間を取ったりできるのですが、  
Workerだと、このようなAPIが使えない、ということのようですが、  
何か良い方法があれば。。と思っています。

よろしくお願いします。
CC BY-SA 4.0
2020-04-15T01:23:27.527
65625
2020-05-12T02:46:23.317
34651
question
spresense
Spresense SDKのWorker側の処理のパフォーマンス測定する良い方法はあるでしょうか。
CMSISにあるSYSTICKを使ってみるのはいかがでしょうか。

SYSTICKタイマーが24bitの減算カウンタなので、CPUクロック@156MHzの場合、最大107msec程度の時間であれば測定できると思います。

WorkerのMakefileにCMSISのインクルードパスを追加します。

```

    CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" "$(SDKDIR)/../externals/cmsis/CMSIS_5/CMSIS/Core/Include"}
    CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" "$(SDKDIR)/../externals/cmsis/CMSIS_5/Device/ARM/ARMCM4/Include"}
    
```

たとえば、以下のようなコードで処理１のCPUクロック数を測定することができます。

```

    #include "ARMCM4_FP.h"
    
      SysTick->LOAD = 0xffffff;
      SysTick->VAL = 0UL;
      SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
    
      uint32_t start = SysTick->VAL;
      処理１();
      uint32_t elapsed = start - SysTick->VAL;
    
    
```

ご参考まで～。
CC BY-SA 4.0
2020-05-12T02:46:23.317
66521
2020-05-12T02:46:23.317
31378
65625
answer