各 IRQ にプロセッサ サイクル カウンター値を読み取る OMAP5432 (Cortex A15) 用の Linux ドライバーを作成しています。カウンターは次のように初期化されます。
static inline void init_perfcounters(int32_t do_reset, int32_t enable_divider)
{
// in general enable all counters (including cycle counter)
int32_t value = 1;
// peform reset:
if (do_reset) {
value |= 2; // reset all counters to zero.
value |= 4; // reset cycle counter to zero.
}
if (enable_divider)
value |= 8; // enable "by 64" divider for CCNT.
value |= 16;
// program the performance-counter control-register:
asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));
// enable all counters:
asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));
// clear overflows:
asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));
}
分周器は無効です。Linux カーネルは 4.0 で、周波数スケーリング オプションは無効で、1 つの CPU のみが実行されています。毎秒 IRQ があり、次のような値を読み取ります。
static inline unsigned int get_cyclecount(void)
{
unsigned int value;
// Read CCNT Register
asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
return value;
}
プロセッサが 2GHz で動作しているにもかかわらず、2 つの IRQ 間のサイクル数が 20M のオーダーである理由がわかりません。誰にもアイデアはありますか?
前もって感謝します。