![]() |
RT-Thread API参考手册
4.0.3
嵌入式实时操作系统
|
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:
获取Icache miss的次数。
| enum rt_hw_counter_idx |
| 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 | 计数值 |
| rt_uint32_t rt_hw_pmu_get_overflow_flag | ( | void | ) |
获取计数器overflow标志
| rt_uint32_t rt_hw_pmu_cnt_overflowed | ( | rt_int32_t | idx | ) |
获取指定计数器overflow标志
| idx | 计数器id |
| void rt_hw_pmu_write_swinc | ( | rt_int32_t | idx | ) |
写PMSWINC寄存器
| idx | 计数器id |