質問: 現在、Spresense SDKを使ってWorkerに処理をオフロードする実装をしています。 Worker側に移した処理がどの程度時間がかかっているのか、を測りたいのですが、 何か良い方法はあるでしょうか。 Coretex-M4のCPUカウンタとか、使えるのでしょうか。 Workerでの使い方など、よくわからないので、知っている方がいたら、教えていただけないでしょうか。 やりたいこと: Worker側で、 ``` while(1){ 処理1(); 処理2(); } ``` というようなコードがあった場合に、 メインコアだと、gettimeofday()などを使って、 時刻差からかかった時間を取ったりできるのですが、 Workerだと、このようなAPIが使えない、ということのようですが、 何か良い方法があれば。。と思っています。 よろしくお願いします。
回答: 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"} ``` たとえば、以下のようなコードで処理1の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; 処理1(); uint32_t elapsed = start - SysTick->VAL; ``` ご参考まで~。