从内存映射寄存器中读取

Posted

技术标签:

【中文标题】从内存映射寄存器中读取【英文标题】:Reading from memory mapped register 【发布时间】:2010-12-07 13:31:46 【问题描述】:

我正在使用的处理器架构有一个时间标签计数器,我想读出它来进行性能测量。时间标签计数器是内存映射到 地址 0x90000008。我使用以下例程从时间读取值 计数器,但是打印输出的差异始终为零。任何人的想法 我错过了什么?

char* const ADDR = (char *) 0x90000008;

unsigned long cycle_count_val() 

   unsigned long res;

   asm volatile (

   "set ADDR, %%l0           \n\t"
   "ld [%%l0], %0            \n\t"

   : "=r" (res)
   :
   : "%l0"
  );

  return res;
 

....
unsigned long start = cycle_count_val(); 
execute_benchmark();
unsigned long end = cycle_count_val();

printf("Benchmark performance(in clock cycles) = %ld \r\n", end-start);

非常感谢您的帮助, 菲尔

【问题讨论】:

你确定你的时间戳char吗? 不,它是 32 位内存位置中的 30 位值(MSB 为 0) 【参考方案1】:

我认为你不需要求助于汇编 - 你为什么不能直接阅读:

uint32_t tbr = (*((uint32_t volatile *) 0x90000008))

【讨论】:

只是#define整个表达式为now

以上是关于从内存映射寄存器中读取的主要内容,如果未能解决你的问题,请参考以下文章

linux中readl()和writel()函数---用于读写寄存器

访问内存映射寄存器

如何从 .NET 中的内存映射文件中快速读取字节?

Linux内存映射原理

操作系统之用户级线程

如何将文件映射到内存?