1

OMAP4460 (Pandaboard ES) の cortex A9 でグローバル タイマーを読み取るプログラムを作成します。OMAP4 TRM [セクション 4.4.1] および Cortex-A9 MPCore TRMセクション 1.5から、ARM9 グローバル タイマー レジスタのベース アドレスは 0x4824 0200 であることがわかります。Cortex-A9 MPCore TRMセクション 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);
}
4

1 に答える 1

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;
...
于 2013-04-13T22:31:11.590 に答える