2015-02-11 36 views
1

我是新來的,或更好的生鏽(是62)。SIGSEGV在Beaglebone黑色(ARM)交叉編譯w/Eclipse的內存訪問 - Linaro

試圖在Beaglebone Black上運行使用Eclipse Luna CDT和linaro工具在IP上運行Debian。 我成功運行並調試了標準helloworld.c。 需要快速控制GPIO(以連接到不常見的外設),但是 所有試圖讀取或寫入存儲器映射寄存器的嘗試都失敗

指令 i = (*((volatile unsigned int *)(0x4804c130))) ,其應該閱讀

子與信號端接GPIO狀態寄存器結果= 0XB(SIGSEGV) GDBSERVER離開 註銷

這是我編譯沒有源(hellobone.c)錯誤:

int main(void) 
{ 
unsigned int i = 1; 
i = (*((volatile unsigned int *)(0x4804c130))) ; 
} 

(我試過這個指針算術的所有變體)

生成文件跡:(忽略包括)

--- --- COMPILE C:/hellobone/source/hellobone.c 「C:\ GCC-Linaro的\ BIN \臂-Linux的gnueabihf-GCC .exe「-c -o C:/hellobone/object/hellobone.o C:/hellobone/source/hellobone.c -marm -O0 -g -I。 -IC:/ hellobone /包括
。 --- LINK --- 「C:\ gcc-linaro \ bin \ arm-linux-gnueabihf-gcc.exe」-o hellobone C:/hellobone/object/hellobone.o C:/ hellobone/object/tools .o C:/hellobone/object/gpio_v2.o -marm -O0 -g -I。 -IC:/ hellobone /包括

二進制崩潰也以root運行從TTY:

[email protected]:~# ./hellobone 
Segmentation fault 

我在BBB的Debian安裝Eclipse和讀取和寫入內存工作得很好。編譯太慢,而且不穩定,要實用。

閱讀記憶應該是可行的。我究竟做錯了什麼?

我懷疑

GNU gdbserver (GDB) 7.4.1-debian 
This gdbserver was configured as "arm-linux-gnueabihf" 

但也許我缺少明顯的東西,還沒有看到關於這個問題的任何職位......

難住了。現在正在爲此工作數月。設置工具鏈很沮喪,沒有什麼作品在YouTube視頻..

任何幫助將非常感激

馬爾科

+1

兩個字:虛擬內存。 – Notlikethat 2015-02-11 12:15:12

回答

1

您需要mmap /dev/mem通過物理地址來訪問內存映射的外圍設備。我知道的最簡單的示例/代碼是devmem2

0

非常感謝你,這當然有幫助。

我編譯了你給我的程序,它在Eclipse的運行模式和遠程機器的終端上都工作得很完美。

奇怪的是,在運行Eclipse調試器時,它崩潰執行:

如果((FD =打開( 「的/ dev/MEM」,O_RDWR | O_SYNC))== - 1)致死;

我收到此錯誤消息gdbserver的從主機

遠程調試192.168.1.2 /根/ hellobone:搬遷錯誤:/根/ hellobone:符號筆,文件libc中沒有定義的版本GLIBC_2.4。 so.6與鏈接時參考

孩子退出,狀態127 GDBSERVER退出

一直在嘗試使用fopen,但給人的分段錯誤。無論如何,我認爲這是一個工具鏈問題,而不是編程問題。