中文字幕日本一区久久,国产你懂,国产高清视频免费最新在线http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇ARM基礎(chǔ)知識連載之五http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1453&Page=1wangxinxin2010-11-18 12:06:15在應(yīng)用程序中安裝異常中斷處理程序
1.使用跳轉(zhuǎn)指令:可以在異常中斷對應(yīng)異常向量表中特定位置放置一條跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到該異常中斷的處理程序。這種方法有一個缺點,即只能在32M空間范圍內(nèi)跳轉(zhuǎn)。
2.使用數(shù)據(jù)讀取指令LDR:使用數(shù)據(jù)讀取指令LDR向程序計數(shù)器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對地址存放在存放在距離向量表4KB范圍內(nèi)的一個存儲單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計數(shù)器PC中。
**在系統(tǒng)復(fù)位時安裝異常中斷處理程序**
1.地址0x00處為ROM的情況
  使用數(shù)據(jù)讀取指令LDR示例如下所示:
  Vector_Init_Block
  LDR PC, Reset_Addr
  LDR PC, Undefined_Addr
  LDR PC, SW_Addr
  LDR PC, Prefeth_Addr
  LDR PC, Abort_Addr
  NOP
  LDR PC, IRQ_Addr
  LDR PC, FIQ_Addr
  Reset_Addr  DCD Start_Boot
  Undefined_Addr DCD Undefined_Handle
  SW_Addr  DCD SWI_Handle
  Prefeth_Addr  DCD Prefeth_Handle
  Abort_Addr  DCD Abort_Handle
   DCD 0
  IRQ_Addr  DCD IRQ_Handle
  FIQ_Addr  DCD FIQ_Handle
使用跳轉(zhuǎn)指令的示例如下所示:
  Vector_Init_Block
  BL Reset_Handle
  BL DCD Undefined_Handle
  BL SWI_Handle
  BL Prefeth_Handle
  BL Abort_Handle
  NOP
  BL IRQ_Handle
  BL FIQ_Handle
2.地址0x00處為RAM的情況
地址0x00處為RAM時,中斷向量表必須使用數(shù)據(jù)讀取指令直接指向PC中賦值的形式。而且,必須使用下面的代碼巴中斷向量表從ROM中復(fù)制到RAM中地址0x00開始處的存儲空間中:

MOV r8,#0
ADR r9,Vector_Init_Block
;復(fù)制中斷向量表(8字)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)
;復(fù)制保存各中斷處理函數(shù)地址的表(8字words)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)
*********************************************
ARM存儲系統(tǒng)概述
*********************************************
ARM存儲系統(tǒng)的體系結(jié)構(gòu)適應(yīng)不同的嵌入式
應(yīng)用系統(tǒng)的需要差別很大。最簡單的存儲系統(tǒng)使用平辦事的地址映射機制,就像一些簡單的彈片機系統(tǒng)中一樣,地址空間的分配方式是固定的,系統(tǒng)各部分都使用物
理地址。而一些復(fù)雜系統(tǒng)可能包括下面的一種或幾種技術(shù),從而提供更為強大的存儲系統(tǒng)。
**系統(tǒng)中可能包含多種類型的存儲器,如FLASH,ROM,RAM,EEPROM等,不同類型的存儲器的速度和寬度等各不相同。
**通過使用CACHE及WRITE BUFFER技術(shù)縮小處理器和存儲系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。
**內(nèi)存管理部件通過內(nèi)存映射技術(shù)實現(xiàn)虛擬空間到物理空間的映射。在系統(tǒng)加電時,將ROM/FLASH影射為地址0,這樣可以進(jìn)行一些初始化處理;當(dāng)這些初始化完成后將RAM地址影射為0,并把系統(tǒng)程序加載到RAM中運行,這樣很好地解決了嵌入式系統(tǒng)的需要。
**引入存儲保護(hù)機制,增強系統(tǒng)的安全性。
**引入一些機制保證I/O操作應(yīng)設(shè)成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。
**與存儲系統(tǒng)相關(guān)的程序設(shè)計指南**
本節(jié)從外部來看ARM存儲系統(tǒng),及ARM存儲系統(tǒng)提供的對外接口。本節(jié)介紹用戶通過這些接口來訪問ARM存儲系統(tǒng)時需要遵守的規(guī)則。
1.地址空間
ARM體系使用單一的和平板地址空間。該地址空間大小為2^32個8位字節(jié),這些字節(jié)的單元地址是一個無符號的32位數(shù)值,其
取值范圍為0~2^32-1。ARM地址空間也可以看作是2^30個32位的字單元。這些字單元的地址可以被4整除,也就是說該地址低兩位為0b00。地
址為A的字?jǐn)?shù)據(jù)包括地址為A、A+1、A+3、A+3 4個字節(jié)單元的內(nèi)容。
各存儲單元的地址作為32為無符號數(shù),可以進(jìn)行常規(guī)的整數(shù)運算。這些運算的結(jié)果進(jìn)行2^32取模。
程序正常執(zhí)行時,每執(zhí)行一條ARM指令,當(dāng)前指令計數(shù)器加4個字節(jié);每執(zhí)行一條Thumb指令,當(dāng)前指令計數(shù)器加2個字節(jié)。但是,當(dāng)?shù)刂飞习l(fā)生溢出時,執(zhí)行結(jié)果將是不可預(yù)知的。
2.存儲器格式
在ARM中,如果地址A是字對齊的,有下面幾種:
**地址為A的字單元包括字節(jié)單元A,A+1,A+2,A+3。
**地址為A的班子單元包括字節(jié)單元A,A+1。
**地址為A+2的半字單元包括字節(jié)單元A+2,A=3.
**地址為A的字單元包括半字節(jié)單元A,A+2。
在big-endian格式中,對于地址為a的字單元其中字節(jié)單元由高位到低位字節(jié)順序為A,A+1,A=2,A+3;這種存儲器格式如下所示:
31       24 23                    16 15           8 7        0
--------------------------------------------------------------------
字單元A           |
--------------------------------------------------------------------
半字單元A   | 半字單元A+2     |
--------------------------------------------------------------------
字節(jié)單元A    | 字節(jié)單元A+1 | 字節(jié)單元A+2   | 字節(jié)單元A+3|
--------------------------------------------------------------------
在little-endian格式中,對于地址為A的字單元由高位到低位字節(jié)順序為A+3,A+2,A+1,A,這種存儲格式如下所示
31       24 23                    16 15           8 7        0
--------------------------------------------------------------------
字單元A           |
--------------------------------------------------------------------
半字單元A+2   | 半字單元A     |
--------------------------------------------------------------------
字節(jié)單元A+3    |字節(jié)單元A+2 | 字節(jié)單元A+1   | 字節(jié)單元A  |
--------------------------------------------------------------------
在ARM系統(tǒng)中沒有提供指令來選擇存儲器格式。如果系統(tǒng)中包含標(biāo)準(zhǔn)的ARM控制協(xié)處理器CP15,則CP15的寄存器C1的位[7]決定系統(tǒng)中存儲
器的格式。當(dāng)系統(tǒng)復(fù)位時,寄存器C1的[7]值為零,這時系統(tǒng)中存儲器格式為little-endian格式。如果系統(tǒng)中采用的是big-endian格
式,則復(fù)位異常中斷處理程序中必須設(shè)置c1寄存器的[7]位。
3.非對齊的存儲訪問操作
非對齊:位于arm狀態(tài)期間,低二位不為0b00;位于Thumb狀態(tài)期間,最低位不為0b0。
3.1非對齊的指令預(yù)取操作
如果系統(tǒng)中指定當(dāng)發(fā)生非對齊的指令預(yù)取操作時,忽略地址中相應(yīng)的位,則由存儲系統(tǒng)實現(xiàn)這種忽略。
3.2非對齊的數(shù)據(jù)訪問操作
對于LOAD/STORE操作,系統(tǒng)定義了下面3中可能的結(jié)果:
***執(zhí)行結(jié)果不可預(yù)知
***忽略字單元地址低兩位的值,即訪問地址為字單元;忽略半字單元最低位的值,即訪問地址為半字單元。
***由存儲系統(tǒng)忽略字單元地址中低兩位的值,半字單元地址最低位的值。
4.指令預(yù)取和自修改代碼
當(dāng)用戶讀取PC計數(shù)器的值時,返回的是當(dāng)前指令下面的第二條指令的地址。對于ARM指令來說,返回當(dāng)前指令地址值加8個字節(jié);對于Thumb指令來說,返回值為當(dāng)前指令地址值加4個字節(jié)。
自修改代碼指的是代碼在執(zhí)行過程中修改自身。應(yīng)盡量避免使用。
5.存儲器映射的I/O空間
在ARM中,I/O操作通常被影射為存儲器操作。通常需要將存儲器映射的I/O空間設(shè)置成非緩沖的。
*************************************************************
ARM編譯器支持的數(shù)據(jù)類型
************************************************************
數(shù)據(jù)類型 長度(位) 對齊特性
Char       8                1(字節(jié)對齊)
short      16               2(百字對齊)
Int           32              4(字對齊)
Long      32               4(字對齊)
Longlong 64            4(字對齊)
Float       32              4(字對齊)
Double     64               4(字對齊)
Long double 64           4(字對齊)
All pointers 32             4(字對齊)
Bool(C++ only) 32           4(字對齊)
1.整數(shù)類型
在ARM體系中,整數(shù)類型是以2的補碼形式存儲的。對于long long類型來說,在little
endian內(nèi)存模式下,其低32位保存在低地址的字單元中,高32為保存在高地址的字單元中;在big
endian模式下,其低32位保存在高地址的字單元中,高32為保存在低地址的字單元中。對于整型數(shù)據(jù)的操作遵守下面的規(guī)則:
**所有帶符號的整型書的運算是按照二進(jìn)制的補碼進(jìn)行的。
**帶符號的整型數(shù)的運算不進(jìn)行符號的擴展。
**帶符號的整型數(shù)的右移操作是算數(shù)移位。
**制定的移位位數(shù)的數(shù)是8位的無符號數(shù)。
**進(jìn)行移位操作的數(shù)被作為32位數(shù)。
**超過31位的邏輯左移的結(jié)果為0。
**對于無符號數(shù)和有符號的正數(shù)來說,超過32位的右移操作結(jié)果為0;對于有符號的負(fù)數(shù)來說,超過32位的右移操作結(jié)果為-1。
**整數(shù)除法運算的余數(shù)和除數(shù)有相同的符號。
**當(dāng)把一個整數(shù)截斷成位數(shù)更短的整數(shù)類型的數(shù)時,并不能保證所得到的結(jié)果的最高位的符號位的正確性。
**整型數(shù)據(jù)之間的類型轉(zhuǎn)換不會產(chǎn)生異常中斷。
**整型數(shù)據(jù)的溢出不會產(chǎn)生異常中斷。
**整型數(shù)據(jù)除以0將會產(chǎn)生異常中斷。
2.浮點數(shù)
在ARM體系中,浮點數(shù)是按照IEEE標(biāo)準(zhǔn)存儲的。
**float類型的數(shù)是按照IEEE的單精度數(shù)表示的。
**double和long double 是用IEEE的雙精度數(shù)表示的。
對于浮點數(shù)的操作遵守下面的規(guī)則:
**遵守正常的IEEE754規(guī)則。
**當(dāng)默認(rèn)情況下禁止浮點數(shù)運算異常中斷。
**當(dāng)發(fā)生卷繞時,用最接近的數(shù)據(jù)來表示。
3.指針類型的數(shù)據(jù)
下面的規(guī)則適用于處數(shù)據(jù)成員指針以外的其他指針:
**NULL被定義為0。
**相鄰的兩個存儲單元地址相差一。
**在指向函數(shù)的指針和指向數(shù)據(jù)的指針進(jìn)行數(shù)據(jù)轉(zhuǎn)換時,編譯器將會產(chǎn)生警告信息。
**類型size_t被定義為unsigned int.
**類型ptrdiff_t被定義為signed int。
**兩個指針類型的數(shù)據(jù)相減時,結(jié)果可以按照下面的公式得到。
    ((int)a-(int)b)/(int)sizeof(type pointed to)
這時,只要指針?biāo)傅膶ο蟛皇莗ack的,其對齊特性能夠滿足整除的要求。
*****************************************************
ARM編譯器中預(yù)定義的宏
*****************************************************
ARM編譯器預(yù)定義了一些宏,這些預(yù)定義宏對應(yīng)一定的數(shù)值,有些預(yù)定義宏沒有對應(yīng)數(shù)值,見下表:
_arm                _               使用編譯器armcc,tcc,armcpp,tcpp時
_ARMCC_VERSION      Ver             代表編譯器版本號,其格式為:
                                    PVtbbb,其中:
                                    P為產(chǎn)品編號(1代表ADS)
                                    V為副版本號(1代表1.1)
                                    T為補丁版本號(0代表1.1)
                                    bbb為build號(比如650)
