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