私の目標は、ARMv8レジスタを使用してCPUサイクルを読み取ることです。kmodと私のテストプログラムは私のARMノートブックで正しく実行されます。ただし、db410cボードにkmodをロードした後にpmccntr_el0
バイナリファイルアクセスを実行すると、誤ったコマンドが受信されました。
誰もが理由を理解するのに役立ちますか?PMUSERENR_EL0_EN
ビットを介してユーザーモードアクセスを有効にしたためです。
テストプログラムのサンプルコードは次のとおりです。
#include <stdio.h>
#include <stdint.h>
static inline uint64_t
read_pmccntr(void)
{
uint64_t val;
asm volatile("mrs %0, pmccntr_el0" : "=r"(val));
return val;
}
int main(){
uint64_t counter = read_pmccntr();
printf("value:%lu\n",counter);
return 0;
}
オペレーティングシステムのバージョン:
- ノートブック: Linux debian-gnu-linux-10 4.19.0-18-arm64
- db410c: Linux linaro-developer 5.15.0-stm-qcomlt-arm64
答え1
db410cはこのコマンドをサポートしますか?
さらに、64ビットを使用していますか? pmccntr_el0は32ビットでサポートされていないようです。
次のコードを使用して、db410cがこのコマンドをサポートしていないのが問題であることを確認できます。 (次のコードは32ビット用です):
unsigned int cc;
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc));
return cc;
ここでパフォーマンスを監視するためのより多くの方法を見つけることができます。 http://wiki.dreamrunner.org/public_html/Embedded-System/Cortex-A8/PerformanceMonitorControlRegister.html
また、コンパイル時に-O3フラグを追加すると、パフォーマンスの結果が大きく異なります。
答え2
理由を調べるには、ユーザーモードアクセスビットを正しく有効にする必要があります。