Ios MCR和MRC指令使用

Ios MCR和MRC指令使用,ios,arm,cpu-cycles,Ios,Arm,Cpu Cycles,在这里,我写了一些代码来查找一个函数所占用的周期数,但我在第一次使用MCR指令时遇到了错误。任何人都可以建议我如何解决这个问题。这些代码是用XCODE编写的,在ios上运行 #include <stdio.h> static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile ("MRC p15, 0, %0, c

在这里,我写了一些代码来查找一个函数所占用的周期数,但我在第一次使用MCR指令时遇到了错误。任何人都可以建议我如何解决这个问题。这些代码是用XCODE编写的,在ios上运行

#include <stdio.h>

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;

    // perform reset:
    if (do_reset)
    {
        value |= 2;     // reset all counters to zero.
        value |= 4;     // reset cycle counter to zero.
    }

    if (enable_divider)
        value |= 8;     // enable "by 64" divider for CCNT.

    value |= 16;

    // program the performance-counter control-register:
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));

    // enable all counters:
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));

    // clear overflows:
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));
}

int main () {
    float x = 100.0f;
    float y = 0.00000f;

    float inst,cycl,cycl_inst;

    int do_reset=0;
    int enable_divider=0;

    init_perfcounters (1, 0);

    // measure the counting overhead:
    unsigned int overhead = get_cyclecount();

    overhead = get_cyclecount() - overhead;

    unsigned int t = get_cyclecount();

    // do some stuff here..

   log_10_c_function(x);

    t = get_cyclecount() - t;

    printf ("Totaly %d cycles (including function call) ", t - overhead);

    return 0;

}
#包括
静态内联无符号整数get\u循环计数(void)
{
无符号整数值;
//读取CCNT寄存器
asm volatile(“MRC p15,0,%0,c9,c13,0\t\n”:“=r”(值));
返回值;
}
静态内联void init_perfcounters(int do_reset,int enable_divider)
{
//通常启用所有计数器(包括循环计数器)
int值=1;
//执行重置:
如果(不重置)
{
值|=2;//将所有计数器重置为零。
值|=4;//将循环计数器重置为零。
}
如果(启用_分割器)
值|=8;//为CCNT启用“乘64”除法器。
值|=16;
//对性能计数器控制寄存器进行编程:
asm volatile(“MCR p15,0,%0,c9,c12,0\t\n”:“r”(值));
//启用所有计数器:
asm volatile(“MCR p15,0,%0,c9,c12,1\t\n):“r”(0x800000F));
//清除溢流:
asm volatile(“MCR p15,0,%0,c9,c12,3\t\n):“r”(0x800000F));
}
int main(){
浮动x=100.0f;
浮动y=0.00000f;
浮动装置,循环装置,循环装置;
int do_reset=0;
int enable_除法器=0;
初始性能计数器(1,0);
//测量计数开销:
unsigned int开销=get_cyclecount();
开销=get_cyclecount()-开销;
unsigned int t=get_cyclecount();
//在这里做些事情。。
log_10_c_函数(x);
t=获取循环计数()-t;
printf(“总共%d个周期(包括函数调用)”,t-开销;
返回0;
}

您遇到了什么错误?我猜这是一条未定义的指令,考虑到你之前的问题,这并不奇怪-,那么,呃,从用户空间访问它们显然不会成功…我得到的运行时错误是错误的访问和未定义的ARM指令