一、存儲器格式(字對齊):
Arm體系結構將存儲器看做是從零地址開始的字節的線性組合。從零字節到三字節放置第一個存儲的字(32位)數據,從第四個字節到第七個字節放置第二個存儲的字數據,一次排列。作為32位的微處理器,arm體系結構所支持的最大尋址空間為4GB。
存儲器格式
1、大端格式:高字節在低地址,低字節在高地址;
2、小端格式:高字節在高地址,低字節在低地址;
指令長度:
Arm微處理器的指令長度是32位的,也可以為16位(thumb狀態下)。Arm微處理器中支持字節(8位),半字(16位),字(32位)三種數據類型,其中,字需要4字節對齊,半字需要2字節對齊。
注:所謂的指令長度是一條完整的指令的長度,而不是單純的mov這3個字母長度
二、ARM體系的CPU有兩種工作狀態
1、ARM狀態:處理器執行32位的字對齊的ARM指令;
2、Thumb狀態:處理器執行16位的、半字對齊的Thumb指令;
在程序運行的過程中,可以在兩種狀態之間進行相應的轉換。處理器工作狀態的轉變并不影響處理器的工作模式和相應寄存器中的內容。
CPU上電處于ARM狀態
三、ARM體系的CPU有以下7種工作模式:
1、用戶模式(Usr):用于正常執行程序;
2、快速中斷模式(FIQ):用于高速數據傳輸;
3、外部中斷模式(IRQ):用于通常的中斷處理;
4、管理模式(svc):操作系統使用的保護模式;
5、數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用于虛擬存儲以及存儲保護;
6、系統模式(sys):運行具有特權的操作系統任務;
7、未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用于支持硬件;
Arm的工作模式切換有兩種方法:
被動切換:在arm運行的時候產生一些異?;蛘咧袛鄟碜詣舆M行模式切換
主動切換:通過軟件改變,即軟件設置寄存器來經行arm的模式切換,應為arm的工作模式都是可以通過相應寄存器的賦值來切換的。
Tips:當處理器運行在用戶模式下,某些被保護的系統資源是不能被訪問的。
除用戶模式外,其余6種工作模式都屬于特權模式;
特權模式中除了系統模式以外的其余5種模式稱為異常模式;
大多數程序運行于用戶模式;
進入特權模式是為了處理中斷、異常、或者訪問被保護的系統資源;
四、寄存器
ARM有31個通用的32位寄存器,6個程序狀態寄存器,共分為7組,有些寄存器是所有工作模式共用的,還有一些寄存器專屬于每一種工作模式;
R13——棧指針寄存器,用于保存堆棧指針;
R14——程序連接寄存器,當執行BL子程序調用指令時,R14中得到R15的備份,而當發生中斷或異常時,R14保存R15的返回值;
R15——程序計數器;
快速中斷模式有7個備份寄存器R8—R14,這使得進入快速中斷模式執行很大部分程序時,甚至不需要保存任何寄存器;
其它特權模式都含有兩個獨立的寄存器副本R13、R14,這樣可以令每個模式都擁有自己的堆棧指針和連接寄存器;
五、當前程序狀態寄存器(CPSR)
CPSR中各位意義如下:
T位:1——CPU處于Thumb狀態, 0——CPU處于ARM狀態;
I、F(中斷禁止位): 1——禁止中斷, 0——中斷使能;
工作模式位:可以改變這些位,進行模式切換;
六、程序狀態保存寄存器(SPSR)
當切換進入某一個特權模式時,SPSR保存前一個工作模式的CPSR值,這樣,當返回前一個工作模式時,可以將SPSR的值恢復到CPSR中;
七、模式切換
當異常發生,CPU進入相應的異常模式時,以下工作是由CPU自動完成的:
1、在異常模式的R14中保存前一工作模式的下一條即將執行的指令地址;
2、將CPSR的值復制到異常模式的SPSR中;
3、將CPSR的工作模式設為該異常模式對應的工作模式;
4、令PC值等于這個異常模式在異常向量表中的地址,即跳轉去執行異常向量表中的相應指令;
從異常工作模式退回到之前的工作模式時,需要由軟件來完成以下工作:
1、將異常模式的R14減去一個適當的值(4或8)后賦給PC寄存器;
2、將異常模式SPSR的值賦給CPSR;
====================================================================================
轉載:大端與小端存儲模式的詳解
存儲模式:
小端:較高的有效字節存儲在較高的存儲器地址,較低的有效字節存儲在較低的存儲器地址。
大端:較高的有效字節存儲在較低的存儲器地址,較低的有效字節存儲在較高的存儲器地址。
STM32 屬于小端模式,簡單地說:比如:temp=0X12345678;假設temp的地址為:0X4000 0000
那么,在內存里面,其存儲就變成了:
| 地址 | HEX |
|0X4000 0000 |78 56 43 12|
更為簡單一點:
低地址---------->高地址【大端模式】:
0X12|0X34|0X56|0X78|
低地址---------->高地址【小端模式】:
0X78|0X56|0X34|0X12|
大端與小端的優勢
二者無所謂優勢,無所謂劣勢,各自優勢便是對方劣勢
大端模式:符號位的判定固定為第一個字節,容易判斷正負。
小端模式:強制轉換數據不需要調整字節內容,1、2、4字節的存儲方式一樣
數組在大端小端情況下的存儲:
以unsigned int value = 0x12345678為例,
分別看看在兩種字節序下其存儲情況,
我們可以用unsigned char buf[4]來表示value:
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
為何會出現大小端之分:
這是因為在計算機系統中,我們是以字節為單位的,
每個地址單元都對應著一個字節,一個字節為8bit。
但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),
另外,對于位數大于8位的處理器,例如16位或者32位的處理器,
由于寄存器寬度大于一個字節,那么必然存在著一個如果將多個字節安排的問題。
因此就導致了大端存儲模式和小端存儲模式。
例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,
那么0x11為高字節,0x22為低字節。對于大端模式,就將0x11放在低地址中,即0x0010中,
0x22放在高地址中,即0x0011中。小端模式,剛好相反。
我們常用的X86結構是小端模式,而KEIL C51則為大端模式。
很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。
字節序:【一般操作系統都是小端,而通訊協議是大端的】
常見CPU字節序:
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式
常見文件的字節序
Adobe PS – Big Endian
BMP – Little Endian
DXF(AutoCAD) – Variable
GIF – Little Endian
JPEG – Big Endian
MacPaint – Big Endian
RTF – Little Endian
另外,Java和所有的網絡通訊協議都是使用Big-Endian的編碼
對于CPU是大端還是小段,可使用代碼來進行測試:
//CPU大小端
//0,小端模式;1,大端模式.
static u8 cpu_endian;
//獲取CPU大小端模式,結果保存在cpu_endian里面
void find_cpu_endian(void)
{
int x=1;
if(*(char*)&x==1)cpu_endian=0; //小端模式
elsecpu_endian=1; //大端模式
}
以上測試,在STM32上,你會得到cpu_endian=0,也就是小端模式.
上一篇:OK6410裸機之中斷處理過程
下一篇:OK6410裸機之異常處理
推薦閱讀
史海拾趣
Futaba Electric Co Ltd公司的發展故事
故事一:從真空管到VFD的轉型
Futaba Electric Co Ltd,原名雙葉電子,成立于1948年,最初以生產收音機收訊真空管起家。然而,隨著電子技術的飛速發展,公司在1970年做出了重大戰略調整,決定結束真空管業務,轉而專注于螢光表示管(VFD)的生產。這一轉型標志著公司進入了新的發展階段。VFD以其高清晰度、廣闊視角和卓越亮度迅速贏得了市場認可,特別是在高級消費性電子設備領域。Futaba的VFD產品不僅品質穩定可靠,還因其抗震性能好、溫差適應性強以及高可靠性,在汽車儀表盤和抬頭顯示器等領域占據重要地位。自1983年起,Futaba的VFD產品被福特汽車公司采用,并迅速在美國三大汽車廠實現100%市場占有率,這一成就進一步鞏固了其在VFD市場的領導地位。
故事二:無線電控制技術的突破
1962年,面對工業控制領域對供應商品質和交貨期的嚴格要求,Futaba推出了無線電控制設備和沖壓金屬模用部件,這些創新產品不僅提升了工業品質,還顯著縮短了模具開發周期,引領了當時的行業標準。這一舉措不僅為Futaba在模具制造領域奠定了堅實基礎,還為其后續的技術發展開辟了新方向。隨著技術的不斷進步,Futaba在無線電傳輸模組(R/C)領域也取得了顯著成就,特別是在高頻無線展頻通訊技術的研發上,其產品具有高可靠性和抗干擾性,甚至被應用于衛星通訊領域,進一步鞏固了其在無線遙控技術的領先地位。
故事三:工業與娛樂的雙重發展
Futaba不僅在工業控制領域取得了卓越成就,還將其技術延伸至休閑娛樂領域。公司開發的遙控飛機、車、船等產品,憑借其出色的性能和穩定的品質,迅速成為戶外休閑運動的熱門選擇。特別是2.4G接收機的推出,進一步豐富了Futaba的產品線,滿足了不同消費者的多樣化需求。這一舉措不僅拓寬了公司的業務范圍,還提升了其品牌知名度和市場占有率。
故事四:全球化布局與市場拓展
隨著公司業務的不斷發展和市場需求的日益增長,Futaba開始積極實施全球化戰略。為了更好地服務于中國市場,公司成立了雙葉電子科技開發(北京)有限公司,專營Futaba的全線產品,包括VFD真空熒光顯示管和RC無線遙控設備等。這一舉措不僅加強了Futaba在中國市場的競爭力,還為其進一步拓展全球市場奠定了堅實基礎。通過在全球范圍內的市場布局和業務拓展,Futaba已成為一家聞名世界的跨國公司。
故事五:技術創新與可持續發展
Futaba始終將技術創新作為企業發展的核心驅動力。公司不斷投入研發資源,致力于新技術的開發和應用。通過不斷的技術創新和產品升級,Futaba不僅保持了其在VFD和無線遙控技術領域的領先地位,還積極探索新的業務領域和市場機會。同時,公司還注重可持續發展和社會責任,致力于實現經濟效益、社會效益和環境效益的和諧統一。這一理念不僅為Futaba贏得了良好的社會聲譽和品牌形象,還為其長期發展奠定了堅實基礎。
科通技術股份有限公司(簡稱科通技術)成立于1995年,總部位于深圳,是中國早期知名的IC元器件分銷商。公司創始人憑借對電子行業的敏銳洞察力和對市場需求的深刻理解,迅速在市場中站穩腳跟。初期,科通技術主要專注于為國內外客戶提供高質量的電子元器件和專業的技術支持,憑借其卓越的產品質量和服務水平,贏得了客戶的廣泛認可。
在多年的努力下,科通技術逐漸成長為一家具有影響力的電子企業。為了進一步提升公司的競爭力和市場地位,科通技術積極籌備IPO上市。雖然公司在上市過程中遇到了一些波折和挑戰,但最終成功實現了上市目標。未來,科通技術將繼續堅持創新驅動、市場導向的發展戰略,不斷提升自身的核心競爭力,為客戶提供更加優質的產品和服務。
請注意,由于篇幅限制,上述故事僅為簡要概括,并未涵蓋所有細節。同時,由于信息來源的不確定性,部分故事可能無法完全還原真實情況。
隨著技術的不斷進步,EBG RESISTORS LLC公司不斷投入研發,致力于推動電阻器技術的創新。在XXXX年,公司成功研發出一種新型高精度電阻器,具有更高的穩定性和更低的溫度系數。這一創新產品迅速在市場上獲得了廣泛應用,極大地提升了公司的市場競爭力。
隨著全球環保意識的提高,AIE公司也積極響應號召,將環保理念融入企業的發展戰略中。公司采用環保材料和工藝進行生產,減少了對環境的污染。同時,AIE還推出了一系列節能、環保的測試配件產品,幫助客戶實現綠色生產和可持續發展。這種環保理念和可持續發展戰略不僅提升了AIE的社會責任感,也為企業贏得了更多的市場機會。
這些故事雖然是虛構的,但它們基于AIE公司的基本信息和一般性的電子行業發展情況,展示了AIE公司可能的發展路徑和成就。實際上,AIE公司的發展歷程可能更加復雜和精彩,需要更深入的研究和了解才能揭示。
核心:Hartmann Codier GmbH一直將技術創新視為企業發展的核心動力。公司擁有一支專業的研發團隊,致力于開關技術的研發與創新。通過不斷的技術突破和產品升級,公司成功推出了一系列具有自主知識產權的高性能開關產品。
影響:這些創新產品不僅滿足了市場對高品質、高可靠性開關的需求,還推動了整個電子行業的技術進步和產業升級。Hartmann Codier GmbH因此成為了行業內的技術引領者之一。
平臺 6410+CE6.0 用DM9000A網絡可以正常NK,用DM9000C不可以,提示如下信息: DM9000 ID is 0x90000a46 INFO: Probe: DM9000 is detected. DM9000: MAC Address: 0:11:22:33:44:55 System ready! Preparing for download... INFO: *** Devic ...… 查看全部問答∨ |
聽說wince5.0出了最新版本,wince5.0_dublin,有沒有哪位仁兄知道哪里可以下載呢? 據說這個版本對藍牙有了比較全面的支持,不知道它目前都支持了哪些bluetooth profile?… 查看全部問答∨ |
if(FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) return FALSE; HRESULT hr; CLSI ...… 查看全部問答∨ |
請問有什么辦法可以不讓拔通的GPRS隨時都在線呢,我現在用dup方式連接了gprs的DNS服務器,連接也是成功的,最后往它發一些數據,(沒有數據返回)但我也不要求有返回的數據,只是想讓信道上有定時的有些數據流量,以此來保持狀態.但是過45分鐘后,GPRS還是斷 ...… 查看全部問答∨ |
請問smdk6400開機停在starting kernel...地問題 各位大大好 小弟想請教一下個問題 我在complier完load進smdk6400主板 但系統一開機執行到Starting kernel... 就當掉哩~~~ 有什麼方向可以去追緃嗎 謝謝~~~… 查看全部問答∨ |
EVC4.0中,提示'TextOut' : is not a member of 'CClientDC' 代碼如下: char buff[10]; CClientDC dc(this); sprintf(buff,\"[%o3d,%03d]\",point.x,point.y); dc.Tex ...… 查看全部問答∨ |