相关疑难解决方法(0)

使用硬件计数器测量ARM Cortex-A8上的执行时间

我使用的是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)

c arm performancecounter time-measurement cortex-a8

7
推荐指数
1
解决办法
4940
查看次数

Linux perf stat工具返回零指令计数.我在这里错过了什么?

我想在我的新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处理器中测量程序执行时间?

linux android kernel galaxy perf

6
推荐指数
1
解决办法
1153
查看次数

如何在Linux内核中进行概要分析或使用perf_event *。[hc]框架?

我注意到在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/目录下似乎有很多非常有用的东西,但是没有有关功能的文档?怎么会 ?

c linux profiling kernel arm

5
推荐指数
1
解决办法
1575
查看次数

AARCH64 上不存在 MCR 和 MRC?

我正在尝试基于 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。

这是一些语法问题吗?

assembly linux-kernel arm64

5
推荐指数
1
解决办法
4428
查看次数

无法链接到嵌入式系统上的 gettimeofday,已用时间建议?

我试图在嵌入式 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 毫秒)

c embedded arm gettimeofday

3
推荐指数
1
解决办法
1万
查看次数

如何在ARM平台上分析裸机源代码?

如何在设备上配置我的ARM代码.

这是一个涉及USB和SDH处理的裸机代码,我看到这个用于ARM的Code Profiler但看起来非常渺茫,我熟悉DS5但是如果你在基于linux内核的操作系统的平台上,它的大多数工具都可以使用.我编译我的代码gcc.

  1. 我的代码运行在Cortex-A7和/或Cortex-A15内核上.
  2. 这里看来,这些CPU 支持arm Profiler.

usb profiling arm ds-5

3
推荐指数
1
解决办法
823
查看次数

::"r" 与 :"=r" 汇编说明

我试图理解汇编语言的语法,首先正确地编写代码,然后高效地编写代码。在此示例中,它显示了使用的示例"=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 平台上进行的。谢谢。

c assembly gcc inline-assembly arm64

3
推荐指数
1
解决办法
4997
查看次数