我使用的是Exynos 3110处理器(1 GHz单核ARM Cortex-A8,例如在Nexus S中使用),并尝试测量特定功能的执行时间.我在Nexus S上运行了Android 4.0.3.我尝试了这个方法
[1] 如何测量ARM Cortex-A8处理器中的程序执行时间?
我加载了内核模块以允许在用户模式下读取寄存器值.我使用以下程序来测试计数器:
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;
}
static inline void init_perfcounters (int do_reset, int enable_divider)
{
// in general enable all counters (including cycle counter)
int value = 1;
// peform reset:
if (do_reset)
{
value |= 2; // reset all counters to zero.
value |= 4; // reset …Run Code Online (Sandbox Code Playgroud) 我想在我的新Galaxy S4手机上获得一些基本的性能数据.我已经编译了一个自定义内核并设法使用Odin将其闪存到设备上.这些是我启用的与perf工具相关的内核模块:
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
CONFIG_PERF_EVENTS=y
CONFIG_PERF_COUNTERS=y
Run Code Online (Sandbox Code Playgroud)
我还交叉编译了perf工具.问题是当我运行以下命令时:
perf stat ls
Run Code Online (Sandbox Code Playgroud)
输出似乎不太正确:
Performance counter stats for 'ls':
10887392 cycles # 0.000 Ghz
0 instructions # 0.00 insns per cycle
0.012448321 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
我已经将cpu策略设置为'userspace'并且执行了:
cpufreq-set -f 1600000
Run Code Online (Sandbox Code Playgroud)
为了确保所有核心始终以最大频率工作.
我将不胜感激任何帮助.
以下是没有解决方案的类似案例的链接:http : //lists.linaro.org/pipermail/linaro-kernel/2012-December/002611.html http://forums.arm.com/index.php?/topic/ 15020-PMU功能于Cortex-A8的的OMAP-3530-什么-AM-I-做,错了/
相关的stackoverflow主题: 如何在ARM Cortex-A8处理器中测量程序执行时间?
我注意到在arch / arm / kernel下有一些分析源代码:
perf_event.c
perf_event_cpu.c
perf_event_v6.c
perf_event_v7.c
perf_event_xscale.c
Run Code Online (Sandbox Code Playgroud)
我不了解这些文件的层次结构,如何使用它们?我可以假设它们始终存在并在内核模块中使用它们吗?我的内核模块在Cortex-A7或Cortex-A15内核上运行。
/arch/arm/kernel/目录下似乎有很多非常有用的东西,但是没有有关功能的文档?怎么会 ?
我正在尝试基于 Board 在 AARCH64 上编译“mrc”和“mcr”指令,但我看到以下错误消息
tmp/ccqOHmrK.s: Assembler messages:
/tmp/ccqOHmrK.s:43: Error: unknown mnemonic `mrc' -- `mrc p15,0,x0,c14,c3,1'
/tmp/ccqOHmrK.s:53: Error: unknown mnemonic `mrc' -- `mrc p15,0,x2,c14,c3,0'
Run Code Online (Sandbox Code Playgroud)
我尝试查看内核源代码 /arch/arm64,但没有模拟就没有使用过 mcr&&mrc。
这是一些语法问题吗?
我试图在嵌入式 ARM 设备上使用 gettimeofday,但似乎我无法使用它:
gnychis@ubuntu:~/Documents/coexisyst/econotag_firmware$ make
Building for board: redbee-econotag
CC obj_redbee-econotag/econotag_coexisyst_firmware.o
LINK (romvars) econotag_coexisyst_firmware_redbee-econotag.elf
/home/gnychis/Documents/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none- eabi/4.3.2/../../../../arm-none-eabi/lib/libc.a(lib_a-gettimeofdayr.o): In function `_gettimeofday_r':
gettimeofdayr.c:(.text+0x1c): undefined reference to `_gettimeofday'
/home/gnychis/Documents/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
make[1]: *** [econotag_coexisyst_firmware_redbee-econotag.elf] Error 1
make: *** [mc1322x-default] Error 2
Run Code Online (Sandbox Code Playgroud)
我假设我不能使用 gettimeofday() ?有没有人有任何建议能够告诉经过的时间?(例如,100 毫秒)
如何在设备上配置我的ARM代码.
这是一个涉及USB和SDH处理的裸机代码,我看到这个用于ARM的Code Profiler但看起来非常渺茫,我熟悉DS5但是如果你在基于linux内核的操作系统的平台上,它的大多数工具都可以使用.我编译我的代码gcc.
我试图理解汇编语言的语法,首先正确地编写代码,然后高效地编写代码。在此示例中,它显示了使用的示例"=r"
asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));
Run Code Online (Sandbox Code Playgroud)
这会读取寄存器的值并将其存储在值变量中。另一个例子使用::"r"
asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value));
Run Code Online (Sandbox Code Playgroud)
这会将值变量写入 PMUSERENR_ELO 寄存器。这是另一个例子:如何测量 ARM Cortex-A8 处理器中的程序执行时间?。
当我尝试使用上述两个命令编译一个简单的测试代码时,我收到错误::9:2: error: output operand constraint lacks '='如果我添加“=”并删除一个“:”,它将编译,但当我测试它时,它只是说Illegal instruction
如果有人可以解释其中的差异,这将很有帮助,许多组装教程显示相同的格式但没有解释。如果这提供了任何见解的话,它是在 64 位 ARM 平台上进行的。谢谢。