|
|
51CTO旗下网站
|
|
移动端

1.9.3 性能计数器的基础架构

《ARM嵌入式系统编程与优化》第1章Linux/ARM嵌入式平台,本章介绍如何使用GCC编译器、汇编器和连接器来编写和执行独立的汇编语言程序,以及如何将一个C语言代码和汇编语言代码合起来,以验证汇编代码子程序的正确性。本节为大家介绍性能计数器的基础架构。

作者:梁元宇 译来源:机械工业出版社|2017-09-26 19:19

1.9.3 性能计数器的基础架构

想要使用perf_event,应开发一组用以检测程序执行各方面性能的可复用函数。其中包括用于初始化、结果打印、重置性能计数器(命名为“tick”)和读取性能计数器状态(称为“tock”)的函数。

首先添加计数器必要的5个头文件和常数定义:

接下来,编写一个显式C包装器,它使用perf_event调用系统调用去打开一个特定的性能计数器:

pid参数指定进行检测的进程的Linux进程ID。这里有两个特殊值:如果pid为0,则检测当前进程;如果pid为- 1,则检测所有进程。这段代码将把pid参数设置为0,以检测当前进程。

参数cpu允许用户限制在单一中央处理器上进行检测。如果cpu设为- 1,事件是检测所有中央处理器。

参数group_fd允许创建事件组,允许通过单次调用perf_event_open来调用多个事件。本章的代码使用单次调用perf_event_open来计算每一个独立事件,所以将这个参数设为- 1来检测单一事件。

还需要一个函数,该函数将根据启用时间和运行时间之比来缩放perf_event提供的结果。读取一个由perf_event启用的计数器,以返回一个含有3个64位整型的数组;索引为0的值表示计数器的值,索引为1的值表示启用时间,索引为2的值表示运行时间。

在perf_event中,独立性能计数器可以通过文件描述符访问,所以需要在开始处声明文件描述符数组:

声明一个数组,以存储从每个计数器读取的信息:

接下来的函数将打开4个计数器。这个函数为ARM11、ARM Cortex A9和ARM Cortex A15处理器设计。打开缓存失效和缓存命中计数器的方式在ARM11中略有不同,所以采用ARM1编译(使用–DARM11选项编译)时,代码假定ARM11的变量已经设置了。

添加“tick”和“tock”函数,这两个函数可在检测代码之前或之后调用:


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

XML基础教程

本书分为8章。第1章主要对XML做了简单的介绍。第2章详细讲解规范的XML文件。第3章主要讲解有效的XML文件,特别重点讲解DTD文件。第4章讲解C...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