「誰動了我的gpio」,我想很多做嵌入式開發的同行可能也碰到過類似的問題:硬體沒有按照設計的程式工作,好像是相關的暫存器在別處被改了。遇到這種情況,一般有兩種處理方法,一是通過jtag**器進行除錯,單步跟蹤,確認相關的暫存器就是我們要設的值。而這在除錯wince驅動或者應用程式時是不方便實現的,一般在wince中通過新增列印資訊來確認。前面曾講過基於kitl除錯wince的方法,這種方法固然強大,但也只是一種手段。個人以為,在wince已經跑通的情況下,除錯驅動或應用還是少用kitl的好,不到萬不得已,不動用它!大bug靠想,小bug靠調,我一直這麼認為。過於依賴某種除錯手段而不去分析問題的本身,反而影響除錯。
「誰動了我的gpio」是乙個問題。這兩天在除錯vi程式時又碰到另外的問題。vi中採用了多片cpld,擴充套件了一些板上暫存器。按理來說,這一部分應該是比較簡單的,但在除錯時卻出現了很多狀況,主要是軟體設計和硬體設計版本的不一致,以致於需要經常修改軟體來確認硬體邏輯正確與否,很費時間。
為了解決這兩個問題,寫了個小軟體,memmgr.exe。功能很明確,在wince中用來讀寫暫存器,包括cpu內部的控制暫存器和匯流排上外擴的暫存器。這樣,我們就可以監視gpio了,再也不怕誰來動我的gpio。:-d控制板上暫存器也更方便。程式介面如下:
其中,phyaddr
是暫存器的實體地址,如
s3c2410
的rtc
暫存器0x57000070
。length
是資料寬度,
1對應的是乙個
byte,2
對應的是乙個
word,4
對應的是乙個
dword
。value
對應的是暫存器的值。
該程式在s3c2410和pxa270的wince5.0上執行都沒問題。
由於wince6.0
的記憶體管理發生了很大變化,所以該程式不能在
ce6.0
上正常工作。等需要時再做支援吧,車到山前再開路。
memmgr.exe
。
通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...