RT-Thread API参考手册  4.0.3
嵌入式实时操作系统
CPU性能监控

armv7 performance monitor接口 更多...

宏定义

#define ARMV7_PMU_EVENT_PMNC_SW_INCR   0x00
 Software increment.
 
#define ARMV7_PMU_EVENT_L1_ICACHE_REFILL   0x01
 Instruction fetch that causes a refill.
 
#define ARMV7_PMU_EVENT_ITLB_REFILL   0x02
 Instruction fetch that causes a TLB refill.
 
#define ARMV7_PMU_EVENT_L1_DCACHE_REFILL   0x03
 Data access causes a refill.
 
#define ARMV7_PMU_EVENT_L1_DCACHE_ACCESS   0x04
 Data cache hit.
 
#define ARMV7_PMU_EVENT_DTLB_REFILL   0x05
 Data access causes a TLB refill.
 
#define ARMV7_PMU_EVENT_MEM_READ   0x06
 Data read architecturally executed.
 
#define ARMV7_PMU_EVENT_MEM_WRITE   0x07
 Data write architecturally executed.
 
#define ARMV7_PMU_EVENT_INSTR_EXECUTED   0x08
 Instruction architecturally executed.
 
#define ARMV7_PMU_EVENT_EXC_TAKEN   0x09
 Exception taken.
 
#define ARMV7_PMU_EVENT_EXC_EXECUTED   0x0A
 Exception return architecturally executed.
 
#define ARMV7_PMU_EVENT_CID_WRITE   0x0B
 Change to ContexID retired.
 
#define ARMV7_PMU_EVENT_PC_WRITE   0x0C
 Software change of PC.
 
#define ARMV7_PMU_EVENT_PC_IMM_BRANCH   0x0D
 Immediate branch architecturally executed.
 
#define ARMV7_PMU_EVENT_PC_RETURN   0x0E
 Procedure return architecturally executed.
 
#define ARMV7_PMU_EVENT_MEM_UNALIGNED_ACCESS   0x0F
 Unaligned load-store.
 
#define ARMV7_PMU_EVENT_PC_BRANCH_MIS_PRED   0x10
 Branch mispredicted/not predicted.
 
#define ARMV7_PMU_EVENT_CLOCK_CYCLES   0x11
 Cycle counter.
 
#define ARMV7_PMU_EVENT_PC_BRANCH_PRED   0x12
 Branch predicted.
 
#define ARMV7_PMU_EVENT_MEM_ACCESS   0x13
 Data memory access.
 
#define ARMV7_PMU_EVENT_L1_ICACHE_ACCESS   0x14
 Instruction Cache access.
 
#define ARMV7_PMU_EVENT_L1_DCACHE_WB   0x15
 Data cache eviction.
 
#define ARMV7_PMU_EVENT_L2_CACHE_ACCESS   0x16
 L2 data cache access.
 
#define ARMV7_PMU_EVENT_L2_CACHE_REFILL   0x17
 L2 data cache refill.
 
#define ARMV7_PMU_EVENT_L2_CACHE_WB   0x18
 L2 data cache write-back.
 
#define ARMV7_PMU_EVENT_BUS_ACCESS   0x19
 Bus access.
 
#define ARMV7_PMU_EVENT_BUS_CYCLES   0x1D
 Bus cycle.
 
#define ARMV7_A7_PMU_EVENT_BUS_ACCESS_READ   0x60
 Bus access, read.
 
#define ARMV7_A7_PMU_EVENT_BUS_ACCESS_WRITE   0x61
 Bus access, write.
 
#define ARMV7_A7_PMU_EVENT_IRQ_EXCEPTION   0x86
 IRQ exception taken.
 
#define ARMV7_A7_PMU_EVENT_FIQ_EXCEPTION   0x87
 FIQ exception taken.
 
#define ARMV7_A7_PMU_EVENT_EXT_MEM   0xC0
 External memory request.
 
#define ARMV7_A7_PMU_EVENT_NO_CACHE_EXT_MEM   0xC1
 Non-cacheable external memory request.
 
#define ARMV7_A7_PMU_EVENT_PREF_LINFILL   0xC2
 Linefill because of prefetch.
 
#define ARMV7_A7_PMU_EVENT_PREF_LINFILL_DROP   0xC3
 Prefetch linefill dropped.
 
#define ARMV7_A7_PMU_EVENT_ENTER_READ_ALLOC_MODE   0xC4
 Entering read allocate mode.
 
#define ARMV7_A7_PMU_EVENT_READ_ALLOC_MODE   0xC5
 Read allocate mode.
 
#define ARMV7_A7_PMU_EVENT_ETM_EXT_OUT0   0xC7
 ETM Ext Out[0].
 
#define ARMV7_A7_PMU_EVENT_ETM_EXT_OUT1   0xC8
 ETM Ext Out[1].
 
