如何在Linux中的Cortex A9上使用全局计时器?

时间:2013-04-13 14:35:58

标签: linux linux-kernel arm embedded-linux

我编写了一个程序来读取OMAP4460(Pandaboard ES)皮层A9上的全局计时器。从OMAP4 TRM [第4.4.1节]和Cortex-A9 MPCore TRM section 1.5,我可以看出ARM9 gloabal定时器寄存器的基址是0x4824 0200.Cortex-A9 MPCore TRM {{3} “有两个定时器计数器寄存器。它们是偏移量为0x00的低32位定时器计数器,偏移量为0x04的高32位定时器计数器”。所以我写的代码如下,但它会因段故障而中止。我不是什么问题?有谁知道如何在Linux中读取cortex A9上的全局计时器?

#define GLOBAL_TIMER_BASE 0X48240200U

void  rdGlobalTimer()
{
  unsigned int _low,_high;
  unsigned int addr = GLOBAL_TIMER_BASE;
  __asm__ __volatile__("ldr %0, [%1]\n\t"\
        : "=&r"(_low)
            : "r" (addr)
        : "memory");

  __asm__ __volatile__("ldr %0, [%1]\n\t"\
        : "=&r"(_high)
            : "r" (addr + 4)
        : "memory");



   printf("low:%x,high:%x\n",_low,_high);
}

1 个答案:

答案 0 :(得分:1)

您需要映射(mmap)地址空间,最明显的方法是通过/dev/mem

尝试编译并使用devmem2.c作为目标,例如

devmem2 0X48240200

你应该研究这个例子,但想法就是

...
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
if(map_base == (void *) -1) FATAL;
...
相关问题