【问题标题】:How to use global timer on Cortex A9 in Linux?如何在 Linux 的 Cortex A9 上使用全局定时器?
【发布时间】:2013-04-13 14:35:58
【问题描述】:

我编写了一个程序来读取 OMAP4460 (Pandaboard ES) 的皮质 A9 上的全局计时器。从 OMAP4 TRM [第 4.4.1 节] 和 Cortex-A9 MPCore TRM section 1.5 ,我可以看出 ARM9 全局定时器寄存器的基地址是 0x4824 0200。Cortex-A9 MPCore TRM section 4.4.1 说“那里是两个定时器计数器寄存器。它们是偏移量 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);
}

【问题讨论】:

  • 你在哪里做这个?在kerneluser space?也许不要标记 linux 以使其更明显。 Linux 中的一切都使用 MMU,甚至内核。您需要确保地址已映射。通常,它被注册为资源,然后驱动程序声明它。另外,我知道它是一个 arm CPU,但这个问题通常与 arm 无关。

标签: linux linux-kernel arm embedded-linux


【解决方案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;
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多