_APCS_INTERWORK     _               使用編譯選項-apcs/interwork時
_APCS_ROPI          _               使用編譯選項apcs/ropi時
_RWPI               _               使用編譯選項-apcs/rwpi時
_APCS_SWST          _               使用編譯選項-apcs/swst時
_BIG_ENDIAN         _               編譯器針對目標(biāo)系統(tǒng)使用big-endian內(nèi)存模式時
_cplusplus          _               編譯器工作與C++模式時
_CC_ARM             _               返回編譯器的名稱
_DATE_              date            編譯源文件的日期
_embedded_cplusplus                 編譯器工作于EC++模式時
_FEATURE_SINGED_CHAE                使用編譯設(shè)置選項-zc時設(shè)置該預(yù)定義宏
_FILE_              name            包含全路徑的當(dāng)前被編譯的源文件名稱
_func_              name            當(dāng)前被編譯的函數(shù)名稱
_LINE_              num             當(dāng)前被編譯的代碼行號名稱
]]>
6700加128M內(nèi)存探討http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1452&Page=1wangxinxin2010-11-18 9:50:37內(nèi)存升級方法后給很多機的機友過了把癮,很多商家?guī)砹松虣C。! q! O7 {' y8 |( C3 B8 A
可是自己弄來了很多麻煩,進(jìn)的芯片不得不把他用完,幫升級完的機友過后機子有其他問題又不得不幫看看,為此影響了很多的工作
) h7 ]. M5 \  {0 p# t* M為此在6700出來后只指導(dǎo)了廣州的一位朋友硬件的升級方法,之后他做了以后沒有得到結(jié)果,本人知道一定要修改ROM才行,但花的時間太多就沒有再去研究,現(xiàn)在看到壇子上很多機友對這個東西有興趣,這兩天有時間就花了些時間看看* L& W9 g. P9 e1 [& {
1、首先,CPU要找到RAM必有AM的參數(shù)定義,對于PXA270,這個寄存器是0x48000000
9 K  p3 |- u5 Q' u2 k: g1 C7 t* \! p2、程序中必有地方定義這個東西,查找在IPL中4 c; p4 ?9 j+ L/ l. w& i. n1 K5 [
ROM:000001F8                 MOV     R3, #0x48000000
9 }* a* a% M1 o. {5 O9 k- \ROM:000001FC                 LDR     R2, =0xAC80AC8
$ F( ?2 P/ w- K* X( H. @  j4 n6 [8 d+ p8 |; {4 d$ U
這里定義SDRAM為4Bank,8192X512,Partition disabled,這個和18L256、25L256、25L512的芯片的結(jié)構(gòu)是一樣的,只是尋址時地址一直上加,呵呵!當(dāng)然另有內(nèi)存空間大小的查找模塊
  }) H4 f% N! O/ C: b' O
5 ^8 l/ V( r+ J' i5 J, L4 I5 |' ^因為是Partition disabled,尋址時不可能找到下一個要用CS選擇的內(nèi)存塊
; _  B! U/ s' }( Q7 f  d. n6 N9 y+ j4 @9 T  j
只能再查找ROM,在NK.EXE文件中找到再一次操作內(nèi)存定義6 q, y* q# V: {% ?" u1 W
.text:905411A4                 STR     R2, [R3,#0x60]
: h- A3 \! D* z  o9 [.text:905411A8                 MOV     R3, #0x480000009 A6 D9 p, ~. D! y# u+ ]8 t
.text:905411AC                 LDR     R2, [R3]
' T  n" o$ y, H! G$ C1 G! m.text:905411B0                 ORR     R2, R2, #36 q' p5 r. [" }4 J+ P4 d" v; R
.text:905411B4                 STR     R2, [R3]
/ ?: i9 c9 _4 N( i6 _1 X在這里Partition 已經(jīng)就為ENABLED,也就是說當(dāng)尋址完當(dāng)前的內(nèi)存塊后可以能使用CS選擇下一個塊了,看來問題也不在這里
) D6 P. P$ N; g; t5 J9 R0 w4 p' c- x( S" I2 P" H! Z8 F% b: c
突然想起在升級XIP時發(fā)現(xiàn)XIP中有RAM的空間定義,在這里找到了它
9 C* o5 Q( F# N) K
; g* V) s4 G! H) @! Z7 |. P9 `8 {3 T9 ?
修改成為128M,刷機后發(fā)現(xiàn)沒有成功
1 [& j* t) Q3 e* t7 K2 m! G) J2 L% I3 S7 B- i
呵呵!還不知到底要修改什么地方啊!有沒有會ARM匯編的機友或是對其他的機友一起論壇一下+ F9 j/ K! k9 [" p5 ~8 X
/ ^: l2 k" T5 V6 ?5 K8 w: b
D1 f1 X. r

]]>
CY7C68013-128-USB2.0開發(fā)學(xué)習(xí)板http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1451&Page=1wangxinxin2010-11-18 9:34:36開發(fā)學(xué)習(xí)板簡介

   USB2.0芯片為何選擇CY7C68013:

     1. 高性價比,通用USB2.0接口芯片中全世界市場占有量最大,國外市場占用率最大。

     2. 最大4K USB端點緩沖區(qū),可設(shè)置為雙緩沖,三緩沖或四緩沖,全面支持USB2.0高速傳輸。

     3. 內(nèi)嵌增強型8051內(nèi)核,沿用傳統(tǒng)8051開發(fā)方法,固件開發(fā)工具為KEIL C51。

       時鐘高達(dá)48MHz,單指令周期為83.3nS;

       雙串口USART0和USART1,波特率支持230K;

       400K高速I2C接口;

       支持雙數(shù)據(jù)指針;

       8KB片內(nèi)RAM,可存放數(shù)據(jù)和代碼

       五個復(fù)用數(shù)據(jù)端口PORTA,PORTB,PORTC,PORTD,PORTE;

       五個外部中斷源;

     4. 支持在線仿真和在線下載

     5. 端點緩沖區(qū)“量子FIFO”支持GPIF和SLAVE FIFO傳輸方式,實現(xiàn)端點FIFO和外設(shè)“膠連接”,支持8位/16位總線,速度可到96MB/S。

     6. 三種有效封裝形式,TQFP128,TQFP100,TSSOP56,用戶根據(jù)功能和成本來選擇封裝形式。

     7. CY7C68013A是CY7C68013的升級版本,完全兼容,CY7C68013發(fā)熱量較大,CY7C68013A為低功耗型,大容量16KB片內(nèi)RAM。

開發(fā)板特色:

     1. 無需編程器,完整在線編程方案

     2. 無需仿真器,完整在線仿真方案

     3. 完整中文文檔,包括《使用文檔V2.0》和《開發(fā)文檔V2.0》,《使用文檔V2.0》介紹開發(fā)板使用和常見問題;《開發(fā)文檔V2.0》詳細(xì)介紹CY7C68013(簡稱FX2)硬件設(shè)計、固件編程、VC編程和產(chǎn)品發(fā)布整個開發(fā)過程。

     4. 專業(yè)技術(shù)支持,3年FX2產(chǎn)品開發(fā)經(jīng)驗,包括USB2.0高速數(shù)據(jù)采集板,USB2.0同步數(shù)據(jù)采集板和高速圖像傳輸?shù)龋瑸榭蛻籼峁┊a(chǎn)品定制。

     5. 豐富的實驗例子,包括批量傳輸,中斷傳輸,控制傳輸,I2C按鈕和數(shù)碼管實驗,F(xiàn)X2.0傳輸速度測試,IO端口控制,給出例子程序固件源代碼、VC程序源代碼和驅(qū)動源代碼。

     6. GPIF開發(fā)實例,提供開發(fā)工具和實例所有源代碼,開發(fā)文檔詳細(xì)講解GPIF開發(fā)過程。

     7. 開發(fā)環(huán)境,已建立固件、驅(qū)動和應(yīng)用程序開發(fā)環(huán)境,有產(chǎn)品發(fā)布實例,縮短客戶產(chǎn)品開發(fā)時間。

     8. 測試速度,開發(fā)板測試中實際傳輸速度可到29M字節(jié)每秒。

     9. 擴展IO,F(xiàn)X2功能引腳和CPLD IO通過排針引出,支持FX2的SLAVE FIFO和GPIF方式二次開發(fā)。

     10. 硬件配置,包括:開發(fā)板一個,光盤一張,串口線一根,5V/1A開關(guān)電源一個、USB2.0屏蔽線一根。

     11. 芯片選型,采用128引腳FX2芯片,擴展64KB外部RAM,開發(fā)板功能和CYPRESS原版開發(fā)板類似。

     12. 專業(yè)焊接,保證開發(fā)板質(zhì)量。

開發(fā)板內(nèi)容:

   項目 說明;

    硬件配置:

        5V/1A開關(guān)電源一個

        串口線1根

        USB A-B線一根

        USB芯片:CY7C68013-128AC

        I2C按鈕:4個

        I2C段數(shù)碼管:1個

        EEPROM: 1片

        CPLD:1片

        SRAM:128KB

        用戶擴展口 串口1,PLD[18:1],D[7:0],PC[7:0],PD[7:0],PB[7:0],CTL[5:0],RDY[5:0],IFCLK,INT4和INT5,

       3.3V和5V電源,方便用戶擴展。

       PLD[18:1]為CPLD的IO,PA[7:0],PE[7:0],A[15:8]

       以及FX2選通、讀、寫、復(fù)位均CPLD的IO上,用戶可通過CPLD編程來靈活控制。

  軟件配置:   

       開發(fā)文檔 114頁中文開發(fā)文檔 中文開發(fā)板使用文檔

       固件源代碼 I2C按鈕輸入和數(shù)碼管輸出實驗dev_io

       USB2.0速度測試實驗spendtest/bulkspeed

       控制傳輸實例

       批量傳輸實例bulkTest

       中斷傳輸方式實例intTest

       IO測試實例iotest

       VC應(yīng)用源代碼 USB2.0速度測試實驗spendtest/testApp

       CYPRESS控制面板源代碼(多線程設(shè)計)

       批量傳輸實例(多線程設(shè)計)

       GPIF編程實例 通過一個例程,詳細(xì)介紹GPIF開發(fā)過程,包括GPIF波形編輯,固件編程和實例測試

       CPLD源代碼 FX2.V,采用ALTERA芯片,可學(xué)習(xí)CPLD編程

       驅(qū)動源代碼(DDK) 固件下載驅(qū)動,已構(gòu)建VC開發(fā)環(huán)境

       FX2通用驅(qū)動,已構(gòu)建VC開發(fā)環(huán)境,適用于WIN 98SE,2K和XP操作系統(tǒng)

       產(chǎn)品發(fā)布 基于批量傳輸實例,安裝文件dj.inf,固件下載驅(qū)動dj.sys,通用驅(qū)動ezusb.sys,測試應(yīng)用程序bulktest.exe

  光盤內(nèi)容:

       CYPRESS FX2開發(fā)包,

       GPIF開發(fā)包

       CY7C68013文檔(英文,pdf格式):芯片詳細(xì)文檔和概述文檔,控制面板使用說明(英文)

       開發(fā)工具:USB調(diào)試工具bushoundC51編譯工具Keil C51 V7.02 DDK安裝包Win 2000DDKDriverStudio V2.7文本編譯工具Uedit32

       USB規(guī)范:USB1.1規(guī)范(中文和英文),USB2.0規(guī)范(英文),USB OTG規(guī)范(英文)

       各種USB驅(qū)動開發(fā)電子書籍

       CY7C68013-128開發(fā)文檔V2.02. CY7C68013-128使用文檔V2.0

       產(chǎn)品發(fā)布實例

       固件和VC源代碼

       GPIF實例源代碼

       電路原理圖(PROTEL格式)

  其它服務(wù):承接USB高速數(shù)據(jù)板項目,已推出16MB/S高速數(shù)據(jù)采集板和32路同步USB2.0采集板]]>
單片機學(xué)習(xí)的基本過程http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1450&Page=1wangxinxin2010-11-18 9:32:10經(jīng)常有單片機愛好者問我們,如何學(xué)習(xí)單片機?學(xué)習(xí)單片機的步驟是什么?我們初略總結(jié)了一下,單片機學(xué)習(xí)的過程基本上可分四個階段:


第一階段


是先瀏覽教科書里的硬件部分,大至了解單片機的硬件結(jié)構(gòu)。如ROMRAM、地址、IO口等,以及看一些廠家的MCU資料(Data Sheet),來加強MCU所提供各項資源的印象。


第二階段


 
就是了解二進(jìn)位數(shù)字、十六進(jìn)位數(shù)和軟件方面的內(nèi)容。盡管有很多高級語言可用于單片機的編程,但我覺得初學(xué)還是以匯編語言為好,更有利于和硬件結(jié)合,掌握硬件結(jié)構(gòu)。知道匯編語言、機器語言、
指令、
程序等概念后,就從MOV指令開始,學(xué)習(xí)匯編語言和編程,在此如51的MCU匯編語言系統(tǒng)有111條指令,簡單又好理解它們怎
樣和硬件聯(lián)系,更有助于一般學(xué)習(xí)單片機的指令整合與運用.因此其方法可先了
解幾條基本的MOV指令和它的機器語言,大致建立起單片機的硬件和軟件概念,
來知道單片機的硬件是由指令控制指揮的。


第三階段


按照編程環(huán)境的使用手冊,熟悉使用編程環(huán)境。現(xiàn)在的編程環(huán)境一般都和電腦相連,只要具備基本電腦知識的人都可很快掌握操作步驟。


第四階段



是依靠實驗板,學(xué)習(xí)掌握單片機的匯編語言指令系統(tǒng)和簡單編程。
同時和前面所學(xué)硬件知識結(jié)合組裝,起到主學(xué)軟件,鞏固硬件的雙重作用。開始
時可用別人編的簡單程式在實驗板上進(jìn)行驗證、分析,主要是熟悉該學(xué)習(xí)方法,
在應(yīng)用方面主要針對單片機I/O各項介面的使用,如A/DD/APWM輸出的應(yīng)用,LCDVFD的控制,以及如何規(guī)范各項串列輸出入口的通訊協(xié)定等,對其所控制的各項元器件須先分析驅(qū)動能力,如電流電壓問題等。匯編語言熟悉后,
建議盡快學(xué)習(xí)C語言的編程,畢竟C語言有功能豐富的庫函數(shù)、運算速度快、編譯效率高、
有良好的可移植性,而且可以直接實現(xiàn)對系統(tǒng)硬件的控制。C語言是一種結(jié)構(gòu)化
程序設(shè)計語言,它支持當(dāng)前程序設(shè)計中廣泛采用的由頂向下結(jié)構(gòu)化程序設(shè)計技
術(shù)。此外,C語言程序具有完善的模塊程序結(jié)構(gòu),從而為軟件開發(fā)中采用模塊化
程序設(shè)計方法提供了有力的保障。因此,使用C語言進(jìn)行程序設(shè)計已成為軟件
開發(fā)的一個主流。用C語言來編寫目標(biāo)系統(tǒng)軟件,會大大縮短開發(fā)周期,且明顯地
增加軟件的可讀性,便于改進(jìn)和擴充,從而研制出規(guī)模更大、性能更完備的系統(tǒng)。

]]>
Arm-Linux 之 tslibhttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1449&Page=1wangxinxin2010-11-18 9:27:26
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
Ubuntu 9.10 下ARM開發(fā)板的NFS掛載http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1448&Page=1wangxinxin2010-11-18 9:24:44
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
ARM LPC2132和UCOS II 寫的第一個程序http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1447&Page=1wangxinxin2010-11-18 9:23:45#include "config.h" #include "stdlib.h"

#define TaskStkLengh 512 //Define the Task0 stack length 定義用戶任務(wù)0的堆棧長度

OS_STK Main_Stack[TaskStkLengh]; //主任務(wù)堆棧

//任務(wù)1 OS_STK Task1_Stack[TaskStkLengh];//任務(wù)1堆棧

//任務(wù)2 OS_STK Task2_Stack[TaskStkLengh];//任務(wù)2堆棧

///任務(wù)3 OS_STK Task3_Stack[TaskStkLengh];//任務(wù)3堆棧

#define LED2 (1 << 19) // P1.18控制LED2 #define LED3 (1 << 20) // P1.18控制LED3 #define LED4 (1 << 21) // P1.18控制LED4

//任務(wù)1函數(shù)定義 void Task1_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); IO1CLR = LED2; //點亮LED2 OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(1000); //延時掛起 } }

//任務(wù)2函數(shù)定義 void Task2_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); IO1CLR = LED3; //點亮LED3 OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(1000); //延時掛起 } }

//任務(wù)3函數(shù)定義 void Task3_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); IO1CLR = LED4; //點亮LED4 OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(1000); //延時掛起 } }

//主任務(wù)的定義 void Main_Task(void *pdata) { pdata=pdata; TargetInit (); //在此處開放定時中斷 IO1SET = 0xffffffff; OSTimeDly(100); IO1CLR = 0x00040000; OSTimeDly(OS_TICKS_PER_SEC/2); OSTaskCreate(Task1_Task,(void *)0,&Task1_Stack[TaskStkLengh-1],12); OSTaskCreate(Task2_Task,(void *)0,&Task2_Stack[TaskStkLengh-1],14); OSTaskCreate(Task3_Task,(void *)0,&Task3_Stack[TaskStkLengh-1],16); while(1) { OSTimeDly(1000); } }

//主函數(shù)開始 int main() { //這里寫對目標(biāo)初始化函數(shù) OSInit(); //千萬不要在此處開放定時中斷,即調(diào)用TargetInit(); PINSEL1=0X00000000; //引腳設(shè)為GPIO功能 IO1DIR =0XFFFFFFFF; //引腳設(shè)為輸出模式 IO1SET =0Xffffffff; //引腳全部設(shè)為滅狀態(tài) OSTaskCreate(Main_Task,(void *)0,&Main_Stack[TaskStkLengh-1],10); OSStart(); //此函數(shù)永遠(yuǎn)不會返回 return 0; }

]]>
裝備腳本問題http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1446&Page=1wangxinxin2010-11-18 9:16:36
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/ ◆ 拡張裝備畫面 - KGC_ExtendedEquipScene ◆ VX ◆
  3. #_/ ◇ Last update : 2008/02/10 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/ 機能を強化した裝備畫面を作成します。
  6. #_/============================================================================
  7. #_/ 【基本機能】?ヘルプウィンドウ機能拡張? より下に導(dǎo)入してください。
  8. #_/ 【裝備】?裝備拡張? より上に導(dǎo)入してください。
  9. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  10. #==============================================================================
  11. # ★ カスタマイズ項目 - Customize ★
  12. #==============================================================================
  13. module KGC
  14. module ExtendedEquipScene
  15. # ◆ パラメータ名
  16. VOCAB_PARAM = {
  17. :hit => "命中率", # 命中率
  18. :eva => "回避率", # 回避率
  19. :cri => "必殺率", # クリティカル率
  20. } # ← この } は消さないこと!
  21. # ◆ 裝備変更時に表示するパラメータ
  22. # 表示したい順に , で區(qū)切って記入。
  23. # :maxhp .. 最大 HP
  24. # :maxmp .. 最大 MP
  25. # :atk .. 攻撃力
  26. # :def .. 防御力
  27. # :spi .. 精神力
  28. # :agi .. 敏捷性
  29. # :hit .. 命中率
  30. # :eva .. 回避率
  31. # :cri .. クリティカル率
  32. EQUIP_PARAMS = [ :atk, :def, :spi, :agi, :hit, :eva, :cri ]
  33. # ◆ 裝備畫面のコマンド名
  34. COMMANDS = [
  35. "裝備變更", # 裝備変更
  36. "最強裝備", # 最強裝備
  37. "卸下所有裝備", # すべて外す
  38. ] # ← この ] は消さないこと!
  39. # ◆ 裝備畫面コマンドのヘルプ
  40. COMMAND_HELP = [
  41. "更換裝備而已", # 裝備変更
  42. "省力啊但是不可靠", # 最強裝備
  43. "省力又可靠", # すべて外す
  44. ] # ← この ] は消さないこと!
  45. # ◆ 最強裝備を行わない裝備種別
  46. # 最強裝備から除外する裝備種別を記述。
  47. # -1..武器 0..盾 1..頭 2..身體 3..裝飾品 4~..?裝備拡張? で定義
  48. IGNORE_STRONGEST_KIND = [3, 5]
  49. end
  50. end
  51. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  52. $imported = {} if $imported == nil
  53. $imported["ExtendedEquipScene"] = true
  54. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  55. #==============================================================================
  56. # ■ Vocab
  57. #==============================================================================
  58. module Vocab
  59. # 命中率
  60. def self.hit
  61. return KGC::ExtendedEquipScene::VOCAB_PARAM[:hit]
  62. end
  63. # 回避率
  64. def self.eva
  65. return KGC::ExtendedEquipScene::VOCAB_PARAM[:eva]
  66. end
  67. # クリティカル率
  68. def self.cri
  69. return KGC::ExtendedEquipScene::VOCAB_PARAM[:cri]
  70. end
  71. end
  72. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  73. #==============================================================================
  74. # □ Window_ExtendedEquipCommand
  75. #------------------------------------------------------------------------------
  76. # 拡張裝備畫面で、実行する操作を選択するウィンドウです。
  77. #==============================================================================
  78. class Window_ExtendedEquipCommand < Window_Command
  79. #--------------------------------------------------------------------------
  80. # ● オブジェクト初期化
  81. #--------------------------------------------------------------------------
  82. def initialize
  83. super(160, KGC::ExtendedEquipScene::COMMANDS)
  84. self.active = false
  85. self.z = 1000
  86. end
  87. #--------------------------------------------------------------------------
  88. # ● ヘルプウィンドウの更新
  89. #--------------------------------------------------------------------------
  90. def update_help
  91. @help_window.set_text(KGC::ExtendedEquipScene::COMMAND_HELP[self.index])
  92. end
  93. end
  94. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  95. #==============================================================================
  96. # □ Window_EquipBaseInfo
  97. #------------------------------------------------------------------------------
  98. # 裝備畫面で、アクターの基本情報を表示するウィンドウです。
  99. #==============================================================================
  100. class Window_EquipBaseInfo < Window_Base
  101. #--------------------------------------------------------------------------
  102. # ● オブジェクト初期化
  103. # x : ウィンドウの X 座標(biāo)
  104. # y : ウィンドウの Y 座標(biāo)
  105. # actor : アクター
  106. #--------------------------------------------------------------------------
  107. def initialize(x, y, actor)
  108. super(x, y, Graphics.width / 2, WLH + 32)
  109. @actor = actor
  110. refresh
  111. end
  112. #--------------------------------------------------------------------------
  113. # ● リフレッシュ
  114. #--------------------------------------------------------------------------
  115. def refresh
  116. self.contents.clear
  117. draw_actor_name(@actor, 0, 0)
  118. # EP 制を使用する場合は EP を描畫
  119. if $imported["EquipExtension"] && KGC::EquipExtension::USE_EP_SYSTEM
  120. draw_actor_ep(@actor, 116, 0, Graphics.width / 2 - 148)
  121. end
  122. end
  123. end
  124. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  125. #==============================================================================
  126. # ■ Window_EquipItem
  127. #==============================================================================
  128. class Window_EquipItem < Window_Item
  129. #--------------------------------------------------------------------------
  130. # ● オブジェクト初期化
  131. # x : ウィンドウの X 座標(biāo)
  132. # y : ウィンドウの Y 座標(biāo)
  133. # width : ウィンドウの幅
  134. # height : ウィンドウの高さ
  135. # actor : アクター
  136. # equip_type : 裝備部位
  137. #--------------------------------------------------------------------------
  138. alias initialize_KGC_ExtendedEquipScene initialize
  139. def initialize(x, y, width, height, actor, equip_type)
  140. width = Graphics.width / 2
  141. initialize_KGC_ExtendedEquipScene(x, y, width, height, actor, equip_type)
  142. @column_max = 1
  143. refresh
  144. end
  145. #--------------------------------------------------------------------------
  146. # ● リフレッシュ
  147. #--------------------------------------------------------------------------
  148. alias refresh_KGC_ExtendedEquipScene refresh
  149. def refresh
  150. return if @column_max == 2 # 無駄な描畫は行わない
  151. refresh_KGC_ExtendedEquipScene
  152. end
  153. end
  154. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  155. #==============================================================================
  156. # □ Window_ExtendedEquipStatus
  157. #------------------------------------------------------------------------------
  158. # 拡張裝備畫面で、アクターの能力値変化を表示するウィンドウです。
  159. #==============================================================================
  160. class Window_ExtendedEquipStatus < Window_EquipStatus
  161. #--------------------------------------------------------------------------
  162. # ○ 公開インスタンス変數(shù)
  163. #--------------------------------------------------------------------------
  164. attr_writer :equip_type # 裝備タイプ
  165. #--------------------------------------------------------------------------
  166. # ● オブジェクト初期化
  167. # x : ウィンドウの X 座標(biāo)
  168. # y : ウィンドウの Y 座標(biāo)
  169. # actor : アクター
  170. #--------------------------------------------------------------------------
  171. def initialize(x, y, actor)
  172. @equip_type = -1
  173. @caption_cache = nil
  174. super(x, y, actor)
  175. @new_item = nil
  176. @new_param = {}
  177. refresh
  178. end
  179. #--------------------------------------------------------------------------
  180. # ● 解放
  181. #--------------------------------------------------------------------------
  182. def dispose
  183. super
  184. @caption_cache.dispose if @caption_cache != nil
  185. end
  186. #--------------------------------------------------------------------------
  187. # ● ウィンドウ內(nèi)容の作成
  188. #--------------------------------------------------------------------------
  189. def create_contents
  190. self.contents.dispose
  191. self.contents = Bitmap.new(Graphics.width / 2 - 32, height - 32)
  192. end
  193. #--------------------------------------------------------------------------
  194. # ● リフレッシュ
  195. #--------------------------------------------------------------------------
  196. def refresh
  197. return if @equip_type < 0
  198. if @caption_cache == nil
  199. create_cache
  200. else
  201. self.contents.clear
  202. self.contents.blt(0, 0, @caption_cache, @caption_cache.rect)
  203. end
  204. draw_item_name(@actor.equips[@equip_type], 0, 0)
  205. draw_item_name(@new_item, 24, WLH)
  206. KGC::ExtendedEquipScene::EQUIP_PARAMS.each_with_index { |param, i|
  207. draw_parameter(0, WLH * (i + 2), param)
  208. }
  209. end
  210. #--------------------------------------------------------------------------
  211. # ○ キャッシュ生成
  212. #--------------------------------------------------------------------------
  213. def create_cache
  214. create_contents
  215. self.contents.font.color = system_color
  216. self.contents.draw_text(0, WLH, 20, WLH, "→")
  217. # パラメータ描畫
  218. KGC::ExtendedEquipScene::EQUIP_PARAMS.each_with_index { |param, i|
  219. draw_parameter_name(0, WLH * (i + 2), param)
  220. }
  221. @caption_cache = Bitmap.new(self.contents.width, self.contents.height)
  222. @caption_cache.blt(0, 0, self.contents, self.contents.rect)
  223. end
  224. #--------------------------------------------------------------------------
  225. # ○ 能力値名の描畫
  226. # x : 描畫先 X 座標(biāo)
  227. # y : 描畫先 Y 座標(biāo)
  228. # type : 能力値の種類
  229. #--------------------------------------------------------------------------
  230. def draw_parameter_name(x, y, type)
  231. case type
  232. when :maxhp
  233. name = Vocab.hp
  234. when :maxmp
  235. name = Vocab.mp
  236. when :atk
  237. name = Vocab.atk
  238. when :def
  239. name = Vocab.def
  240. when :spi
  241. name = Vocab.spi
  242. when :agi
  243. name = Vocab.agi
  244. when :hit
  245. name = Vocab.hit
  246. when :eva
  247. name = Vocab.eva
  248. when :cri
  249. name = Vocab.cri
  250. end
  251. self.contents.font.color = system_color
  252. self.contents.draw_text(x + 4, y, 96, WLH, name)
  253. self.contents.font.color = system_color
  254. self.contents.draw_text(x + 156, y, 20, WLH, "→", 1)
  255. end
  256. #--------------------------------------------------------------------------
  257. # ● 裝備変更後の能力値設(shè)定
  258. # new_param : 裝備変更後のパラメータの配列
  259. # new_item : 変更後の裝備
  260. #--------------------------------------------------------------------------
  261. def set_new_parameters(new_param, new_item)
  262. changed = false
  263. # パラメータ変化判定
  264. KGC::ExtendedEquipScene::EQUIP_PARAMS.each { |k|
  265. if @new_param[k] != new_param[k]
  266. changed = true
  267. break
  268. end
  269. }
  270. changed |= (@new_item != new_item)
  271. if changed
  272. @new_item = new_item
  273. @new_param = new_param
  274. refresh
  275. end
  276. end
  277. #--------------------------------------------------------------------------
  278. # ● 能力値の描畫
  279. # x : 描畫先 X 座標(biāo)
  280. # y : 描畫先 Y 座標(biāo)
  281. # type : 能力値の種類
  282. #--------------------------------------------------------------------------
  283. def draw_parameter(x, y, type)
  284. case type
  285. when :maxhp
  286. value = @actor.maxhp
  287. when :maxmp
  288. value = @actor.maxmp
  289. when :atk
  290. value = @actor.atk
]]>
如何才能學(xué)好單片機ARM一起討論交流下以便很好的學(xué)習(xí)!http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1445&Page=1wangxinxin2010-11-18 9:11:18如何才能學(xué)好單片機ARM一起討論下,
單片機可以分為8位,16位,32位機,就按生產(chǎn)的公司不同,側(cè)重點就不一樣,而且就算同是8位機,處理能力也有不同,你初學(xué)單片機我建議還是從51系列如8051或MCS51開始學(xué),因為它比較簡單,容易入門。當(dāng)然也可以直接從高檔的單片機開始學(xué),如AVR或者ARM等目前非常流行的單片機開始,這就要看你自己是出于什么目的去學(xué)習(xí)了,
至于學(xué)什么語言,要看編譯器支持什么語言了,一般低端的單片機都支持匯編語言和C語言,但高檔的單片機還支持其他的語言,比如C++什么的,
如果你從51開始學(xué)習(xí)的話我個人認(rèn)為你還是從匯編語言開始學(xué),主要是看你的側(cè)重以及發(fā)展需要,不要求你匯編語言能立有多強,但至少人家寫個程序你應(yīng)該能看懂就行,不然怎么做項目開發(fā)呢,而且有些什么需要用C語言與匯編語言嵌套使用,比如定時功能?當(dāng)你的匯編語言有一定的基礎(chǔ)了之后,你就可以開始學(xué)習(xí)C了,當(dāng)然直接學(xué)C也可以。
C語言的優(yōu)越性是眾所周知的,它的執(zhí)行效率高,但是具體執(zhí)行每一條語句時間卻比較長約1ms(12M),還有C的可讀性很強,容易理解。 匯編語言他是比較精確,雖然學(xué)起來比較麻煩但是學(xué)好他還是有必要的,因為做一些準(zhǔn)確性高的程序還是用匯編語言,
我的想法是:假如你想立竿見影的話,直接從C入手,假如你想成為單片機高手的話,從匯編開始。

做一個真正的單片機開發(fā)高手,然后逐步的學(xué)習(xí)ARM 成功走入嵌入式開發(fā)行列成為能手!

]]>
深度技術(shù)四貼...手機心臟ARM-11的性能分析...http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1444&Page=1wangxinxin2010-11-18 9:08:38ARM1136J,ARM1156T2和ARM1176JZ三個內(nèi)核型號,分別針對不同應(yīng)用領(lǐng)域。 本文將對全新的ARMv6架構(gòu)進(jìn)行介紹,并深入分析ARM11處理器的先進(jìn)特點和關(guān)鍵技術(shù)。 ARMv6結(jié)構(gòu)體系 實現(xiàn)新一代微處理器的第一步就是訂立一個新的結(jié)構(gòu)體系。這里所說的結(jié)構(gòu)體系只是對處理器行為進(jìn)行描述,并不包括具體地指定處理器是如何被建造的。結(jié)構(gòu)體系的定義提供了處理器和外界(操作系統(tǒng),應(yīng)用程序和調(diào)試支持)的接口,從細(xì)節(jié)上說,處理器結(jié)構(gòu)體系定義了指令集、編程模式和最近的存儲器之間的接口。 最新的ARM處理器架構(gòu)—ARMv6,發(fā)布于2001年10月,它建立于過去十年ARM許多成功的結(jié)構(gòu)體系基礎(chǔ)上。同處理器的授權(quán)相似,ARM也向客戶授權(quán)它的結(jié)構(gòu)體系。比如,Intel的XScale就是基于ARMv5TE的處理器。本文也會就ARM11和Intel XScale的特點作一比較。 目標(biāo)應(yīng)用 ARMv6架構(gòu)是根據(jù)下一代的消費類電子、無線設(shè)備、網(wǎng)絡(luò)應(yīng)用和汽車電子產(chǎn)品等需求而制定的。ARM11的媒體處理能力和低功耗特點,特別適用于無線和消費類電子產(chǎn)品;其高數(shù)據(jù)吞吐量和高性能的結(jié)合非常適合網(wǎng)絡(luò)處理應(yīng)用;另外,也在實時性能和浮點處理等方面ARM11可以滿足汽車電子應(yīng)用的需求。可以預(yù)言,基于AMRv6體系結(jié)構(gòu)的ARM11系列處理器將在上述領(lǐng)域發(fā)揮巨大的作用。 主要特點 對于各種無線移動應(yīng)用,毫無節(jié)制的提供高性能處理器是無用的。同成本控制類似,功耗的控制也是一個重要因素。 ARM11系列處理器展示了在性能上的巨大提升,首先推出350M~500MHz時鐘頻率的內(nèi)核,在未來將上升到1GHz時鐘頻率. ARM11處理器在提供高性能的同時,也允許在性能和功耗間做權(quán)衡以滿足某些特殊應(yīng)用。通過動態(tài)調(diào)整時鐘頻率和供應(yīng)電壓,開發(fā)者完全可以控制這兩者的平衡。在0.13um工藝,1.2v條件下,ARM11處理器的功耗可以低至0.4mW/MHz。 ARM11處理器同時提供了可綜合版本和半定制硬核兩種實現(xiàn)。可綜合版本可以讓客戶根據(jù)自己的半導(dǎo)體工藝開發(fā)出各有特色的處理器內(nèi)核,并保持足夠靈活性。ARM實現(xiàn)的硬核則是為了滿足那些極高性能和速度要求的應(yīng)用,同時為客戶節(jié)省實現(xiàn)的成本和時間。 為了讓客戶更方便地走完實現(xiàn)流程,ARM11處理器采用了易于綜合的流水線結(jié)構(gòu),并和常用的綜合工具以及RAM compiler良好結(jié)合,確保了客戶可以成功并迅速的達(dá)到時序收斂。目前已有的ARM11處理器在不包含Cache的情況下面積小于2.7mm2,對于當(dāng)前復(fù)雜的SoC設(shè)計來說,如此小的die size對芯片成本的降低是極其重要的。ARM11處理器在很多方面為軟件開發(fā)者帶來便利。一方面,它包含了更多的多媒體處理指令來加速視頻和音頻處理;另一方面,它的新型存儲器系統(tǒng)進(jìn)一步提高了操作系統(tǒng)的性能;此外,還提供了新指令來加速實時性能和中斷的響應(yīng)。 再次,目前有很多應(yīng)用要求多處理器的配置(多個ARM內(nèi)核,或ARM+DSP的組合),ARM11處理器從設(shè)計伊始就注重更容易地與其他處理器共享數(shù)據(jù),以及從非ARM的處理器上移植軟件。此外,ARM還開發(fā)了基于ARM11系列的多處理器系統(tǒng)——MPCORE(由二個到四個ARM11內(nèi)核組成)。 優(yōu)秀的性能 ARM11處理器的超強性能是由一系列的架構(gòu)特點所決定的。ARMv6—決定性能的基礎(chǔ)ARMv6架構(gòu)決定了可以達(dá)到高性能處理器的基礎(chǔ)。 總的來說,ARMv6架構(gòu)通過以下幾點來增強處理器的性能: ·多媒體處理擴展 使MPEG4編碼/解碼加快一倍 音頻處理加快一倍 ·增強的Cache結(jié)構(gòu) 實地址Cache 減少Cache的刷新和重載 減少上下文切換的開銷 ·增強的異常和中斷處理 使實時任務(wù)的處理更加迅速= 支持Unaligned和Mixed-endian數(shù)據(jù)訪問 使數(shù)據(jù)共享、軟件移植更簡單,也有利于節(jié)省存儲器空間 對絕大多數(shù)應(yīng)用來說,ARMv6保持了100%的二進(jìn)制向下兼容,使用戶過去開發(fā)的程序可以進(jìn)一步繼承下去。ARMv6保持了所有過去架構(gòu)中的T(Thumb指令)和E(DSP指令)擴展,使代碼壓縮和DSP處理特點得到延續(xù);為了加速Java代碼執(zhí)行速度的ARM Jazalle技術(shù)也繼續(xù)在ARMv6架構(gòu)中發(fā)揮重要作用。 ARM11處理器的內(nèi)核特點 ARM11處理器是為了有效的提供高性能處理能力而設(shè)計的。在這里需要強調(diào)的是,ARM并不是不能設(shè)計出運行在更高頻率的處理器,而是,在處理器能提供超高性能的同時,還要保證功耗、面積的有效性。ARM11優(yōu)秀的流水線設(shè)計是這些功能的重要保證。]]>,市面上常用的ARM解決方案。http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1443&Page=1wangxinxin2010-11-18 9:07:09
二、三星S3C6410主控芯片,基于ARM11,主頻為667MHz。256M DDR內(nèi)存,使用Android1.6系統(tǒng),可以升級到2.1,但運行性能會大幅下降,1.6才是最佳的搭配系統(tǒng)。支持720x480,30幀/秒的視頻,支持AVI、MP4、3GP、MOV、ASF、WMV、MPEG、MKV、FLV等文件格式。采用該方案經(jīng)典的機型就是魅族M8,目前山寨平板也有采用該方案,但是視頻播放還沒完全優(yōu)化好。性能和瑞芯微的RK2808在同一檔次,但視頻方面不如。

三、瑞芯微電子(Rockchip)的2808。瑞芯微2808 ARM9 @ 600 MHz + DSP雙核 @600MHz。現(xiàn)在用于Apad iRobot,操作系統(tǒng)彩的是Android 1.5。7寸屏,800×480分辨率,內(nèi)存128M。視頻播放最高分辨率720P,支持MKV(H.264HP),AVI、WMA、RMVB、 MPEG_1,2,3。該機子可以升級到2.1,但由于只支持128M SDR內(nèi)存,升級以后運行起來注定是悲劇。

瑞芯微Rockchip 2818,即將上市。是RK2808的升級版,基于ARM11內(nèi)核,主頻還是為600MHz,操作系統(tǒng)使用的是Android 2.1,內(nèi)存支持128M-512M DDR,屏幕分辨率最高可支持到1024x600。性能雖然提升有限,但最大的優(yōu)勢是芯片價格和RK2808相當(dāng),加量不加價。

四、Marvell ARMADA (PXA166,PXA310),馬威爾是一家美國的芯片公司,據(jù)說公司創(chuàng)使人之一是一位女性華人,06年收購了Intel XScale應(yīng)用處理器業(yè)務(wù),而名聲大燥。PXA166基于ARM 11內(nèi)核開發(fā),最高到800MHz主頻。目前平板上多是用256M內(nèi)存和Android1.6系統(tǒng)。可以升級到2.1/2.2,升級后的性能目前還不太清楚。整體性能平均,但視頻處理上還是達(dá)不到720P。盛大最近推出的bambook電子書,就是采用PXA310芯片。

五、韓國Telechips TCC8902。有廠商采用TCC8901,該主芯片的內(nèi)核是ARM 11,720MHZ主頻,同時配了256M的內(nèi)存。更重要的是,操作系統(tǒng)已經(jīng)采用了Android2.1。播放視頻分辨率最高可支持 1920×1080,支持的視頻格式很多:AVI、RM/RMVB、FLV、DAT、VOB、WMV、MPG、MPEG-1、MPEG-2、MPEG- 11、MP4/M4V、VC-1。音頻質(zhì)量不做多說,聽過Telechips的MP3的朋友自然清楚了。

升級版的TCC 8900芯片在年內(nèi)將會上市,主頻將會提升到1GHz,基于ARM11核,目前還沒有更多的資料。

六、主頻達(dá)1至1.2GMHz的ZT-180處理器。卓尼斯(ZeniThink)是一家位于深圳南山麻雀嶺工業(yè)區(qū)的平板電腦廠商,卓尼斯ZT-180平板電腦面市后,其處理器ZT-180亦受業(yè)界關(guān)注。憑心而論,卓尼斯的ZT-180平板電腦是采用了跟蘋果iPad同樣尺寸的10寸屏,確實在視覺體驗上要比其它千元RMB價格或以內(nèi)的7寸屏平板電腦要好一些。但目前外界有兩方面的質(zhì)疑,一是他們的ZT-180處理器到底采用了ARM11還是cortex A8的核,二是該公司的主控芯片是否真如業(yè)界傳聞,是上海盈方微5月剛開發(fā)的IX 2X0系列主控芯片,更是有待查明。

下面介紹的這幾款芯片是下一代的產(chǎn)品,采用Cortex-A8,是基于armv7架構(gòu)的一款處理器,號稱是4倍于ARM9,具備超低功耗的性能,運行速度最高可達(dá)到1GHz。這些殺手級的產(chǎn)品,配合Android2.2,哇哈哈哈哈....

七、TI OMAP3530,從官網(wǎng)上查到的資料,主頻只為600MHz,但也是基于Cortex-A8內(nèi)核,最高支持到720P高清視頻,3D方面比較強大。

八、飛思卡爾iMX515,Cortex-A8內(nèi)核,主頻為800MHz,目前還到不了1GHz,采用該方案的山寨平板樣機已經(jīng)可以在市場上看到,內(nèi)存可支持到512M,最高視頻輸出為720P。這樣的硬件平臺和Android2.2配合起來才比較理想。

九、三星C100/C110,基于ARM Cortex-A8內(nèi)核,主頻在1GHz,512M內(nèi)存,可以直接上Android2.2,性能超強,據(jù)說iPad里面的A4處理器,都是三星設(shè)計和代工,蘋果雖然不承認(rèn),但三星芯片的強大大家都是知道的。不說iPad,魅族手機被稱為最像iPhone的手機,它的下一代M9手機,就是采用三星C110芯片。

十、Nvidia Tegra 2,一直以來,Tegra都是非常讓人期待的,就是外面吹的挺響,不見產(chǎn)品出來。現(xiàn)在終于有眉目了,萬利達(dá)即將上市的一款ZPad,就準(zhǔn)備采用Tegra 2芯片。Tegra 2性能很強勁,內(nèi)建ARM雙核Cortex A9處理器,主頻到1GHz,最高支持1GB內(nèi)存,支持1080P的全高清視頻播放,多媒體方面增加了對Flash 10的支持,3D性能是Nvidia的強項就不用多說。不過大家要做好心理準(zhǔn)備,Nvidia的東西是不會太便宜,估計終端的品牌價格會達(dá)到3K]]>
ARM Cortex-M3文件系統(tǒng) 源碼分析http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1442&Page=1wangxinxin2010-11-18 9:03:08一、概述
1、目的
在移植之前,先將源代碼大概的閱讀一遍,主要是了解文件系統(tǒng)的結(jié)構(gòu)、各個函數(shù)的功能和接口、與移植
相關(guān)的代碼等等。
2、準(zhǔn)備工作
在官方網(wǎng)站下載了0.07c版本的源代碼,利用記事本進(jìn)行閱讀。
二、源代碼的結(jié)構(gòu)
1、源代碼組成
   源代碼壓縮包解壓后,共兩個文件夾,doc是說明,src里就是代碼。src文件夾里共五個文件和一個文
件夾。文件夾是option,還有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。對比網(wǎng)上
的文章,版本已經(jīng)不同了,已經(jīng)沒有所謂的tff.c和tff.h了,估計現(xiàn)在都采用條件編譯解決這個問題了,
當(dāng)然文件更少,可能編譯選項可能越復(fù)雜。
2、00readme.txt的說明
  Low level disk I/O module is not included in this archive because the FatFs
  module is only a generic file system layer and not depend on any specific
  storage device. You have to provide a low level disk I/O module that written
  to control your storage device.主要是說不包含底層IO代碼,這是個通用文件系統(tǒng)可以在各種介質(zhì)
上使用。我們移植時針對具體存儲設(shè)備提供底層代碼。
  接下來做了版權(quán)聲明-可以自由使用和傳播。
  然后對版本的變遷做了說明。
3、源代碼閱讀次序
  先讀integer.h,了解所用的數(shù)據(jù)類型,然后是ff.h,了解文件系統(tǒng)所用的數(shù)據(jù)結(jié)構(gòu)和各種函數(shù)聲明,然
后是diskio.h,了解與介質(zhì)相關(guān)的數(shù)據(jù)結(jié)構(gòu)和操作函數(shù)。再把ff.c和diskio.c兩個文件所實現(xiàn)的函數(shù)大致
掃描一遍。最后根據(jù)用戶應(yīng)用層程序調(diào)用函數(shù)的次序仔細(xì)閱讀相關(guān)代碼。
三、源代碼閱讀
1、integer.h頭文件
這個文件主要是類型聲明。以下是部分代碼。
typedef int    INT;
typedef unsigned int UINT;
typedef signed char  CHAR;/* These types must be 8-bit integer */
都是用typedef做類型定義。移植時可以修改這部分代碼,特別是某些定義與你所在工程的類型定義有沖
突的時候。
2、ff.h頭文件
以下是部分代碼的分析
#include "integer.h" 使用integer.h的類型定義
#ifndef _FATFS
#define _FATFS 0x007C  版本號007c,0.07c
#define _WORD_ACCESS 0 //如果定義為1,則可以使用word訪問。
中間有一些看著說明很容易弄清楚意思。這里就不例舉了。
#define _CODE_PAGE 936
/* The _CODE_PAGE specifies the OEM code page to be used on the target system.
OEM code page什么意思不大明白。
/   936  - Simplified Chinese GBK (DBCS, OEM, Windows)跟據(jù)這個中國應(yīng)該是936.
打開option文件夾看一下。打開cc936.c文件,里面有一個很大的數(shù)組static const WCHAR uni2oem[] 。
根據(jù)英文說明,這個數(shù)組用于unicode碼和OEM碼之間的相互轉(zhuǎn)換。
接下來又有兩個函數(shù)ff_convert()和ff_wtoupper()具體執(zhí)行碼型轉(zhuǎn)換和將字符轉(zhuǎn)換為大寫。

百度一下:看OEM碼什么意思。
unicode是一種雙字節(jié)字符編碼,無論中文還是英文,或者其他語言統(tǒng)一到2個字節(jié)。與現(xiàn)有的任何編碼(
ASCII,GB等)都不兼容。WindowsNT(2000)的內(nèi)核即使用該編碼,所有數(shù)據(jù)進(jìn)入內(nèi)核前轉(zhuǎn)換成UNICODE,退
出內(nèi)核后在轉(zhuǎn)換成版本相關(guān)的編碼(通常稱為OEM,在簡體中文版下即為GB).(百度所得)
繼續(xù)往下閱讀。
#define _USE_LFN 1   //這個估計是長文件名支持了,以前的0.06版本好像是不支持。
#define _MAX_LFN 255 //最長支持255個雙字節(jié)字符。
#define _FS_RPATH 0  //是否文件相對路徑選項。
/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,
/  f_chdrive function are available.  //有些函數(shù)會受影響。
/  Note that output of the f_readdir fnction is affected by this option. */
#define _FS_REENTRANT 0  //如果要支持文件系統(tǒng)可重入,必須加入幾個函數(shù)。
#define _TIMEOUT  1000 /* Timeout period in unit of time ticks of the OS */
#define _SYNC_t   HANDLE /* Type of sync object used on the OS. e.g. HANDLE,
OS_EVENT*, ID and etc.. */
/* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user
/  provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj
/  and ff_cre_syncobj function to the project. */
#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */
#define _DF1S 0x81
#define _DF1E 0xFE
#define _DS1S 0x40
#define _DS1E 0x7E
#define _DS2S 0x80
#define _DS2E 0xFE
接下來很大一部分都是與語言相關(guān)的因素,略過。
/* Character code support macros */ 三個宏判斷是否大寫、小寫、數(shù)字。
#define IsUpper(c) (((c)>='A')&&((c)<='Z'))
#define IsLower(c) (((c)>='a')&&((c)<='z'))
#define IsDigit(c) (((c)>='0')&&((c)<='9'))
#if _DF1S     /* DBCS configuration */雙字節(jié)編碼相關(guān)的設(shè)定,暫時不理會它。
#if _MULTI_PARTITION         /* Multiple partition configuration */
//該變量定義為1時,支持一個磁盤的多個分區(qū)。
typedef struct _PARTITION {
       BYTE pd;     /* Physical drive# */
       BYTE pt;      /* Partition # (0-3) */
} PARTITION;
Extern  const  PARTITION Drives[];//如果支持分區(qū),則聲明變量Drivers   
#define LD2PD(drv) (Drives[drv].pd)      /* 獲得磁盤對應(yīng)的物理磁盤
#define LD2PT(drv) (Drives[drv].pt)       /*獲得磁盤對應(yīng)的分區(qū)
#else                                         /* Single partition configuration */
#define LD2PD(drv) (drv)  /* Physical drive# is equal to the logical drive# */
#define LD2PT(drv) 0        /* Always mounts the 1st partition */

#if _MAX_SS == 512  //一般扇區(qū)長度取512字節(jié)。
#define   SS(fs)     512U

#if _LFN_UNICODE && _USE_LFN
typedef WCHAR XCHAR;       /* Unicode */ XCHAR是文件名的碼型所用。
#else
typedef char XCHAR;        /* SBCS, DBCS */
#endif

typedef struct _FATFS_ {
       BYTE    fs_type;         /* FAT sub type */
       BYTE    drive;             /*對應(yīng)實際驅(qū)動號01--- */
       BYTE    csize;             /* 每個簇的扇區(qū)數(shù)目 */
先查一下簇的含義:應(yīng)該是文件數(shù)據(jù)分配的基本單位。
       BYTE    n_fats;           /* 文件分配表的數(shù)目 */
FAT文件系統(tǒng)依次應(yīng)該是:引導(dǎo)扇區(qū)、文件分配表兩個、根目錄區(qū)和數(shù)據(jù)區(qū)。
       BYTE    wflag;            /* win[] dirty flag (1:must be written back) */
//文件是否改動的標(biāo)志,為1時要回寫。
       WORD  id;                 /* File system mount ID 文件系統(tǒng)加載ID*/
       WORD  n_rootdir;      /* 根目錄區(qū)目錄項的數(shù)目 */
#if _FS_REENTRANT
       _SYNC_t     sobj;              /* 允許重入,則定義同步對象 */
#endif
#if _MAX_SS != 512
       WORD  s_size;           /* Sector size */
#endif
#if !_FS_READONLY  //文件為可寫
       BYTE    fsi_flag;   /* fsinfo dirty flag (1:must be written back) */
//文件需要回寫的標(biāo)志
       DWORD      last_clust;      /* Last allocated cluster */
       DWORD      free_clust;      /* Number of free clusters */
       DWORD      fsi_sector;      /* fsinfo sector */
#endif
#if _FS_RPATH
       DWORD      cdir;              /* 使用相對路徑,則要存儲文件系統(tǒng)當(dāng)前目錄
#endif
       DWORD      sects_fat;       /*文件分配表占用的扇區(qū)
       DWORD      max_clust;     /* 最大簇數(shù)
       DWORD      fatbase;  /*文件分配表開始扇區(qū)
       DWORD      dirbase;  /*  如果是FAT32,根目錄開始扇區(qū)需要首先得到。
       DWORD      database;       /* 數(shù)據(jù)區(qū)開始扇區(qū)
       DWORD      winsect;  /* Current sector appearing in the win[] */
//目前的扇區(qū)在win[]里面,這個win[]數(shù)組暫時還不知道含義。
       BYTE    win[_MAX_SS];/* Disk access window for Directory/FAT */
//這是一個win[512]數(shù)組,存儲著一個扇區(qū),好像作為扇區(qū)緩沖使用。
} FATFS;

typedef struct _DIR_ {
       FATFS* fs;/* Pointer to the owner file system object */指向相應(yīng)文件系統(tǒng)對象。
       WORD  id;                 /* 文件系統(tǒng)加載ID*/
       WORD  index;     /* Current read/write index number */目前讀寫索引代碼
       DWORD      sclust;     /* Table start cluster (0:Static table) */文件數(shù)據(jù)區(qū)開始簇
       DWORD      clust;             /* Current cluster */ 目前處理的簇
       DWORD      sect;              /* Current sector */ 目前簇里對應(yīng)的扇區(qū)
       BYTE*  dir;  /* Pointer to the current SFN entry in the win[] */
       BYTE*  fn;                 /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
#if _USE_LFN
       WCHAR*     lfn;   /* Pointer to the LFN working buffer */ 指向長文件名緩沖。
       WORD  lfn_idx;   /* Last matched LFN index number (0xFFFF:No LFN) */
#endif
} DIR;

typedef struct _FIL_ {
       FATFS* fs;                  /* Pointer to the owner file system object */
       WORD  id;                 /* Owner file system mount ID */
       BYTE    flag;        /* File status flags */文件狀態(tài)標(biāo)志
       BYTE    csect;            /* Sector address in the cluster */扇區(qū)偏移
       DWORD      fptr;        /* File R/W pointer */ 讀寫指針
       DWORD      fsize;              /* File size */
       DWORD      org_clust;      /* File start cluster */文件開始簇
       DWORD      curr_clust;     /* Current cluster */當(dāng)前簇
       DWORD      dsect;            /* Current data sector */文件當(dāng)前扇區(qū)
#if !_FS_READONLY
       DWORD      dir_sect; /* Sector containing the directory entry */該文件目錄項對應(yīng)所在的扇區(qū)
       BYTE*  dir_ptr;   /* Ponter to the directory entry in the window */
#endif
#if !_FS_TINY
       BYTE    buf[_MAX_SS];/* File R/W buffer */文件讀寫緩沖
#endif
} FIL;

/* File status structure */

typedef struct _FILINFO_ {
       DWORD      fsize;              /* File size */
       WORD  fdate;             /* Last modified date */
       WORD  ftime;             /* Last modified time */
       BYTE    fattrib;    /* Attribute */
       char fname[13];     /* Short file name (8.3 format) */
#if _USE_LFN
       XCHAR*      lfname;          /* Pointer to the LFN buffer */
       int   lfsize;             /* Size of LFN buffer [chrs] */
#endif
} FILINFO; 這個結(jié)構(gòu)主要描述文件的狀態(tài)信息,包括文件名13個字符(8+.+3+\0)、屬性、修改時間等。
接下來是函數(shù)的定義,先大概瀏覽一遍。
FRESULT f_mount (BYTE, FATFS*);    //加載文件系統(tǒng),BYTE參數(shù)是ID,后一個是文件系統(tǒng)定義。
FRESULT f_open (FIL*, const XCHAR*, BYTE);//打開文件,第一個參數(shù)是文件信息結(jié)構(gòu),第二個參數(shù)是文件名,第三是文件打開模式
FRESULT f_read (FIL*, void*, UINT, UINT*);   //文件讀取函數(shù),參數(shù)1為文件對象(文件打開函數(shù)中得到),參數(shù)2為文件讀取緩沖區(qū),參數(shù)3為讀取的字節(jié)數(shù),參數(shù)4意義不清晰,等讀到源代碼就清楚了。
FRESULT f_write (FIL*, const void*, UINT, UINT*);//寫文件,參數(shù)跟讀差不多
FRESULT f_lseek (FIL*, DWORD); //移動文件的讀寫指針,參數(shù)2應(yīng)該是移動的數(shù)目。
FRESULT f_close (FIL*);                /* Close an open file object */
FRESULT f_opendir (DIR*, const XCHAR*);      打開目錄,返回目錄對象
FRESULT f_readdir (DIR*, FILINFO*);              讀取目錄,獲得文件信息
FRESULT f_stat (const XCHAR*, FILINFO*);                        /* Get file status */
FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**);   /* Get number of free clusters on the drive */
FRESULT f_truncate (FIL*);                   /* Truncate file */
FRESULT f_sync (FIL*);   /* Flush cached data of a writing file */將緩沖區(qū)數(shù)據(jù)寫回文件
FRESULT f_unlink (const XCHAR*);            刪除目錄中的一個文件
FRESULT     f_mkdir (const XCHAR*);        /* Create a new directory */
FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */
FRESULT f_utime (const XCHAR*, const FILINFO*);      /* Change timestamp of the file/dir */
FRESULT f_rename (const XCHAR*, const XCHAR*);    /* Rename/Move a file or directory */
FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ 這個函數(shù)還要提供一個回調(diào)函數(shù)。
FRESULT f_mkfs (BYTE, BYTE, WORD);          /* Create a file system on the drive */
FRESULT f_chdir (const XCHAR*);      /* Change current directory */改變當(dāng)前目錄
FRESULT f_chdrive (BYTE);           /* Change current drive */
應(yīng)該說基本能明白這些函數(shù)用于干什么。]]>
ARM、DSP、FPGA的技術(shù)特點和區(qū)別http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1441&Page=1wangxinxin2010-11-18 8:56:19嵌入式開發(fā)領(lǐng)域,ARM是一款非常受歡迎的微處理器,其市場覆蓋率極高,DSP和FPGA則是作為嵌入式
開發(fā)的協(xié)處理器,協(xié)助微處理器更好的實現(xiàn)產(chǎn)品功能。那三者的技術(shù)特點以及區(qū)別是什么呢?下文就此
問題略做了總結(jié)。
  ARM(Advanced RISC Machines)是微處理器行業(yè)的一家知名企業(yè),設(shè)計了大量高性能、廉價、耗能
低的RISC處理器、相關(guān)技術(shù)及軟件。
  ARM架構(gòu)是面向低預(yù)算市場設(shè)計的第一款RISC微處理器,基本是32位單片機的行業(yè)標(biāo)準(zhǔn),它提供一系
列內(nèi)核、體系擴展、微處理器和系統(tǒng)芯片方案,四個功 能模塊可供生產(chǎn)廠商根據(jù)不同用戶的要求來配置
生產(chǎn)。由于所有產(chǎn)品均采用一個通用的軟件體系,所以相同的軟件可在所有產(chǎn)品中運行。目前ARM在手持
設(shè)備市場 占有90以上的份額,可以有效地縮短應(yīng)用程序開發(fā)與測試的時間,也降低了研發(fā)費用。
DSP(digital singnal processor)是一種獨特的微處理器,有自己的完整指令系統(tǒng),是以數(shù)字信號來
處理大量信息的器件。一個數(shù)字信號處理器在一塊不大的芯片內(nèi)包括有控制單元、運算單元、各種寄存
器以及一定數(shù)量的存儲單元等等,在其外圍還可以連接若干存儲器, 并可以與一定數(shù)量的外部設(shè)備互相
通信,有軟、硬件的全面功能,本身就是一個微型計算機。DSP采用的是哈佛設(shè)計,即數(shù)據(jù)總線和地址總
線分開,使程序和數(shù)據(jù) 分別存儲在兩個分開的空間,允許取指令和執(zhí)行指令完全重疊。也就是說在執(zhí)行
上一條指令的同時就可取出下一條指令,并進(jìn)行譯碼,這大大的提高了微處理器的速 度 。另外還允許
在程序空間和數(shù)據(jù)空間之間進(jìn)行傳輸,因為增加了器件的靈活性。其工作原理是接收模擬信號,轉(zhuǎn)換為0
或1的數(shù)字信號,再對數(shù)字信號進(jìn)行修改、刪 除、強化,并在其他系統(tǒng)芯片中把數(shù)字?jǐn)?shù)據(jù)解譯回模擬數(shù)
據(jù)或?qū)嶋H環(huán)境格式。它不僅具有可編程性,而且其實時運行速度可達(dá)每秒數(shù)以千萬條復(fù)雜指令程序,遠(yuǎn)
遠(yuǎn)超 過通用微處理器,是數(shù)字化電子世界中日益重要的電腦芯片。它的強大數(shù)據(jù)處理能力和高運行速度
,是最值得稱道的兩大特色。由于它運算能力很強,速度很快,體 積很小,而且采用軟件編程具有高度
的靈活性,因此為從事各種復(fù)雜的應(yīng)用提供了一條有效途徑。根據(jù)數(shù)字信號處理的要求,DSP芯片一般具
有如下主要特點:
(1)在一個指令周期內(nèi)可完成一次乘法和一次加法;
(2)程序和數(shù)據(jù)空間分開,可以同時訪問指令和數(shù)據(jù);
(3)片內(nèi)具有快速RAM,通常可通過獨立的數(shù)據(jù)總線在兩塊中同時訪問;
(4)具有低開銷或無開銷循環(huán)及跳轉(zhuǎn)的硬件支持;
(5)快速的中斷處理和硬件I/O支持;
(6)具有在單周期內(nèi)操作的多個硬件地址產(chǎn)生器;
(7)可以并行執(zhí)行多個操作;
(8)支持流水線操作,使取指、譯碼和執(zhí)行等操作可以重疊執(zhí)行。
當(dāng)然,與通用微處理器相比,DSP芯片的其他通用功能相對較弱些。
   FPGA是英文Field Programmable Gate Array(現(xiàn)場可編程門陣列)的縮寫,它是在PAL、GAL、PLD
等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物,是專用集成電路(ASIC)中集成度最高的 一種。FPGA采用了
邏輯單元陣列LCA(Logic Cell Array)這樣一個新概念,內(nèi)部包括可配置邏輯模塊CLB(Configurable
Logic Block)、輸出輸入模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個部分。用
戶可對FPGA內(nèi)部的邏輯模塊和I/O模塊重新配置,以實現(xiàn)用戶的邏輯。它還具有靜態(tài)可 重復(fù)編程和動態(tài)
在系統(tǒng)重構(gòu)的特性,使得硬件的功能可以像軟件一樣通過編程來修改。作為專用集成電路(ASIC)領(lǐng)域
中的一種半定制電路,F(xiàn)PGA既解決了 定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。
可以毫不夸張的講,F(xiàn)PGA能完成任何數(shù)字器件的功能,上至高性能CPU,下至簡單的74電 路,都可以用
FPGA來實現(xiàn)。FPGA如同一張白紙或是一堆積木,工程師可以通過傳統(tǒng)的原理圖輸入法,或是硬件描述語
言自由的設(shè)計一個數(shù)字系統(tǒng)。通過軟件 仿真,我們可以事先驗證設(shè)計的正確性。在PCB完成以后,還可
以利用FPGA的在線修改能力,隨時修改設(shè)計而不必改動硬件電路。使用FPGA來開發(fā)數(shù)字電 路,可以大大
縮短設(shè)計時間,減少PCB面積,提高系統(tǒng)的可靠性。FPGA是由存放在片內(nèi)RAM中的程序來設(shè)置其工作狀態(tài)
的,因此工作時需要對片內(nèi)的RAM 進(jìn)行編程。用戶可以根據(jù)不同的配置模式,采用不同的編程方式。加
電時,F(xiàn)PGA芯片將EPROM中數(shù)據(jù)讀入片內(nèi)編程RAM中,配置完成后,F(xiàn)PGA進(jìn)入工 作狀態(tài)。掉電后,F(xiàn)PGA恢
復(fù)成白片,內(nèi)部邏輯關(guān)系消失,因此,F(xiàn)PGA能夠反復(fù)使用。FPGA的編程無須專用的FPGA編程器,只須用
通用的 EPROM、PROM編程器即可。當(dāng)需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片F(xiàn)PGA,
不同的編程數(shù)據(jù),可以產(chǎn)生不同的電路功 能。因此,F(xiàn)PGA的使用非常靈活。可以說,F(xiàn)PGA芯片是小批量
系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一。目前FPGA的品種很多,有XILINX的 XC系列、TI公司的
TPC系列、ALTERA公司的FIEX系列等。
  ARM作為嵌入式開發(fā)最常用的處理器,是嵌入式工程師必須掌握的一門知識。ARM體系架構(gòu)在嵌入式
學(xué)院<嵌入式工程師職業(yè)培訓(xùn)班>的二期課程中將會結(jié)合嵌入式linux應(yīng)用開發(fā)、嵌入式linux系統(tǒng)移植進(jìn)
行詳細(xì)介紹,另外華清遠(yuǎn)見的短期培訓(xùn)業(yè)務(wù)中也分別有針對ARM、DSP、FPGA的培訓(xùn)課程。
 區(qū)別是什么?:ARM具有比較強的事務(wù)管理功能,可以用來跑界面以及應(yīng)用程序等,其優(yōu)勢主要體現(xiàn)在
控制方面,而DSP主要是用來計算的,比如進(jìn)行加密解 密、調(diào)制解調(diào)等,優(yōu)勢是強大的數(shù)據(jù)處理能力和
較高的運行速度。FPGA可以用VHDL或verilogHDL來編程,靈活性強,由于能夠進(jìn)行編程、除錯、 再編程
和重復(fù)操作,因此可以充分地進(jìn)行設(shè)計開發(fā)和驗證。當(dāng)電路有少量改動時,更能顯示出FPGA的優(yōu)勢,其
現(xiàn)場編程能力可以延長產(chǎn)品在市場上的壽命,而這 種能力可以用來進(jìn)行系統(tǒng)升級或除錯。
]]>
ARM JTAG (Joint Test Action Group)仿真器電路討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1440&Page=1wangxinxin2010-11-18 8:55:07以下是我在實踐中的一些積累,發(fā)現(xiàn)這點是因為我在嘗試用對SAMSUNG S3C44B0 JTAG適用的編程板電路給SAMSUNG的另一款A(yù)RM9內(nèi)核MPU S3C2440 JTAG編程時出現(xiàn)問題,查閱了一些資料后最終解決。希望這些對那些在自制ARM JTAG編程器上遇到困難的朋友一點幫助。

  一. JTAG仿真器的實質(zhì)
      
   JTAG (Joint Test Action Group) 編程調(diào)試實質(zhì)上是利用了MCU/MPU片上自帶的跟蹤調(diào)試功能(需MCU/MPU硬件支持)。JTAG編程板一端與PC的并口相連,另一端連接至目標(biāo)板,由于通常的MCU/MPU的工作電壓在1.8V-3.6V之間,而PC機并口輸出的電平邏輯為5V,因此需做電平轉(zhuǎn)換,通常使用一枚緩沖/驅(qū)動器(如: 74××244/74××541)作隔離,并通過電阻分壓,限制進(jìn)入目標(biāo)板的電平。因PC并口沒有電壓輸出,所以編程板上的IC要由目標(biāo)板供電,即: JTAG接口中的VCC腳是必須恰當(dāng)連接的。
  二. JTAG接口的管腳定義


   主流的JTAG接口有14針和20針兩種,管腳分配如圖一
  14針的JTAG接口為老式接口。
  JTAG中的非地管腳定義如下圖二。
 

   三. 第一種線序的JTAG編程板電路

   實測我所使用的SAMSUNG ARM7 S3C44B0開發(fā)套件中的JTAG編程板電路如圖
 

    但將該編程板與S3C2440相連后卻無法正確載入程序。
   依據(jù)244的輸入輸出關(guān)系,可整理PC并口與JTAG接口管腳的對應(yīng)關(guān)系如下:
   PC并口引腳 
   2  3  8  4
   JTAG引腳 
   TCK  TMS  TDI  nSRST
   四. 第二種線序的JTAG編程板電路

   經(jīng)查閱S3C2440的官方JTAG編程板SJF2440的USER’S GUIDE中的編程板電路,整理PC并口與JTAG接口管腳的對應(yīng)關(guān)系如下:
   PC并口引腳 
   2  3  4  11
   JTAG引腳 
   TCK  TDI  TMS  TDO
 

    據(jù)此推測,使用S3C44B0 JTAG編程板對S3C2440的JTAG調(diào)試失敗是因PC并口控制管腳的分配有區(qū)別。即,S3C2440的JTAG調(diào)試代理模擬JTAG時序所用到的并口管腳與S3C44B0的調(diào)試代理所用到的不同。

   據(jù)此,在S3C44B0 JTAG編程板上靈活飛線,再次使用該編程板對S3C2440調(diào)試成功。
   五. 一點推測
 

    在JTAG相關(guān)搜索里,發(fā)現(xiàn)網(wǎng)友李杰給出的一個JTAG編程板電路,如圖五。

   該電路中的JTAG管腳與PC并口管腳的對應(yīng)關(guān)系與S3C2440 JTAG編程板中的此對應(yīng)關(guān)系相同,而作者稱,該電路適用于所有的ARM芯片。據(jù)此推測:大多公司開發(fā)的ARM調(diào)試軟件支持兩種不同線序的并口模擬 JTAG調(diào)試,并且在調(diào)試開始時能自動偵測出編程板硬件連接并實施控制。官方給出的S3C2440 JTAG調(diào)試軟件僅支持一種線序。
 

 


說明:本信息
  以下是我在實踐中的一些積累,發(fā)現(xiàn)這點是因為我在嘗試用對SAMSUNG S3C44B0 JTAG適用的編程板電路給SAMSUNG的另一款A(yù)RM9內(nèi)核MPU S3C2440 JTAG編程時出現(xiàn)問題,查閱了一些資料后最終解決。希望這些對那些在自制ARM JTAG編程器上遇到困難的朋友一點幫助。

  一. JTAG仿真器的實質(zhì)
      
   JTAG (Joint Test Action Group) 編程調(diào)試實質(zhì)上是利用了MCU/MPU片上自帶的跟蹤調(diào)試功能(需MCU/MPU硬件支持)。JTAG編程板一端與PC的并口相連,另一端連接至目標(biāo)板,由于通常的MCU/MPU的工作電壓在1.8V-3.6V之間,而PC機并口輸出的電平邏輯為5V,因此需做電平轉(zhuǎn)換,通常使用一枚緩沖/驅(qū)動器(如: 74××244/74××541)作隔離,并通過電阻分壓,限制進(jìn)入目標(biāo)板的電平。因PC并口沒有電壓輸出,所以編程板上的IC要由目標(biāo)板供電,即: JTAG接口中的VCC腳是必須恰當(dāng)連接的。
  二. JTAG接口的管腳定義


   主流的JTAG接口有14針和20針兩種,管腳分配如圖一
  14針的JTAG接口為老式接口。
  JTAG中的非地管腳定義如下圖二。
 

   三. 第一種線序的JTAG編程板電路

   實測我所使用的SAMSUNG ARM7 S3C44B0開發(fā)套件中的JTAG編程板電路如圖
 

    但將該編程板與S3C2440相連后卻無法正確載入程序。
   依據(jù)244的輸入輸出關(guān)系,可整理PC并口與JTAG接口管腳的對應(yīng)關(guān)系如下:
   PC并口引腳 
   2  3  8  4
   JTAG引腳 
   TCK  TMS  TDI  nSRST
   四. 第二種線序的JTAG編程板電路

   經(jīng)查閱S3C2440的官方JTAG編程板SJF2440的USER’S GUIDE中的編程板電路,整理PC并口與JTAG接口管腳的對應(yīng)關(guān)系如下:
   PC并口引腳 
   2  3  4  11
   JTAG引腳 
   TCK  TDI  TMS  TDO
 

    據(jù)此推測,使用S3C44B0 JTAG編程板對S3C2440的JTAG調(diào)試失敗是因PC并口控制管腳的分配有區(qū)別。即,S3C2440的JTAG調(diào)試代理模擬JTAG時序所用到的并口管腳與S3C44B0的調(diào)試代理所用到的不同。

   據(jù)此,在S3C44B0 JTAG編程板上靈活飛線,再次使用該編程板對S3C2440調(diào)試成功。
   五. 一點推測
 

    在JTAG相關(guān)搜索里,發(fā)現(xiàn)網(wǎng)友李杰給出的一個JTAG編程板電路,如圖五。

   該電路中的JTAG管腳與PC并口管腳的對應(yīng)關(guān)系與S3C2440 JTAG編程板中的此對應(yīng)關(guān)系相同,而作者稱,該電路適用于所有的ARM芯片。據(jù)此推測:大多公司開發(fā)的ARM調(diào)試軟件支持兩種不同線序的并口模擬 JTAG調(diào)試,并且在調(diào)試開始時能自動偵測出編程板硬件連接并實施控制。官方給出的S3C2440 JTAG調(diào)試軟件僅支持一種線序。
        本信息來源:CAD教育網(wǎng) www.cadedu.com

]]>
ARM的開發(fā)步驟http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1439&Page=1wangxinxin2010-11-18 8:54:19 ARM的開發(fā)步驟
1. 做個最小系統(tǒng)板:如果你從沒有做過ARM的開發(fā),建議你一開始不要貪大求全,把所有的應(yīng)用都做好,因為ARM的啟動方式和dsp或單片機有所不同,往往會遇到各種問題,所以建議先布一個僅有Flash,SRAM或SDRAM、CPU、JTAG、和復(fù)位信號的小系統(tǒng)板,留出擴展接口。使最小系統(tǒng)能夠正常運行,你的任務(wù)就完成了一半,好在ARM的外圍接口基本都是標(biāo)準(zhǔn)接口,如果你已有這些硬件的布線經(jīng)驗,這對你來講是一件很容易的事情。
2. 寫啟動代碼,根據(jù)硬件地址先寫一個能夠啟動的小代碼,包括以下部分:
初始化端口,屏蔽中斷,把程序拷貝到SRAM中;完成代碼的重映射;配置中斷句柄,連接到C語言入口。也許你看到給你的一些示例程序當(dāng)中,bootloader會有很多東西,但是不要被這些復(fù)雜的程序所困擾,因為你不是做開發(fā)板的,你的任務(wù)就是做段小程序,讓你的應(yīng)用程序能夠運行下去
3. 仔細(xì)研究你所用的芯片的資料,盡管ARM在內(nèi)核上兼容,但每家芯片都有自己的特色,編寫程序時必須考慮這些問題。尤其是女孩子,在這兒千萬別有依賴心理,總想拿別人的示例程序修改,卻越改越亂。
4. 多看一些操作系統(tǒng)程序,在ARM的應(yīng)用開放源代碼的程序很多,要想提高自己,就要多看別人的程序,linux,uc/os-II等等這些都是很好的原碼。
6.如果你是作硬件,每個廠家基本上都有針對該芯片的DEMO板原理圖。先將原理圖消化。這樣你以后做設(shè)計時,對資源的分配心中有數(shù)。器件的DATSHEET一定要好好消化。
7.如果做軟件最好對操作系統(tǒng)的機理要有所了解。當(dāng)然這對軟件工程師來說是小菜一碟。但如果是硬件出身的就有點費勁。
問:做最小系統(tǒng)板是2層還是4層好?
答:只有AT91可以用兩層板,其他的最少4層;44b0的地和電源處理好也可用兩層板;
談四層板和33歐電阻:
選用四層板不僅是電源和地的問題,高速數(shù)字電路對走線的阻抗有要求,二層板不好控制阻抗。33歐電阻一般加在驅(qū)動器端,也是起阻抗匹配作用的;布線時要先布數(shù)據(jù)地址線,和需要保證的高速線;
在高頻的時候,PCB板上的走線都要看成傳輸線。傳輸線有其特征阻抗,學(xué)過傳輸線理論的都知道,當(dāng)傳輸線上某處出現(xiàn)阻抗突變(不匹配)時,信號通過就會發(fā)生反射,反射對原信號造成干擾,嚴(yán)重時就會影響電路的正常工作。采用四層板時,通常外層走信號線,中間兩層分別為電源和地平面,這樣一方面隔離了兩個信號層,更重要的是外層的走線與它們所靠近的平面形成稱為“微帶”(microstrip) 的傳輸線,它的阻抗比較固定,而且可以計算。對于兩層板就比較難以做到這樣。這種傳輸線阻抗主要于走線的寬度、到參考平面的距離、敷銅的厚度以及介電材料的特性有關(guān),有許多現(xiàn)成的公式和程序可供計算。
33歐電阻通常串連放在驅(qū)動的一端(其實不一定33歐,從幾歐到五、六十歐都有,視電路具體情況) ,其作用是與發(fā)送器的輸出阻抗串連后與走線的阻抗匹配,使反射回來(假設(shè)解收端阻抗沒有匹配) 的信號不會再次反射回去(吸收掉),這樣接收端的信號就不會受到影響。接收端也可以作匹配,例如采用電阻并聯(lián),但在數(shù)字系統(tǒng)比較少用,因為比較麻煩,而且很多時候是一發(fā)多收,如地址總線,不如源端匹配易做。
這里梭說的高頻,不一定是時鐘頻率很高的電路,是不是高頻不止看頻率,更重要是看信號的上升下降時間。通常可以用上升(或下降) 時間估計電路的頻率,一般取上升時間倒數(shù)的一半,比如如果上升時間是1ns,那么它的倒數(shù)是1000MHz,也就是說在設(shè)計電路是要按500MHz的頻帶來考慮。有時候要故意減慢邊緣時間,許多高速IC其驅(qū)動器的輸出斜率是可調(diào)的
構(gòu)造嵌入式Linux
Linux自身具備一整套工具鏈,容易自行建立嵌入式系統(tǒng)的開發(fā)環(huán)境和交叉運行環(huán)境,并且可以跨越嵌入式系統(tǒng)開發(fā)中的仿真工具(ICE)的障礙。內(nèi)核的完全開放使人們可以自己設(shè)計和開發(fā)出真正的硬實時系統(tǒng),軟實時系統(tǒng)在Linux中也容易得到實現(xiàn)。強大的網(wǎng)絡(luò)支持使得可以利用Linux的網(wǎng)絡(luò)協(xié)議棧將其開發(fā)成為嵌入式的TCP/IP網(wǎng)絡(luò)協(xié)議棧。
  Linux提供了完成嵌入功能的基本內(nèi)核和所需要的所有用戶界面,它是多面的。它能處理嵌入式任務(wù)和用戶界面。
  一個小型的嵌入式Linux系統(tǒng)只需要下面三個基本元素:
  * 引導(dǎo)工具
  * Linux微內(nèi)核,由內(nèi)存管理、進(jìn)程管理和事務(wù)處理構(gòu)成
  * 初始化進(jìn)程
  如果要讓它能干點什么且繼續(xù)保持小型化,還得加上:
  * 硬件驅(qū)動程序
  * 提供所需功能的一個或更多應(yīng)用程序。
  再增加功能,或許需要這些:
  * 一個文件系統(tǒng)(也許在ROM或RAM)中
  * TCP/IP網(wǎng)絡(luò)堆棧
  下面我們就從精簡內(nèi)核、系統(tǒng)啟動、驅(qū)動程序?qū)ⅰ-Window換成MicroWindows四個步驟介紹嵌入式Linux的實際開發(fā)。
  精簡內(nèi)核
  構(gòu)造內(nèi)核的常用命令包括:make config、dep、clean、mrproper、zImage、bzImage、modules、modules_install。命令說明略。
  現(xiàn)在舉個例子說明一下:
  我使用的是 Mandrake內(nèi)附的 2.2.15。我沒有修改任何一行程序碼,完全只靠修改組態(tài)檔得到這些數(shù)據(jù)。
  首先,使用 make config 把所有可以拿掉的選項都拿得。
  不要 floppy;不要SMP、MTRR;不要 Networking、SCSI;把所有的 block device 移除,只留下 old IDE device;把所有的 character device 移除;把所有的 filesystem 移除,只留下 minix;不要 sound 支援。相信我,我己經(jīng)把所有的選項都移除了。這樣做之后,我得到了一個 188K 的核心。
  還不夠小嗎? OK,再加上一招,請把下列兩個檔案中的 -O3,-O2 用 -Os 取代。
  ./Makefile
  ./arch/i386/kernel/
  Makefile
  這樣一來,整個核心變小了 9K,成為 179K。
  不過這個核心恐怕很難發(fā)揮 Linux 的功能,因此我決定把網(wǎng)絡(luò)加回去。把General中的 network support 加回去,重新編譯,核心變成 189 K。10K就加上個 TCP/IP stack,似乎是很上算的生意。
  有stack沒有driver也是枉然,所以我把 embedded board常用的RTL8139的driver加回去,195K。
  如果你需要 DOS 檔案系統(tǒng),那大小成為 213K。如果 minix 用 ext2 換代,則大小成長至 222K。
  Linux所需的內(nèi)存大約在600K~800K之間。1MB內(nèi)存就可能可以開機了,但不太有用,因為連載入C程序庫都有困難。2MB內(nèi)存應(yīng)該就可以做點事了,但要到 4MB以上才可以執(zhí)行一個比較完整的系統(tǒng)。
  因為Linux 的filesystem 相當(dāng)大,大約在 230K 左右,占了 1/3 的體積。內(nèi)存管理占了80K,和核心其它部分的總和差不多。TCP/IP stack 占了65K,驅(qū)動程序占了120K。SysV IPC占了 21K,必要的話可以拿掉,核心檔應(yīng)該可以再小個10K左右。
  如果要裁剪核心大小,應(yīng)該動那里呢? 答案很明顯,當(dāng)然是文件系統(tǒng)。Linux 的 VFS簡化了檔案系統(tǒng)的設(shè)計,buffer cache, directory cache增加了系統(tǒng)的效率。但這些embedded系統(tǒng)根本就用處不大。如果可以把它們拿掉,核心可以馬上縮小 20K 左右。如果跳過整個 VFS,直接將文件系統(tǒng)寫成一個 driver 的型式,應(yīng)該可以將 230K縮減至50K左右。整個核心縮到100K左右。
  系統(tǒng)啟動
  系統(tǒng)的啟動順序及相關(guān)文件仍在核心源碼目錄下,看以下幾個文件:
  ./arch/$ARCH/boot/
  bootsect.s
  ./arch/$ARCH/boot/setup.s
  ./init/main.c
  bootsect.S 及 setup.S
  這個程序是Linux kernel的第一個程序,包括了Linux自己的bootstrap程序,但是在說明這個程序前,必須先說明一般IBM PC開機時的動作(此處的開機是指“打開PC的電源”)。
  一般PC在電源一開時,是由內(nèi)存中地址FFFF:0000開始執(zhí)行(這個地址一定在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此處的內(nèi)容則是一個jump指令,jump到另一個位于ROM BIOS中的位置,開始執(zhí)行一系列的動作。
  緊接著系統(tǒng)測試碼之后,控制權(quán)會轉(zhuǎn)移給ROM中的啟動程序(ROM bootstrap routine)。這個程序會將磁盤上的第零軌第零扇區(qū)讀入內(nèi)存中,至于讀到內(nèi)存的哪里呢? --絕對位置07C0:0000(即07C00h處),這是IBM系列PC的特性。而位于Linux開機磁盤的boot sector上的,正是Linux的bootsect程序。
  把大家所熟知的MS DOS 與Linux的開機部分做個粗淺的比較。MS DOS 由位于磁盤上boot sector的boot程序負(fù)責(zé)把IO.SYS載入內(nèi)存中,而IO.SYS則負(fù)有把DOS的kernel --MSDOS.SYS載入內(nèi)存的重任。而Linux則是由位于boot sector 的bootsect程序負(fù)責(zé)把setup及Linux的kernel載入內(nèi)存中,再將控制權(quán)交給setup。
  驅(qū)動程序
  在Linux系統(tǒng)里,設(shè)備驅(qū)動程序所提供的這組入口點由一個結(jié)構(gòu)來向系統(tǒng)進(jìn)行說明。
  設(shè)備驅(qū)動程序所提供的入口點,在設(shè)備驅(qū)動程序初始化的時候向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r候調(diào)用。Linux系統(tǒng)里,通過調(diào)用register_chrdev 向系統(tǒng)注冊字符型設(shè)備驅(qū)動程序。
  在Linux里,除了直接修改系統(tǒng)核心的源代碼,把設(shè)備驅(qū)動程序加進(jìn)核心里以外,還可以把設(shè)備驅(qū)動程序作為可加載的模塊,由系統(tǒng)管理員動態(tài)地加載它,使之成為核心的一部分。也可以由系統(tǒng)管理員把已加載的模塊動態(tài)地卸載下來。Linux中,模塊可以用C語言編寫,用gcc編譯成目標(biāo)文件(不進(jìn)行鏈接,作為*.o文件存在)。為此需要在gcc命令行里加上-c的參數(shù)。在成功地向系統(tǒng)注冊了設(shè)備驅(qū)動程序后(調(diào)用register_chrdev成功后),就可以用mknod命令來把設(shè)備映射為一個特別文件。其它程序使用這個設(shè)備的時候,只要對此特別文件進(jìn)行操作就行了。
  將X-Window換成MicroWindows
  MicroWindows是使用分層結(jié)構(gòu)的設(shè)計方法。允許改變不同的層來適應(yīng)實際的應(yīng)用。在最底一層,提供了屏幕、鼠標(biāo)/觸摸屏和鍵盤的驅(qū)動,使程序能訪問實際的硬件設(shè)備和其它用戶定制設(shè)備。在中間一層,有一個輕巧的圖形引擎,提供了繪制線條、區(qū)域填充、繪制多邊形、裁剪和使用顏色模式的方法。在最上一層,提供了不同的API給圖形應(yīng)用程序使用。這些API可以提供或不提供桌面和窗口外形。目前,MicroWindows支持Windows Win32/WinCE GDI和Nano-X API。這些API提供了Win32和X窗口系統(tǒng)的緊密兼容性,使得別的應(yīng)用程序可以很容易就能移植到MicroWindows上。
  何謂嵌入式系統(tǒng)
  嵌入式系統(tǒng)被定義為:以應(yīng)用為中心、以計算機技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機系統(tǒng)。
  嵌入式系統(tǒng)是面向用戶、面向產(chǎn)品、面向應(yīng)用的,如果獨立于應(yīng)用自行發(fā)展,則會失去市場。嵌入式處理器的功耗、體積、成本、可靠性、速度、處理能力、電磁兼容性等方面均受到應(yīng)用要求的制約,這些也是各個半導(dǎo)體廠商之間競爭的熱點。嵌入式處理器的應(yīng)用軟件是實現(xiàn)嵌入式系統(tǒng)功能的關(guān)鍵。軟件要求固化存儲,軟件代碼要求高質(zhì)量、高可靠性,系統(tǒng)軟件(OS)的高實時性是基本要求。
  在制造工業(yè)、過程控制、通訊、儀器、儀表、汽車、船舶、航空、航天、軍事裝備、消費類產(chǎn)品等方面均是嵌入式計算機的應(yīng)用領(lǐng)域。]]>
arm硬件支持java技術(shù)Jazelle DBXhttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1438&Page=1wangxinxin2010-11-18 8:52:56

Java已 經(jīng)在各個領(lǐng)域得到了廣泛的應(yīng)用,尤其是無線移動領(lǐng)域,全球超過100個移動運營商已經(jīng)推出了Java下載服務(wù)。Java也正成為其它嵌入式設(shè)備的支持標(biāo) 準(zhǔn),如機頂盒。Java應(yīng)用的快速增長源于以下幾點:盡管Java的可移植性一直有爭論,但無庸置疑的是其快速上市的優(yōu)勢,開發(fā)和發(fā)布Java應(yīng)用都很便 捷;Java有著廣泛的支持網(wǎng)絡(luò),眾多的第三方在開發(fā)各色各樣的Java應(yīng)用;Java平臺固有的安全性適合網(wǎng)絡(luò)下載。

可以說,現(xiàn)在Java游戲已經(jīng)發(fā)展成一項產(chǎn)業(yè),三維圖像、多人連線等更高級的支持也不鮮見。網(wǎng)絡(luò)運營商和手機制造商希望出現(xiàn)更具可玩性的游戲,甚至跳出游戲應(yīng)用發(fā)展諸如商務(wù)、定位、視頻等各種各樣的增值服務(wù),以帶來更多的收入。

為支持這些新的服務(wù),J2ME平臺必須快速發(fā)展,集成新的API(如移動3D),融入新的特性,比如能夠運行多個MIDlet。移動設(shè)備上運行Java需要處理好這兩個問題:Java分化和在資源有限的設(shè)備上如何保證Java的性能。

運營商和手機制造商為標(biāo)準(zhǔn)Java API加入了許多擴展,造成了一定程度上的“Java分化”,影響到了Java的進(jìn)一步應(yīng)用,產(chǎn)業(yè)鏈上各個環(huán)節(jié)的廠家不得不做額外投入以支持各種擴展。于 是Sun公司建立了JCP(Java Community Process)試圖減少這種分化,同時努力能夠跟上嵌入式設(shè)備上Java應(yīng)用和變化的步伐。現(xiàn)在很多JSR擴展規(guī)范都是通過JCP提出的,證明JCP起 著正面的促進(jìn)作用,能根本上解決分化問題。

嵌入式Java虛擬機的設(shè)計限制

目前市場上已經(jīng)有大量宣稱支持Java的手機,從技術(shù)上來看,許多中低端手機基本上是在30~50MHz ARM7TDMI處理器上運行一個小型的軟件字節(jié)碼(bytecode)解釋器,相對較慢。這對許多的Java小游戲是夠用了,因為其性能是由系統(tǒng)的圖形 處理能力決定的,對Java的要求不是特別高。但是市場發(fā)展變化很快,越來越多的Java應(yīng)用需要更強的圖形處理能力,以及一個強大的Java虛擬機。

圖片點擊可在新窗口打開查看

圖1:指令流水線示意圖。

幾種加快Java執(zhí)行速度的傳統(tǒng)方法包括幾種軟件方案,如字節(jié)碼解釋器優(yōu)化、即時(JIT, just-in-time)編譯器、預(yù)先(AOT, ahead-of-time)編譯器等;硬件方案有專用Java處理器和Java協(xié)處理器。這些方法在提高性能的同時,通常也會增加對功耗、內(nèi)存的需求, 影響到了系統(tǒng)平臺的成本,尤其是硬件方案。

JIT或AOT編譯器是把字節(jié)碼動態(tài)地編譯成目標(biāo)平臺的本地碼,然后直接執(zhí)行。顧名思義,AOT編譯方案就是在應(yīng)用下載完后編譯所有代碼,而實際上 某些代碼很有可能根本就執(zhí)行不到。JIT編譯方案則是運行到某段代碼之前,只對這一段作即時的編譯。這種即時處理策略會讓用戶在選擇啟動應(yīng)用程序后,不得 不等待很長的一段時間程序才真正運行起來。另外,研究顯示動態(tài)編譯會導(dǎo)致代碼膨脹4~6倍。因此,除了減慢應(yīng)用程序啟動速度,無論JIT還是 AOT方案,都需要很大的額外內(nèi)存來保存編譯生成的本地碼。

動態(tài)編譯技術(shù)

有一種彌補JIT編譯器缺點的方法就是采用通常被稱為動態(tài)自適應(yīng)編譯(DAC)的混合軟件方案,它可以看成是JIT編譯器和字節(jié)碼解釋器的組合。在 開始階段,程序解釋執(zhí)行,同時軟件對代碼作分析并決定哪些關(guān)鍵代碼需要被編譯,這些關(guān)鍵代碼被鑒別出來后,即被編譯成本地碼運行。

采用了DAC方案,JIT編譯的一些負(fù)面影響可能會減少,但是JIT畢竟無法提供最好的速度性能,啟動時間和代碼膨脹的問題仍會比較突出。

在完成關(guān)鍵代碼分析前,程序得運行于慢速的解釋器模式,然后暫停再進(jìn)行編譯。應(yīng)用程序啟動時,許多函數(shù)方法僅運行一次,理想情況下不應(yīng)該編譯這些代碼。從用戶體驗角度來看,影響是很明顯的,尤其是程序啟動階段會感覺到較長時間內(nèi)程序沒有任何用戶響應(yīng)。

因為純軟件的解釋器很慢,大多數(shù)DAC方案實際上很少做代碼分析,而編譯幾乎所有的函數(shù)方法,就像賭博一樣,賭這個函數(shù)方法接下去會執(zhí)行很多次。如果賭錯,將會付出更多的代價—不但花費了更多的編譯時間,而且編譯產(chǎn)生的那些不再運行的代碼耗費了寶貴的內(nèi)存資源。

編譯的代碼會占用內(nèi)存資源,DAC必須從內(nèi)存中刪掉以前編譯好的代碼,為新的編譯讓出空間,接下去如果運行到剛被刪掉的代碼,又得重新編譯。這樣產(chǎn) 生了性能平滑度問題,因為在編譯新代碼或重編譯過程中,程序得暫停執(zhí)行。比如在切換游戲場景時,玩家會感覺到難以忍受的等待。

盡管動態(tài)編譯存在一些缺點,可現(xiàn)在嵌入式設(shè)備的硬件配置也越來越高,尤其是RAM或ROM,因此諸如DAC甚至一些AOT方案變得很有吸引力。然 而,我們也看到一個系統(tǒng)平臺中許多的組件是用Java開發(fā)的,越來越多的可下載應(yīng)用是用Java寫,多個Java程序并行執(zhí)行的需求也開始產(chǎn)生。這些發(fā)展 趨勢意味著Java對內(nèi)存的需求是無止境的。

硬件加速

硬件Java加速方案通常需要增加額外的芯片以及更多的功耗。專用Java處理器支持直接執(zhí)行Java字節(jié)碼,這雖然看起來性能不錯,但是系統(tǒng)集成和開發(fā)的復(fù)雜度卻大幅上升。Java處理器不會支持已有的很多操作系統(tǒng)和應(yīng)用程序,它需要和其他的嵌入式處理器配合使用。

圖片點擊可在新窗口打開查看

圖2:采用ARM處理器的Java應(yīng)用嵌入式系統(tǒng)架構(gòu)。

Java協(xié)處理器是把Java字節(jié)碼翻譯成主處理器的指令。這當(dāng)然需要許多軟硬件集成工作,要在操作系統(tǒng)加入對協(xié)處理器的支持尤其困難。同樣協(xié)處理 器需要額外的板上空間和額外的功耗,而且本身也很貴。另外,協(xié)處理器和主內(nèi)核之間的松耦合連接方式?jīng)Q定了其運行速度相對較慢。

硬件架構(gòu)擴展和Jazelle DBX技術(shù)

在已有處理器架構(gòu)上加硬件擴展可以同樣支持直接運行Java字節(jié)碼,而且保持了操作系統(tǒng)和應(yīng)用程序的兼容性。架構(gòu)擴展方案相當(dāng)于為處理器附加了一套 指令集,重用已有的處理器資源不會增加額外的硬件成本和功耗。帶擴展的內(nèi)核能夠同時執(zhí)行Java字節(jié)碼及本地碼,開發(fā)者可以充分利用已有的操作系統(tǒng)、應(yīng)用 程序開發(fā)技術(shù),在Java程序可移植性和性能之間取得很好的平衡。

傳統(tǒng)的ARM處理器都支持兩套指令集:32位ARM指令集和16位Thumb指令集。通常使用Thumb指令集的代碼大小約為ARM代碼的 35~40%,但會輕微降低程序性能。指令集支持在ARM和Thumb代碼之間互相作函數(shù)調(diào)用,程序員可以在編譯時分別從性能和代碼密度的角度考慮,以決 定不同部分的代碼編譯成ARM或是Thumb(圖1)。

Jazelle DBX是一種硬件架構(gòu)擴展技術(shù),為ARM處理器引入了第三套指令集—Java字節(jié)碼。新指令集建立了一種新的狀態(tài),處理器在此狀態(tài)下處理Java字節(jié)碼取指、譯碼和維護(hù)Java操作數(shù)棧。

為了降低芯片尺寸并提高性能,Jazelle DBX沒有設(shè)計成傳統(tǒng)形式的微引擎,而是融入流水線中的一個有限狀態(tài)機。和協(xié)處理器或?qū)S锰幚砥髟O(shè)計不同的是,Jazelle DBX和主處理器共用緩存,這都會對功耗和性能帶來益處。另一個重要的設(shè)計考慮是確保Jazelle DBX技術(shù)不會影響實時中斷性能,仍保持與操作系統(tǒng)中已有ARM異常處理代碼的兼容。

Jazelle DBX技術(shù)增加了一條新的“Branch-to-Java”指令來進(jìn)入Java狀態(tài)。此指令支持條件執(zhí)行,先檢查條件標(biāo)志,如果條件滿足,處理器進(jìn)入Java狀態(tài),跳轉(zhuǎn)到指定目標(biāo)地址,開始執(zhí)行Java字節(jié)碼。

在Java狀態(tài)下,PC寄存器仍是32位尋址Java字節(jié)代碼。字節(jié)碼取指、譯碼分別在兩個流水級完成(對應(yīng)ARM/Thumb狀態(tài)下為一個譯碼流水級)。32位取指操作一次性可以取4個Java字節(jié)碼,性能優(yōu)勢明顯。

當(dāng)前處理器狀態(tài)寄存器(CPSR)新定義了一個位,用來記錄處理器的狀態(tài)。這很重要,因為在處理中斷或其它異常時,CPSR會自動保存或恢復(fù)程序運行狀態(tài)。

Jazelle DBX技術(shù)允許所有的Java指令是“可重新開始”的。這樣在執(zhí)行Java指令過程中,即刻響應(yīng)中斷,從而減少中斷延遲,確保實時性能。

在Java狀態(tài)下,有若干個ARM寄存器可以功能復(fù)用(包括棧指針、棧頂四項(top4 elements of stack)、局部變量0等)。正是這些硬件復(fù)用設(shè)計,才使得只用了很少的額外邏輯(約一萬兩千門)就實現(xiàn)了一個Java機。把所有Jazelle DBX擴展所需的狀態(tài)用ARM寄存器保存,也保證了和現(xiàn)有操作系統(tǒng)、中斷處理程序和異常處理代碼的兼容性。

把棧頂四項保存在ARM寄存器中也能提高Java性能。大量的程序分析顯示,大多數(shù)程序的棧深度是很小的,所以這項策略可以盡量減少內(nèi)存訪問,硬件也可自動處理棧溢出或下溢。

Jazelle DBX技術(shù)的性能

對于一個高度優(yōu)化的商業(yè)Java虛擬機,運行評測程序或復(fù)雜的MIDP2.0應(yīng)用,Jazelle DBX技術(shù)通常可帶來約2~4倍的性能提升,而且對實時性不會產(chǎn)生任何影響。

對于嵌入式設(shè)備來說,運行速度還不是唯一的考慮因素,功耗、存儲器占用、集成的難度、系統(tǒng)成本和用戶體驗等都很重要,需要很好的平衡。

Jazelle DBX技術(shù)把Java字節(jié)碼分為3類:直接執(zhí)行、模擬執(zhí)行(emulated)和未定義。大多數(shù)Java字節(jié)碼(ARM926EJ-S支持134個)可由 硬件直接執(zhí)行,余下的由一些簡短的高度優(yōu)化的ARM指令序列模擬執(zhí)行。把原先虛擬機中的解釋器去掉,替換以ARM專有的代碼(稱為VMZ,這些代碼甚至比 替掉的代碼更小)。

統(tǒng)計分析表明,在一段典型的程序代碼中,需要模擬執(zhí)行的字節(jié)碼不會超過5%。這就是為什么ARM決定Jazelle DBX硬件擴展只支持直接執(zhí)行部分的字節(jié)碼,而非全部。Jazelle DBX硬件擴展的實現(xiàn)約為一萬兩千門的規(guī)模,而大多數(shù)的專用Java處理器或協(xié)處理器通常有6萬到10萬門的規(guī)模。這樣的設(shè)計策略把硬件邏輯的復(fù)雜度減到 最小、功耗低、系統(tǒng)集成難度低,卻仍能表現(xiàn)出很高的整體Java性能。

未定義的字節(jié)碼與模擬執(zhí)行的字節(jié)碼截然不同。一旦執(zhí)行到未定義的字節(jié)碼,處理器退出Java狀態(tài),進(jìn)入ARM狀態(tài)執(zhí)行異常處理。有了這樣的機制,就可以以軟件補丁的方式實現(xiàn)對未來可能會擴展的Java字節(jié)碼支持。

為幫助用戶使用Jazelle DBX,ARM公司提供了JTEK件包,其中包含了VMZ源代碼,為一個現(xiàn)有的Java虛擬機和操作系統(tǒng)集成JTEK通常只需幾天時間。ARM也和主流的 Java平臺供應(yīng)商合作,如Aplix/iasolution和Sun等,在他們的軟件產(chǎn)品中加入了Jazelle DBX支持。另外,ARM和眾多操作系統(tǒng)廠商合作,主流的如WindowsCE、SymbianOS、PalmOS、Linux,以及許多實時專有的操作 系統(tǒng)都支持Jazelle DBX。

本文小結(jié)

移動Java游戲促進(jìn)了Java在無線設(shè)備上的應(yīng)用,Java固有的端對端的安全性和Java應(yīng)用開發(fā)的快捷性使Java成為新的收入增長點。在資 源有限的嵌入式設(shè)備上也需要高性能的Java平臺,Jazelle DBX這樣的加速技術(shù)正是應(yīng)對了這樣的需求,其他一些硬件或純軟件加速方案將受益于Jazelle DBX,并避免原有的各種缺點。

通過融合各種新特性的加入,ARM將在未來架構(gòu)發(fā)展中繼續(xù)支持Jazelle DBX以及后續(xù)的新技術(shù)。Jazlle技術(shù)和相應(yīng)的JTEK軟件包將更廣泛的促進(jìn)Java在嵌入式設(shè)備上的應(yīng)用,更多更新的移動Java應(yīng)用將隨之涌現(xiàn)。

]]>
如何在Windows上建立arm-linux開發(fā)環(huán)境http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1437&Page=1wangxinxin2010-11-18 8:50:21
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
STM32與LPC系列ARM資源之比較http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1436&Page=1wangxinxin2010-11-18 8:49:29
圖片點擊可在新窗口打開查看

 由于有周立公開發(fā)板的影響,LPC系列的開發(fā)板在工程師心目中一般是入門的最好型號之一。這次剛好有STM32的競賽,正好將兩者的資源進(jìn)行比較一下(LPC系列以LPC213X為例)。
LPC213X包括LPC2131、2132、2138等, 是基于一個支持實時仿真和跟蹤的16/32位ARM7TDMI-STM CPU,并帶有32kB、64kB和512kB嵌入的高速Flash存儲器。128位寬度的存儲器接口和獨特的加速結(jié)構(gòu)使32位代碼能夠在最大時鐘速率下運行。對代碼規(guī)模有嚴(yán)格控制的應(yīng)用可使用16位Thumb模式將代碼規(guī)模降低超過30%,而性能的損失卻很小。
而STM32則大致分為兩類,一種是基本型,一種是增強型。這同51內(nèi)核的單片機有點類似,51系列的單片機也有普通型和增強型。基本型STM32系列ARM包括STM32F101x6、STM32F101x8、STM32F101xB等,它是32位基于ARM核心的帶閃存微型控制器,有六個16位定時器、ADC、7個通信接口;而增強型STM32系列的ARM包括STM32F103x6、STM32F103x8、STM32F103xB等,它是32位基于ARM核心的帶閃存的、USB、CAN總線的微控制器,它有七個16位定時器、2個ADC、9個通信接口。
內(nèi)核方面,LPC213X是ARM7TDMI-S內(nèi)核,而STM32則是Cortex-M3?CPU
片內(nèi)存儲方面,LPC213X有8/16/32kB的片內(nèi)靜態(tài)RAM和32/64/512kB的片內(nèi)Flash程序存儲器。而STM32則有從32K字節(jié)至128K字節(jié)閃存程序存儲器,從6K字節(jié)至16K字節(jié)SRAM。
 
LPC有如下特征:
??通過片內(nèi)boot裝載程序?qū)崿F(xiàn)在系統(tǒng)編程/在應(yīng)用編程(ISP/IAP)。單扇區(qū)或整片擦除時間為400ms。
256字節(jié)行編程時間為1ms。
?? EmbeddedICE?RT和嵌入式跟蹤接口通過片內(nèi)RealMonitorTM軟件對代碼進(jìn)行實時調(diào)試和高速跟
蹤。
?? 1個(LPC2131/2132)或2個(LPC2138)8路10位的A/D轉(zhuǎn)換器,共提供16路模擬輸入,每
個通道的轉(zhuǎn)換時間低至2.44us。
 1個10位的D/A轉(zhuǎn)換器,可產(chǎn)生不同的模擬輸出。(僅適用于LPC2132/2138)
 2個32位定時器/計數(shù)器(帶4路捕獲和4路比較通道)、PWM單元(6路輸出)和看門狗。
 實時時鐘具有獨立的電源和時鐘,可在節(jié)電模式中極大地降低功耗。
 多個串行接口,包括2個16C550工業(yè)標(biāo)準(zhǔn)UART、2個高速I2C接口(400 kbit/s)、SPITM和具有
緩沖作用和數(shù)據(jù)長度可變功能的SSP。
 向量中斷控制器。可配置優(yōu)先級和向量地址。
 小型的LQFP64封裝上包含多達(dá)47個通用I/O口(可承受5V電壓)。
 多達(dá)9個邊沿或電平觸發(fā)的外部中斷管腳。
 通過片內(nèi)PLL(100us的設(shè)置時間)可實現(xiàn)最大為60MHz的CPU操作頻率。
 片內(nèi)晶振頻率范圍:1~30 MHz。
低功耗模式:空閑和掉電。
 可通過個別使能/禁止外部功能和外圍時鐘分頻來優(yōu)化功耗。
 通過外部中斷將處理器從掉電模式中喚醒。
 單電源,具有上電復(fù)位(POR)和掉電檢測(BOD)電路:
CPU操作電壓范圍:3.0V~3.6 V (3.3 V±10﹪),I/O口可承受5V的電壓。
 
STM32有如下特征:
■能夠有單周期乘法和硬件除法
■存儲器
從32K字節(jié)至128K字節(jié)閃存程序存儲器
從6K字節(jié)至16K字節(jié)SRAM
■時鐘、復(fù)位和供電管理
2.0至3.6伏供電和I/O管腳
上電/斷電復(fù)位(POR / PDR)、可編程電壓監(jiān)測器(PVD)
內(nèi)嵌4至16MHz高速晶體振蕩器
內(nèi)嵌經(jīng)出廠調(diào)校的8MHz RC振蕩器
內(nèi)部40kHz的RC振蕩器
PLL供應(yīng)CPU時鐘
帶校準(zhǔn)的32kHz RTC振蕩器
■低功耗
睡眠、停機和待機模式
VBAT為RTC和后備寄存器供電
■調(diào)試模式
串行線調(diào)試(SWD)和JTAG調(diào)試接口
■DMA
7通道DMA控制器
支持的外設(shè):定時器、ADC、SPI、I2C和USART
■1個12位模數(shù)轉(zhuǎn)換器,1us轉(zhuǎn)換時間(16通道)
■多達(dá)80個快速I/O口
26/37/51/80個多功能雙向5V兼容的I/O口
所有I/O口可以映像到16個外部中斷
■多達(dá)6個定時器
多達(dá)3個16位定時器,每個定時器有多達(dá)4個用于輸入捕獲/輸出比較/ PWM或脈沖計數(shù)的通道
2個16位看門狗定時器(獨立的和窗口型的)
系統(tǒng)時間定時器:24位自減型
■多達(dá)7個通信接口
多達(dá)2個I2C接口(SMBus/PMBus)
多達(dá)3個USART接口,支持ISO7816,LIN,IrDA接口和調(diào)制解調(diào)控制
多達(dá)2個SPI同步串行接口(18兆位/秒)

]]>
基于ARM的RFID閱讀器設(shè)計http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1435&Page=1wangxinxin2010-11-18 8:48:26<P>  RFID技術(shù)可識別高速運動物體并可同時識別多個標(biāo)簽,操作快捷方便<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">其應(yīng)用范圍十分廣泛,主要有商品零售、商品防偽、交通運輸、物流倉儲、安全管理、醫(yī)療衛(wèi)生、圖書檔案和國防軍事等<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  RFID系統(tǒng)由三部分組成:1. 標(biāo)簽(Tag,即射頻卡),由耦合元件及芯片組成,標(biāo)簽含有內(nèi)置天線,用于和射頻天線間進(jìn)行通信;2. 閱讀器,讀取(在讀寫卡中還可以寫入)標(biāo)簽信息的設(shè)備;3. 天線,在標(biāo)簽和讀取器間傳遞射頻信號<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本文主要介紹基于ARM,工作頻率在13.56MHz的RFID閱讀器設(shè)計方案<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> <STRONG> 1系統(tǒng)硬件設(shè)計</STRONG></P>
<P>  1.1 系統(tǒng)主要芯片介紹</P>
<P>  本設(shè)計方案的兩個主要芯片是LPC2212和MF RC500<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">LPC2212功耗低,性能高,接口資源豐富,可以在RFID閱讀器的基礎(chǔ)上進(jìn)行其它功能的擴展,實現(xiàn)一個多功能應(yīng)用系統(tǒng)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  MF RC500是PHILIPS公司生產(chǎn)的應(yīng)用于13.56MHz非接觸式通信中高集成讀卡IC系列中的一員<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">MF RC500支持ISO14443A所有的層,內(nèi)部的發(fā)送器部分不需要增加有源電路就能夠直接驅(qū)動近操作距離的天線(可達(dá)100mm);接收器部分提供一個堅固而有效的解調(diào)和解碼電路用于ISO14443A兼容的應(yīng)答器信號;數(shù)字部分處理ISO14443A幀和錯誤檢測奇偶CRC,此外它還支持快速CRYPTO1加密算法用于驗證MIFARE系列產(chǎn)品<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  1.2 系統(tǒng)總體設(shè)計</P>
<P>  系統(tǒng)從功能上主要分為4大模塊:控制模塊、發(fā)送接收數(shù)據(jù)模塊、串行通信模塊和顯示模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">各模塊組成的系統(tǒng)總框圖如圖1所示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  控制模塊主要由微控制器LPC2212和晶振組成,負(fù)責(zé)整個系統(tǒng)的控制工作<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  發(fā)送接收數(shù)據(jù)模塊主要由MF RC500、晶振和天線組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">MF RC500分為模擬部分和數(shù)字部分<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">模擬部分負(fù)責(zé)對射頻卡的發(fā)送接收操作,發(fā)送主要完成驅(qū)動天線,提供13.56MHz的能量載波并根據(jù)寄存器的設(shè)置對發(fā)送數(shù)據(jù)進(jìn)行調(diào)制;接收主要完成對射頻卡發(fā)送的信號進(jìn)行檢測和解調(diào)并根據(jù)寄存器的設(shè)定進(jìn)行處理<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">數(shù)字部分則通過并口和中斷與微控制器LPC2212通信<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">MF RC500的能量載波由13.56MHz晶振提供,天線則主要由LC低通濾波器和LC諧振電路組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  串行通信模塊主要由RS-232-C標(biāo)準(zhǔn)采用的9芯接口和電平轉(zhuǎn)換電路MAX232A組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本模塊負(fù)責(zé)閱讀器與PC機通訊,可進(jìn)行程序下載,射頻卡信息修改等<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P align=center><IMG alt="" src="http://image.mcuol.com/News/070628184843030.gif" twffan="done" dypop="系統(tǒng)總框圖"></P>
<P align=center>圖1 系統(tǒng)總框圖</P>
<P>  顯示模塊主要由低復(fù)用率的通用液晶(LCD)驅(qū)動器PCF8562和LCD屏組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">PCF8562與微控制器LPC2212可以通過兩線雙向的I2C總線通信,當(dāng)這兩條線連接到器件的輸出級時必須通過上拉電阻連接到正電源<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">顯示模塊負(fù)責(zé)卡片信息顯示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> <STRONG> 2 系統(tǒng)軟件設(shè)計</STRONG></P>
<P>  軟件設(shè)計包括三個模塊:系統(tǒng)初始化模塊、射頻卡與讀寫器通信模塊和LCD顯示模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">下面詳細(xì)介紹以上模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  2.1 系統(tǒng)初始化模塊</P>
<P>  為了使系統(tǒng)能夠正常運行,必須在系統(tǒng)復(fù)位時對系統(tǒng)進(jìn)行初始化工作<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">其中包括中斷向量表的建立和REMAP(重映射)操作、各種模式堆棧初始化操作、時鐘初始化操作、串口初始化操作和中斷選擇初始化操作<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  ARM7處理器有7種異常模式,其中斷向量位置是固定的(地址0x00000000-0x0000001C)<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">LPC2212采用64字節(jié)存儲中斷向量表<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">為了實現(xiàn)LPC2212在不同操作模式下對中斷的使用,必須對LPC2212中Flash的Boot Block塊和SRAM空間的一小部分REMAP<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">另外,需要對各種模式的堆棧進(jìn)行初始化<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  LPC2212振蕩器工作在振蕩模式,外部晶體振蕩頻率為20-25MHz,通過內(nèi)部PLL電路調(diào)整時鐘,使系統(tǒng)運行速度更快<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">程序首先使能PLL但不連接PLL,然后設(shè)置外設(shè)時鐘與系統(tǒng)時鐘的分頻比,接著設(shè)置PLL的乘因子和除因子<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">設(shè)置完成后,把數(shù)據(jù)正確寫入硬件,并等待PLL跟蹤完成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">最后,使能PLL并使PLL連上系統(tǒng)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  串口是讀卡器與PC機通信端口,在使用前須設(shè)置串口波特率、接收和發(fā)送數(shù)據(jù)字符格式和初始化FIFO(先進(jìn)先出隊列)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  串口和RC500都是基于IRQ中斷,使用前,須對LPC2212中斷選擇寄存器進(jìn)行配置,把串口和RC500的中斷請求分配為IRQ模式<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  2.2 射頻卡與讀寫器通信模塊</P>
<P>  本系統(tǒng)采用M1(MIFARE 1)智能卡,本卡自帶天線,內(nèi)含加密控制邏輯和通訊邏輯電路,M1分為16個扇區(qū),每個扇區(qū)為4塊,每塊16個字節(jié),以塊為存取單位,每個扇區(qū)有獨立的一組密碼及訪問控制,可一卡多用<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">M1射頻卡與讀寫器的通信流程圖如圖2所示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P><BR>  復(fù)位應(yīng)答(Answer to request):M1射頻卡的通訊協(xié)議和通訊波特率是定義好的,當(dāng)有卡片進(jìn)入讀寫器的操作范圍時,讀寫器以特定的協(xié)議與它通訊,從而確定該卡是否為M1射頻卡,即驗證卡片的卡型<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  防沖突機制 (Anti-collision Loop):當(dāng)有多張卡進(jìn)入讀寫器操作范圍時,防沖突機制會從其中選擇一張進(jìn)行操作,未選中的則處于空閑模式等待下一次選卡,該過程會返回被選卡的序列號<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  選擇卡片(Select Tag):選擇被選中的卡的序列號,并同時返回卡的容量代碼<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  三次互相驗證(Three Authentication):選定要處理的卡片之后,讀寫器就確定要訪問的扇區(qū)號,并對該扇區(qū)密碼進(jìn)行密碼校驗,在三次相互認(rèn)證之后就可以通過加密流進(jìn)行通訊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">(在選擇另一扇區(qū)時,則必須進(jìn)行另一扇區(qū)密碼校驗<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">)</P>
<P>  </P>
<P align=center><IMG alt="" src="http://image.mcuol.com/News/070628184843141.gif" twffan="done" dypop="通信流程圖"></P>
<P align=center>圖2 通信流程圖</P>
<P>  對數(shù)據(jù)塊的操作: 讀 (Read):讀一個塊;寫 (Write):寫&nbsp;一個塊;加(Increment):對數(shù)值塊進(jìn)行加值;減(Decrement):對數(shù)值塊進(jìn)行減值;存儲(Restore):將塊中的內(nèi)容存到數(shù)據(jù)寄存器中;傳輸(Transfer):將數(shù)據(jù)寄存器中的內(nèi)容寫入塊中;中止(Halt):將卡置于暫停工作狀態(tài)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  2.3 LCD顯示模塊</P>
<P>  顯示模塊完成射頻卡信息在LCD上的顯示功能<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">用戶可以顯示專用符號、數(shù)字、漢字和圖形<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">顯示模塊主要分為兩部分:第一部分是根據(jù)閱讀器從射頻卡讀入的信息確定要顯示的內(nèi)容,顯示圖形時,則要計算顯示坐標(biāo);第二部分是根據(jù)系統(tǒng)所采用的LCD建立專用符號庫、漢字庫,顯示圖形時,則要把第一部分得到的坐標(biāo)轉(zhuǎn)化為LCD上的顯示坐標(biāo)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  <STRONG>3 改進(jìn)的防沖突算法</STRONG></P>
<P>  根據(jù)ISO14443協(xié)議,M1型卡傳統(tǒng)的防沖突算法是動態(tài)二進(jìn)制檢索樹算法<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">它首先利用MANCH ESTER編碼“沒有變化”的狀態(tài)來檢測碰撞位,然后把碰撞位設(shè)為二進(jìn)制“1”,用SELECT命令發(fā)送碰撞前接收的部分卡片序列號和碰撞位,如果卡片開頭部分序列號與其相同,則做出應(yīng)答,不相同則沒有響應(yīng)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">以此來縮小卡片范圍,最終達(dá)到無碰撞<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">圖3顯示了兩個卡片(PICC #1和PICC #2)的防碰撞流程<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  </P>
<P align=center><IMG alt="" src="http://image.mcuol.com/News/070628184843182.gif" twffan="done" dypop="比特碰撞的選擇流程"></P>
<P align=center><BR>圖3 比特碰撞的選擇流程</P>
<P>  但是,傳統(tǒng)的防碰撞方法要求所有應(yīng)答器準(zhǔn)確同步,應(yīng)答器必須準(zhǔn)確地在同一時刻開始傳輸他們的序列號<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">然而,在實際使用中,應(yīng)答器由用戶控制,可能產(chǎn)生異步發(fā)送數(shù)據(jù),如果仍然采用傳統(tǒng)防沖突算法,有可能導(dǎo)致死循環(huán),如圖4所示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  </P>
<P align=center><IMG alt="" src="http://image.mcuol.com/News/070628184843233.gif" twffan="done" dypop="尋卡死循環(huán)"></P>
<P align=center><BR>圖4 尋卡死循環(huán)</P>
<P>  為了解決死循環(huán)問題,在傳統(tǒng)算法的基礎(chǔ)上設(shè)置了一個記錄碰撞位數(shù)的變量,如果第二次碰撞位數(shù)和第一次相等,則把SELECT發(fā)送的部分卡號增加一位,設(shè)為二進(jìn)制數(shù)“1”發(fā)送出去<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">如果在規(guī)定時間內(nèi)沒有收到應(yīng)答,則把增加位設(shè)為“0”發(fā)送出去<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">可以有效預(yù)防由于應(yīng)答器異步導(dǎo)致的死循環(huán)問題<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">針對圖4的改進(jìn)流程如圖5<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  </P>
<P><IMG alt="" src="http://image.mcuol.com/News/070628184843284.gif" twffan="done" dypop="改進(jìn)的防沖突流程"><BR>圖5 改進(jìn)的防沖突流程</P>
<P>  4 結(jié)束語</P>
<P>  本文給出了一個基于ARM的RFID閱讀器軟硬件框架,實現(xiàn)了對射頻卡的基本讀寫等功能<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">閱讀器采用的ARM微處理器,接口資源豐富,還有很多空閑接口,可在閱讀器的基礎(chǔ)上進(jìn)行擴展,例如,可利用ARM的其它接口驅(qū)動電機,利用射頻卡對電機實現(xiàn)控制,只有卡內(nèi)信息正確,系統(tǒng)才能向電機發(fā)出控制命令,從而在硬件上增加了安全性<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">另外,改進(jìn)的防沖突算法也使讀卡器在應(yīng)答器異步發(fā)送數(shù)據(jù)的情況下有效的避免死鎖<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本文對實現(xiàn)帶有RFID功能的多功能系統(tǒng)有一定的參考價值和實用價值<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> 參考文獻(xiàn):</P>
<P>  [1]游戰(zhàn)清<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">李蘇劍等.無限射頻識別技術(shù)(RFID)理論與應(yīng)用[M].電子工業(yè)出版社<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2004.</P>
<P>  [2]李駒光<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">聶雪媛等.ARM應(yīng)用系統(tǒng)開發(fā)詳解—基于S3C14510B系統(tǒng)設(shè)計[M].清華大學(xué)出版社<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2003.</P>
<P>  [3]周立功等.ARM微控制器基礎(chǔ)與實戰(zhàn)[M].北京航空航天大學(xué)出版社<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2003.</P>
<P>  [4]Bhuptani Manish<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">Moradpour Shahram.RFID Field Guide Deploying Radio Frequency Identification Systems[M].Prentice Hall PTR<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2005.</P>
<P>  [5]Klaus Finkenzeller.RFID Handbook:Fundamentals and Applications in Contactless Smart Cards and Identification[M].John Wiley &amp; Sons<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2003.<BR></P> ]]>
圖文并茂講解:如何實現(xiàn)ARM固件的遠(yuǎn)程升級http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1434&Page=1wangxinxin2010-11-18 8:46:44 http://www.mcuisp.com/bbs/dispbbs.asp?boardid=3&Id=34
圖片點擊可在新窗口打開查看 ]]>
主站蜘蛛池模板: 久草免费资源 | 日韩欧美一区二区三区久久 | 男人的天堂官网 | 久久精品欧美日韩精品 | 亚洲精品h | 欧美中文字幕在线视频 | 国产欧美日韩不卡一区二区三区 | 无圣光福利视频 | 国产99视频精品免费视频免里 | 日韩欧美国产高清在线观看 | 欧美日韩视频在线第一区 | 久久中文字幕久久久久 | 久久综合婷婷 | 人人公开免费超级碰碰碰视频 | 久草在线网址 | 欧美国产日韩在线观看 | 成人欧美一区二区三区视频xxx | 亚洲精品午夜一区二区在线观看 | 国内精品久久久久久久影视麻豆 | 亚洲欧美日韩精品久久亚洲区色播 | 蕾丝视频永久在线入口香蕉 | 国产va精品网站精品网站精品 | 欧美日本道免费一区二区三区 | 草草影院在线观看 | 国产成人禁片免费观看视频 | 99九九国产精品免费视频 | 久久久久久久久久免免费精品 | 在线观看欧美亚洲日本专区 | 欧美一区永久视频免费观看 | 中日韩一区二区三区 | 精品欧美一区二区在线看片 | 久久精品在线视频 | 国内精品国语自产拍在线观看55 | 丝袜一级片 | 精品精品国产欧美在线观看 | 亚洲高清视频在线观看 | 在线精品亚洲欧洲第一页 | 久久久久久久国产 | 99久久免费精品国产免费高清 | 26uuu影院亚洲欧美综合 | 欧美日韩精品一区二区三区高清视频 |