#define ARMV7_A7_PMU_EVENT_PIPELINE_STALL   0xC9
 Pipeline stall.
 
#define ARMV7_A7_PMU_EVENT_DATA_SNOOP   0xCA
 Data snooped from other processor.
 

枚举

函数

void rt_hw_pmu_enable_event (rt_int32_t idx, rt_uint32_t event, rt_bool_t int_en)
 配置计数器idx监控事件event,使能计数器,并根据需要使能中断 更多...
 
void rt_hw_pmu_disable_event (rt_int32_t idx, rt_bool_t int_dis)
 关闭计数器监控,并根据需要关闭中断 更多...
 
void rt_hw_pmu_start (void)
 打开所有计数器
 
void rt_hw_pmu_stop (void)
 关闭所有计数器
 
rt_uint32_t rt_hw_pmu_get_counter_val (rt_int32_t idx)
 获取计数器的值 更多...
 
void rt_hw_pmu_set_counter_val (rt_int32_t idx, rt_uint32_t val)
 配置计数器的值 更多...
 
rt_uint32_t rt_hw_pmu_get_overflow_flag (void)
 获取计数器overflow标志 更多...
 
rt_uint32_t rt_hw_pmu_cnt_overflowed (rt_int32_t idx)
 获取指定计数器overflow标志 更多...
 
void rt_hw_pmu_write_swinc (rt_int32_t idx)
 写PMSWINC寄存器 更多...
 
void rt_hw_pmu_reset (void)
 重置所有计数器,包括关闭计数器,关闭中断,reset计数器值为0
 

详细描述

armv7 performance monitor接口

PMU即性能监视器,它运行时可以收集关于处理器和内存的各种统计信息。这些统计信息中的事件非常有用, 可以利用它们来调试或者剖析代码,对软件进行性能的调优。

PMU寄存器可以分成两类:一部分寄存器是用来做计数(主要是cycle counter),比如测量一段代码的运行时 间,从寄存器里面读取cpu cycles数,并根据cpu的主频计算代码运行时间;另一部分寄存器是用来统计CPU和 内存等的信息,即event事件,如cache的miss和hit,可以帮助调整代码优化性能。

需要注意的是,对于多核CPU,每个core都有一套独立的PMU寄存器。

PMU驱动提供couter监控事件设置,中断控制,计数器溢出查询,设置计数器值,获取计数器值,计数器reset 功能等。

以监控Icache miss事件为例,如下是sample code:

  1. 设置event counter1计数开始值为0,计数器从0开始计数;
  2. 设置event counter1监控事件ARMV7_PMU_EVENT_L1_ICACHE_REFILL,使能event counter1;
  3. 打开pmu counter总开关。

获取Icache miss的次数。

枚举类型说明

枚举值
IDX_CYCLE_COUNTER 

CPU周期计数器

IDX_EVENT_COUNTER0 

Event0计数器

IDX_EVENT_COUNTER1 

Event1计数器

IDX_EVENT_COUNTER2 

Event2计数器

IDX_EVENT_COUNTER3 

Event3计数器

IDX_EVENT_COUNTER4 

Event4计数器

IDX_EVENT_COUNTER5 

...

函数说明

void rt_hw_pmu_enable_event ( rt_int32_t  idx,
rt_uint32_t  event,
rt_bool_t  int_en 
)

配置计数器idx监控事件event,使能计数器,并根据需要使能中断

参数
idx计数器id
event监控事件编码
int_en计数器中断使能标志, 1:使能中断; 0:忽略
void rt_hw_pmu_disable_event ( rt_int32_t  idx,
rt_bool_t  int_dis 
)

关闭计数器监控,并根据需要关闭中断

参数
idx计数器id
int_en计数器中断使能标志, 1:关闭中断; 0:忽略
rt_uint32_t rt_hw_pmu_get_counter_val ( rt_int32_t  idx)

获取计数器的值

参数
idx计数器id
返回
计数器的值
void rt_hw_pmu_set_counter_val ( rt_int32_t  idx,
rt_uint32_t  val 
)

配置计数器的值

参数
idx计数器id
val计数值
注解
当计数器的值配置为val,并使能计数器后,计数器将从该值开始递增计数
rt_uint32_t rt_hw_pmu_get_overflow_flag ( void  )

获取计数器overflow标志

返回
返回overflow标志,一个bit对应一个counter,1:counter溢出; 0:counter未溢出
rt_uint32_t rt_hw_pmu_cnt_overflowed ( rt_int32_t  idx)

获取指定计数器overflow标志

参数
idx计数器id
返回
返回指定计数器overflow标志,0:未溢出; 非0:发生溢出
void rt_hw_pmu_write_swinc ( rt_int32_t  idx)

写PMSWINC寄存器

参数
idx计数器id
注解
当配置计数器idx监控SWINC事件,调用本接口写PMSWINC寄存器,计数器idx值就会加1