2013-04-13 28 views
1

我編寫了一個程序來讀取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全局定時器?如何在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); 
} 
+0

你在哪裏做?在'內核'或'用戶空間'中?也許不要標記** linux **使其更明顯。一切都使用Linux中的MMU,甚至內核。你需要確保地址被映射。通常,它被註冊爲資源,然後驅動程序聲明它。另外,我知道它是一個**手臂** CPU,但這個問題通常與**手臂**無關。 –

回答

0

您需要映射(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; 
... 
+1

謝謝你的幫助。 – goodjesse

相關問題