亚洲欧美专区精品久久,久久免费精品视频在线观看,91视频地址http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Net[email protected]images/logo.gif曙海教育集團論壇ARM基礎知識連載之五http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1453&Page=1wangxinxin2010-11-18 12:06:15在應用程序中安裝異常中斷處理程序
1.使用跳轉指令:可以在異常中斷對應異常向量表中特定位置放置一條跳轉指令,直接跳轉到該異常中斷的處理程序。這種方法有一個缺點,即只能在32M空間范圍內跳轉。
2.使用數據讀取指令LDR:使用數據讀取指令LDR向程序計數器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對地址存放在存放在距離向量表4KB范圍內的一個存儲單元中;再使用數據讀取指令LDR將該單元的內容讀取到程序計數器PC中。
**在系統復位時安裝異常中斷處理程序**
1.地址0x00處為ROM的情況
  使用數據讀取指令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
使用跳轉指令的示例如下所示:
  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時,中斷向量表必須使用數據讀取指令直接指向PC中賦值的形式。而且,必須使用下面的代碼巴中斷向量表從ROM中復制到RAM中地址0x00開始處的存儲空間中:

MOV r8,#0
ADR r9,Vector_Init_Block
;復制中斷向量表(8字)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)
;復制保存各中斷處理函數地址的表(8字words)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)
*********************************************
ARM存儲系統概述
*********************************************
ARM存儲系統的體系結構適應不同的嵌入式
應用系統的需要差別很大。最簡單的存儲系統使用平辦事的地址映射機制,就像一些簡單的彈片機系統中一樣,地址空間的分配方式是固定的,系統各部分都使用物
理地址。而一些復雜系統可能包括下面的一種或幾種技術,從而提供更為強大的存儲系統。
**系統中可能包含多種類型的存儲器,如FLASH,ROM,RAM,EEPROM等,不同類型的存儲器的速度和寬度等各不相同。
**通過使用CACHE及WRITE BUFFER技術縮小處理器和存儲系統速度差別,從而提高系統的整體性能。
**內存管理部件通過內存映射技術實現虛擬空間到物理空間的映射。在系統加電時,將ROM/FLASH影射為地址0,這樣可以進行一些初始化處理;當這些初始化完成后將RAM地址影射為0,并把系統程序加載到RAM中運行,這樣很好地解決了嵌入式系統的需要。
**引入存儲保護機制,增強系統的安全性。
**引入一些機制保證I/O操作應設成內存操作后,各種I/O操作能夠得到正確的結果。
**與存儲系統相關的程序設計指南**
本節從外部來看ARM存儲系統,及ARM存儲系統提供的對外接口。本節介紹用戶通過這些接口來訪問ARM存儲系統時需要遵守的規則。
1.地址空間
ARM體系使用單一的和平板地址空間。該地址空間大小為2^32個8位字節,這些字節的單元地址是一個無符號的32位數值,其
取值范圍為0~2^32-1。ARM地址空間也可以看作是2^30個32位的字單元。這些字單元的地址可以被4整除,也就是說該地址低兩位為0b00。地
址為A的字數據包括地址為A、A+1、A+3、A+3 4個字節單元的內容。
各存儲單元的地址作為32為無符號數,可以進行常規的整數運算。這些運算的結果進行2^32取模。
程序正常執行時,每執行一條ARM指令,當前指令計數器加4個字節;每執行一條Thumb指令,當前指令計數器加2個字節。但是,當地址上發生溢出時,執行結果將是不可預知的。
2.存儲器格式
在ARM中,如果地址A是字對齊的,有下面幾種:
**地址為A的字單元包括字節單元A,A+1,A+2,A+3。
**地址為A的班子單元包括字節單元A,A+1。
**地址為A+2的半字單元包括字節單元A+2,A=3.
**地址為A的字單元包括半字節單元A,A+2。
在big-endian格式中,對于地址為a的字單元其中字節單元由高位到低位字節順序為A,A+1,A=2,A+3;這種存儲器格式如下所示:
31       24 23                    16 15           8 7        0
--------------------------------------------------------------------
字單元A           |
--------------------------------------------------------------------
半字單元A   | 半字單元A+2     |
--------------------------------------------------------------------
字節單元A    | 字節單元A+1 | 字節單元A+2   | 字節單元A+3|
--------------------------------------------------------------------
在little-endian格式中,對于地址為A的字單元由高位到低位字節順序為A+3,A+2,A+1,A,這種存儲格式如下所示
31       24 23                    16 15           8 7        0
--------------------------------------------------------------------
字單元A           |
--------------------------------------------------------------------
半字單元A+2   | 半字單元A     |
--------------------------------------------------------------------
字節單元A+3    |字節單元A+2 | 字節單元A+1   | 字節單元A  |
--------------------------------------------------------------------
在ARM系統中沒有提供指令來選擇存儲器格式。如果系統中包含標準的ARM控制協處理器CP15,則CP15的寄存器C1的位[7]決定系統中存儲
器的格式。當系統復位時,寄存器C1的[7]值為零,這時系統中存儲器格式為little-endian格式。如果系統中采用的是big-endian格
式,則復位異常中斷處理程序中必須設置c1寄存器的[7]位。
3.非對齊的存儲訪問操作
非對齊:位于arm狀態期間,低二位不為0b00;位于Thumb狀態期間,最低位不為0b0。
3.1非對齊的指令預取操作
如果系統中指定當發生非對齊的指令預取操作時,忽略地址中相應的位,則由存儲系統實現這種忽略。
3.2非對齊的數據訪問操作
對于LOAD/STORE操作,系統定義了下面3中可能的結果:
***執行結果不可預知
***忽略字單元地址低兩位的值,即訪問地址為字單元;忽略半字單元最低位的值,即訪問地址為半字單元。
***由存儲系統忽略字單元地址中低兩位的值,半字單元地址最低位的值。
4.指令預取和自修改代碼
當用戶讀取PC計數器的值時,返回的是當前指令下面的第二條指令的地址。對于ARM指令來說,返回當前指令地址值加8個字節;對于Thumb指令來說,返回值為當前指令地址值加4個字節。
自修改代碼指的是代碼在執行過程中修改自身。應盡量避免使用。
5.存儲器映射的I/O空間
在ARM中,I/O操作通常被影射為存儲器操作。通常需要將存儲器映射的I/O空間設置成非緩沖的。
*************************************************************
ARM編譯器支持的數據類型
************************************************************
數據類型 長度(位) 對齊特性
Char       8                1(字節對齊)
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.整數類型
在ARM體系中,整數類型是以2的補碼形式存儲的。對于long long類型來說,在little
endian內存模式下,其低32位保存在低地址的字單元中,高32為保存在高地址的字單元中;在big
endian模式下,其低32位保存在高地址的字單元中,高32為保存在低地址的字單元中。對于整型數據的操作遵守下面的規則:
**所有帶符號的整型書的運算是按照二進制的補碼進行的。
**帶符號的整型數的運算不進行符號的擴展。
**帶符號的整型數的右移操作是算數移位。
**制定的移位位數的數是8位的無符號數。
**進行移位操作的數被作為32位數。
**超過31位的邏輯左移的結果為0。
**對于無符號數和有符號的正數來說,超過32位的右移操作結果為0;對于有符號的負數來說,超過32位的右移操作結果為-1。
**整數除法運算的余數和除數有相同的符號。
**當把一個整數截斷成位數更短的整數類型的數時,并不能保證所得到的結果的最高位的符號位的正確性。
**整型數據之間的類型轉換不會產生異常中斷。
**整型數據的溢出不會產生異常中斷。
**整型數據除以0將會產生異常中斷。
2.浮點數
在ARM體系中,浮點數是按照IEEE標準存儲的。
**float類型的數是按照IEEE的單精度數表示的。
**double和long double 是用IEEE的雙精度數表示的。
對于浮點數的操作遵守下面的規則:
**遵守正常的IEEE754規則。
**當默認情況下禁止浮點數運算異常中斷。
**當發生卷繞時,用最接近的數據來表示。
3.指針類型的數據
下面的規則適用于處數據成員指針以外的其他指針:
**NULL被定義為0。
**相鄰的兩個存儲單元地址相差一。
**在指向函數的指針和指向數據的指針進行數據轉換時,編譯器將會產生警告信息。
**類型size_t被定義為unsigned int.
**類型ptrdiff_t被定義為signed int。
**兩個指針類型的數據相減時,結果可以按照下面的公式得到。
    ((int)a-(int)b)/(int)sizeof(type pointed to)
這時,只要指針所指的對象不是pack的,其對齊特性能夠滿足整除的要求。
*****************************************************
ARM編譯器中預定義的宏
*****************************************************
ARM編譯器預定義了一些宏,這些預定義宏對應一定的數值,有些預定義宏沒有對應數值,見下表:
_arm                _               使用編譯器armcc,tcc,armcpp,tcpp時
_ARMCC_VERSION      Ver             代表編譯器版本號,其格式為:
                                    PVtbbb,其中:
                                    P為產品編號(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         _               編譯器針對目標系統使用big-endian內存模式時
_cplusplus          _               編譯器工作與C++模式時
_CC_ARM             _               返回編譯器的名稱
_DATE_              date            編譯源文件的日期
_embedded_cplusplus                 編譯器工作于EC++模式時
_FEATURE_SINGED_CHAE                使用編譯設置選項-zc時設置該預定義宏
_FILE_              name            包含全路徑的當前被編譯的源文件名稱
_func_              name            當前被編譯的函數名稱
_LINE_              num             當前被編譯的代碼行號名稱
]]>
6700加128M內存探討http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1452&Page=1wangxinxin2010-11-18 9:50:37內存升級方法后給很多機的機友過了把癮,很多商家帶來了商機。! q! O7 {' y8 |( C3 B8 A
可是自己弄來了很多麻煩,進的芯片不得不把他用完,幫升級完的機友過后機子有其他問題又不得不幫看看,為此影響了很多的工作
) h7 ]. M5 \  {0 p# t* M為此在6700出來后只指導了廣州的一位朋友硬件的升級方法,之后他做了以后沒有得到結果,本人知道一定要修改ROM才行,但花的時間太多就沒有再去研究,現在看到壇子上很多機友對這個東西有興趣,這兩天有時間就花了些時間看看* L& W9 g. P9 e1 [& {
1、首先,CPU要找到RAM必有AM的參數定義,對于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的芯片的結構是一樣的,只是尋址時地址一直上加,呵呵!當然另有內存空間大小的查找模塊
  }) H4 f% N! O/ C: b' O
5 ^8 l/ V( r+ J' i5 J, L4 I5 |' ^因為是Partition disabled,尋址時不可能找到下一個要用CS選擇的內存塊
; _  B! U/ s' }( Q7 f  d. n6 N9 y+ j4 @9 T  j
只能再查找ROM,在NK.EXE文件中找到再一次操作內存定義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 已經就為ENABLED,也就是說當尋址完當前的內存塊后可以能使用CS選擇下一個塊了,看來問題也不在這里
) D6 P. P$ N; g; t5 J9 R0 w4 p' c- x( S" I2 P" H! Z8 F% b: c
突然想起在升級XIP時發現XIP中有RAM的空間定義,在這里找到了它
9 C* o5 Q( F# N) K
; g* V) s4 G! H) @! Z7 |. P9 `8 {3 T9 ?
修改成為128M,刷機后發現沒有成功
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開發學習板http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1451&Page=1wangxinxin2010-11-18 9:34:36開發學習板簡介

   USB2.0芯片為何選擇CY7C68013:

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

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

     3. 內嵌增強型8051內核,沿用傳統8051開發方法,固件開發工具為KEIL C51。

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

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

       400K高速I2C接口;

       支持雙數據指針;

       8KB片內RAM,可存放數據和代碼

       五個復用數據端口PORTA,PORTB,PORTC,PORTD,PORTE;

       五個外部中斷源;

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

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

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

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

開發板特色:

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

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

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

     4. 專業技術支持,3年FX2產品開發經驗,包括USB2.0高速數據采集板,USB2.0同步數據采集板和高速圖像傳輸等,為客戶提供產品定制。

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

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

     7. 開發環境,已建立固件、驅動和應用程序開發環境,有產品發布實例,縮短客戶產品開發時間。

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

     9. 擴展IO,FX2功能引腳和CPLD IO通過排針引出,支持FX2的SLAVE FIFO和GPIF方式二次開發。

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

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

     12. 專業焊接,保證開發板質量。

開發板內容:

   項目 說明;

    硬件配置:

        5V/1A開關電源一個

        串口線1根

        USB A-B線一根

        USB芯片:CY7C68013-128AC

        I2C按鈕:4個

        I2C段數碼管: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選通、讀、寫、復位均CPLD的IO上,用戶可通過CPLD編程來靈活控制。

  軟件配置:   

       開發文檔 114頁中文開發文檔 中文開發板使用文檔

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

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

       控制傳輸實例

       批量傳輸實例bulkTest

       中斷傳輸方式實例intTest

       IO測試實例iotest

       VC應用源代碼 USB2.0速度測試實驗spendtest/testApp

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

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

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

       CPLD源代碼 FX2.V,采用ALTERA芯片,可學習CPLD編程

       驅動源代碼(DDK) 固件下載驅動,已構建VC開發環境

       FX2通用驅動,已構建VC開發環境,適用于WIN 98SE,2K和XP操作系統

       產品發布 基于批量傳輸實例,安裝文件dj.inf,固件下載驅動dj.sys,通用驅動ezusb.sys,測試應用程序bulktest.exe

  光盤內容:

       CYPRESS FX2開發包,

       GPIF開發包

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

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

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

       各種USB驅動開發電子書籍

       CY7C68013-128開發文檔V2.02. CY7C68013-128使用文檔V2.0

       產品發布實例

       固件和VC源代碼

       GPIF實例源代碼

       電路原理圖(PROTEL格式)

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


第一階段


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


第二階段


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


第三階段


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


第四階段



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

]]>
Arm-Linux 之 tslibhttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1449&Page=1wangxinxin2010-11-18 9:27:26
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
Ubuntu 9.10 下ARM開發板的NFS掛載http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1448&Page=1wangxinxin2010-11-18 9:24:44
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
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 定義用戶任務0的堆棧長度

OS_STK Main_Stack[TaskStkLengh]; //主任務堆棧

//任務1 OS_STK Task1_Stack[TaskStkLengh];//任務1堆棧

//任務2 OS_STK Task2_Stack[TaskStkLengh];//任務2堆棧

///任務3 OS_STK Task3_Stack[TaskStkLengh];//任務3堆棧

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

//任務1函數定義 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); //延時掛起 } }

//任務2函數定義 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); //延時掛起 } }

//任務3函數定義 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); //延時掛起 } }

//主任務的定義 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); } }

//主函數開始 int main() { //這里寫對目標初始化函數 OSInit(); //千萬不要在此處開放定時中斷,即調用TargetInit(); PINSEL1=0X00000000; //引腳設為GPIO功能 IO1DIR =0XFFFFFFFF; //引腳設為輸出模式 IO1SET =0Xffffffff; //引腳全部設為滅狀態 OSTaskCreate(Main_Task,(void *)0,&Main_Stack[TaskStkLengh-1],10); OSStart(); //此函數永遠不會返回 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. #_/ 【基本機能】?ヘルプウィンドウ機能拡張? より下に導入してください。
  8. #_/ 【裝備】?裝備拡張? より上に導入してください。
  9. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  10. #==============================================================================
  11. # ★ カスタマイズ項目 - Customize ★
  12. #==============================================================================
  13. module KGC
  14. module ExtendedEquipScene
  15. # ◆ パラメータ名
  16. VOCAB_PARAM = {
  17. :hit => "命中率", # 命中率
  18. :eva => "回避率", # 回避率
  19. :cri => "必殺率", # クリティカル率
  20. } # ← この } は消さないこと!
  21. # ◆ 裝備変更時に表示するパラメータ
  22. # 表示したい順に , で區切って記入。
  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 座標
  104. # y : ウィンドウの Y 座標
  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 座標
  132. # y : ウィンドウの Y 座標
  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. # ○ 公開インスタンス変數
  163. #--------------------------------------------------------------------------
  164. attr_writer :equip_type # 裝備タイプ
  165. #--------------------------------------------------------------------------
  166. # ● オブジェクト初期化
  167. # x : ウィンドウの X 座標
  168. # y : ウィンドウの Y 座標
  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. # ● ウィンドウ內容の作成
  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 座標
  227. # y : 描畫先 Y 座標
  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. # ● 裝備変更後の能力値設定
  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 座標
  280. # y : 描畫先 Y 座標
  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
]]>
如何才能學好單片機ARM一起討論交流下以便很好的學習!http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1445&Page=1wangxinxin2010-11-18 9:11:18如何才能學好單片機ARM一起討論下,
單片機可以分為8位,16位,32位機,就按生產的公司不同,側重點就不一樣,而且就算同是8位機,處理能力也有不同,你初學單片機我建議還是從51系列如8051或MCS51開始學,因為它比較簡單,容易入門。當然也可以直接從高檔的單片機開始學,如AVR或者ARM等目前非常流行的單片機開始,這就要看你自己是出于什么目的去學習了,
至于學什么語言,要看編譯器支持什么語言了,一般低端的單片機都支持匯編語言和C語言,但高檔的單片機還支持其他的語言,比如C++什么的,
如果你從51開始學習的話我個人認為你還是從匯編語言開始學,主要是看你的側重以及發展需要,不要求你匯編語言能立有多強,但至少人家寫個程序你應該能看懂就行,不然怎么做項目開發呢,而且有些什么需要用C語言與匯編語言嵌套使用,比如定時功能?當你的匯編語言有一定的基礎了之后,你就可以開始學習C了,當然直接學C也可以。
C語言的優越性是眾所周知的,它的執行效率高,但是具體執行每一條語句時間卻比較長約1ms(12M),還有C的可讀性很強,容易理解。 匯編語言他是比較精確,雖然學起來比較麻煩但是學好他還是有必要的,因為做一些準確性高的程序還是用匯編語言,
我的想法是:假如你想立竿見影的話,直接從C入手,假如你想成為單片機高手的話,從匯編開始。

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

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

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

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

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

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

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

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

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

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

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

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

十、Nvidia Tegra 2,一直以來,Tegra都是非常讓人期待的,就是外面吹的挺響,不見產品出來。現在終于有眉目了,萬利達即將上市的一款ZPad,就準備采用Tegra 2芯片。Tegra 2性能很強勁,內建ARM雙核Cortex A9處理器,主頻到1GHz,最高支持1GB內存,支持1080P的全高清視頻播放,多媒體方面增加了對Flash 10的支持,3D性能是Nvidia的強項就不用多說。不過大家要做好心理準備,Nvidia的東西是不會太便宜,估計終端的品牌價格會達到3K]]>
ARM Cortex-M3文件系統 源碼分析http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1442&Page=1wangxinxin2010-11-18 9:03:08一、概述
1、目的
在移植之前,先將源代碼大概的閱讀一遍,主要是了解文件系統的結構、各個函數的功能和接口、與移植
相關的代碼等等。
2、準備工作
在官方網站下載了0.07c版本的源代碼,利用記事本進行閱讀。
二、源代碼的結構
1、源代碼組成
   源代碼壓縮包解壓后,共兩個文件夾,doc是說明,src里就是代碼。src文件夾里共五個文件和一個文
件夾。文件夾是option,還有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。對比網上
的文章,版本已經不同了,已經沒有所謂的tff.c和tff.h了,估計現在都采用條件編譯解決這個問題了,
當然文件更少,可能編譯選項可能越復雜。
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代碼,這是個通用文件系統可以在各種介質
上使用。我們移植時針對具體存儲設備提供底層代碼。
  接下來做了版權聲明-可以自由使用和傳播。
  然后對版本的變遷做了說明。
3、源代碼閱讀次序
  先讀integer.h,了解所用的數據類型,然后是ff.h,了解文件系統所用的數據結構和各種函數聲明,然
后是diskio.h,了解與介質相關的數據結構和操作函數。再把ff.c和diskio.c兩個文件所實現的函數大致
掃描一遍。最后根據用戶應用層程序調用函數的次序仔細閱讀相關代碼。
三、源代碼閱讀
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)跟據這個中國應該是936.
打開option文件夾看一下。打開cc936.c文件,里面有一個很大的數組static const WCHAR uni2oem[] 。
根據英文說明,這個數組用于unicode碼和OEM碼之間的相互轉換。
接下來又有兩個函數ff_convert()和ff_wtoupper()具體執行碼型轉換和將字符轉換為大寫。

百度一下:看OEM碼什么意思。
unicode是一種雙字節字符編碼,無論中文還是英文,或者其他語言統一到2個字節。與現有的任何編碼(
ASCII,GB等)都不兼容。WindowsNT(2000)的內核即使用該編碼,所有數據進入內核前轉換成UNICODE,退
出內核后在轉換成版本相關的編碼(通常稱為OEM,在簡體中文版下即為GB).(百度所得)
繼續往下閱讀。
#define _USE_LFN 1   //這個估計是長文件名支持了,以前的0.06版本好像是不支持。
#define _MAX_LFN 255 //最長支持255個雙字節字符。
#define _FS_RPATH 0  //是否文件相對路徑選項。
/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,
/  f_chdrive function are available.  //有些函數會受影響。
/  Note that output of the f_readdir fnction is affected by this option. */
#define _FS_REENTRANT 0  //如果要支持文件系統可重入,必須加入幾個函數。
#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
接下來很大一部分都是與語言相關的因素,略過。
/* Character code support macros */ 三個宏判斷是否大寫、小寫、數字。
#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 */雙字節編碼相關的設定,暫時不理會它。
#if _MULTI_PARTITION         /* Multiple partition configuration */
//該變量定義為1時,支持一個磁盤的多個分區。
typedef struct _PARTITION {
       BYTE pd;     /* Physical drive# */
       BYTE pt;      /* Partition # (0-3) */
} PARTITION;
Extern  const  PARTITION Drives[];//如果支持分區,則聲明變量Drivers   
#define LD2PD(drv) (Drives[drv].pd)      /* 獲得磁盤對應的物理磁盤
#define LD2PT(drv) (Drives[drv].pt)       /*獲得磁盤對應的分區
#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  //一般扇區長度取512字節。
#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;             /*對應實際驅動號01--- */
       BYTE    csize;             /* 每個簇的扇區數目 */
先查一下簇的含義:應該是文件數據分配的基本單位。
       BYTE    n_fats;           /* 文件分配表的數目 */
FAT文件系統依次應該是:引導扇區、文件分配表兩個、根目錄區和數據區。
       BYTE    wflag;            /* win[] dirty flag (1:must be written back) */
//文件是否改動的標志,為1時要回寫。
       WORD  id;                 /* File system mount ID 文件系統加載ID*/
       WORD  n_rootdir;      /* 根目錄區目錄項的數目 */
#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) */
//文件需要回寫的標志
       DWORD      last_clust;      /* Last allocated cluster */
       DWORD      free_clust;      /* Number of free clusters */
       DWORD      fsi_sector;      /* fsinfo sector */
#endif
#if _FS_RPATH
       DWORD      cdir;              /* 使用相對路徑,則要存儲文件系統當前目錄
#endif
       DWORD      sects_fat;       /*文件分配表占用的扇區
       DWORD      max_clust;     /* 最大簇數
       DWORD      fatbase;  /*文件分配表開始扇區
       DWORD      dirbase;  /*  如果是FAT32,根目錄開始扇區需要首先得到。
       DWORD      database;       /* 數據區開始扇區
       DWORD      winsect;  /* Current sector appearing in the win[] */
//目前的扇區在win[]里面,這個win[]數組暫時還不知道含義。
       BYTE    win[_MAX_SS];/* Disk access window for Directory/FAT */
//這是一個win[512]數組,存儲著一個扇區,好像作為扇區緩沖使用。
} FATFS;

typedef struct _DIR_ {
       FATFS* fs;/* Pointer to the owner file system object */指向相應文件系統對象。
       WORD  id;                 /* 文件系統加載ID*/
       WORD  index;     /* Current read/write index number */目前讀寫索引代碼
       DWORD      sclust;     /* Table start cluster (0:Static table) */文件數據區開始簇
       DWORD      clust;             /* Current cluster */ 目前處理的簇
       DWORD      sect;              /* Current sector */ 目前簇里對應的扇區
       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 */文件狀態標志
       BYTE    csect;            /* Sector address in the cluster */扇區偏移
       DWORD      fptr;        /* File R/W pointer */ 讀寫指針
       DWORD      fsize;              /* File size */
       DWORD      org_clust;      /* File start cluster */文件開始簇
       DWORD      curr_clust;     /* Current cluster */當前簇
       DWORD      dsect;            /* Current data sector */文件當前扇區
#if !_FS_READONLY
       DWORD      dir_sect; /* Sector containing the directory entry */該文件目錄項對應所在的扇區
       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; 這個結構主要描述文件的狀態信息,包括文件名13個字符(8+.+3+\0)、屬性、修改時間等。
接下來是函數的定義,先大概瀏覽一遍。
FRESULT f_mount (BYTE, FATFS*);    //加載文件系統,BYTE參數是ID,后一個是文件系統定義。
FRESULT f_open (FIL*, const XCHAR*, BYTE);//打開文件,第一個參數是文件信息結構,第二個參數是文件名,第三是文件打開模式
FRESULT f_read (FIL*, void*, UINT, UINT*);   //文件讀取函數,參數1為文件對象(文件打開函數中得到),參數2為文件讀取緩沖區,參數3為讀取的字節數,參數4意義不清晰,等讀到源代碼就清楚了。
FRESULT f_write (FIL*, const void*, UINT, UINT*);//寫文件,參數跟讀差不多
FRESULT f_lseek (FIL*, DWORD); //移動文件的讀寫指針,參數2應該是移動的數目。
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 */將緩沖區數據寫回文件
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 */ 這個函數還要提供一個回調函數。
FRESULT f_mkfs (BYTE, BYTE, WORD);          /* Create a file system on the drive */
FRESULT f_chdir (const XCHAR*);      /* Change current directory */改變當前目錄
FRESULT f_chdrive (BYTE);           /* Change current drive */
應該說基本能明白這些函數用于干什么。]]>
ARM、DSP、FPGA的技術特點和區別http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1441&Page=1wangxinxin2010-11-18 8:56:19嵌入式開發領域,ARM是一款非常受歡迎的微處理器,其市場覆蓋率極高,DSP和FPGA則是作為嵌入式
開發的協處理器,協助微處理器更好的實現產品功能。那三者的技術特點以及區別是什么呢?下文就此
問題略做了總結。
  ARM(Advanced RISC Machines)是微處理器行業的一家知名企業,設計了大量高性能、廉價、耗能
低的RISC處理器、相關技術及軟件。
  ARM架構是面向低預算市場設計的第一款RISC微處理器,基本是32位單片機的行業標準,它提供一系
列內核、體系擴展、微處理器和系統芯片方案,四個功 能模塊可供生產廠商根據不同用戶的要求來配置
生產。由于所有產品均采用一個通用的軟件體系,所以相同的軟件可在所有產品中運行。目前ARM在手持
設備市場 占有90以上的份額,可以有效地縮短應用程序開發與測試的時間,也降低了研發費用。
DSP(digital singnal processor)是一種獨特的微處理器,有自己的完整指令系統,是以數字信號來
處理大量信息的器件。一個數字信號處理器在一塊不大的芯片內包括有控制單元、運算單元、各種寄存
器以及一定數量的存儲單元等等,在其外圍還可以連接若干存儲器, 并可以與一定數量的外部設備互相
通信,有軟、硬件的全面功能,本身就是一個微型計算機。DSP采用的是哈佛設計,即數據總線和地址總
線分開,使程序和數據 分別存儲在兩個分開的空間,允許取指令和執行指令完全重疊。也就是說在執行
上一條指令的同時就可取出下一條指令,并進行譯碼,這大大的提高了微處理器的速 度 。另外還允許
在程序空間和數據空間之間進行傳輸,因為增加了器件的靈活性。其工作原理是接收模擬信號,轉換為0
或1的數字信號,再對數字信號進行修改、刪 除、強化,并在其他系統芯片中把數字數據解譯回模擬數
據或實際環境格式。它不僅具有可編程性,而且其實時運行速度可達每秒數以千萬條復雜指令程序,遠
遠超 過通用微處理器,是數字化電子世界中日益重要的電腦芯片。它的強大數據處理能力和高運行速度
,是最值得稱道的兩大特色。由于它運算能力很強,速度很快,體 積很小,而且采用軟件編程具有高度
的靈活性,因此為從事各種復雜的應用提供了一條有效途徑。根據數字信號處理的要求,DSP芯片一般具
有如下主要特點:
(1)在一個指令周期內可完成一次乘法和一次加法;
(2)程序和數據空間分開,可以同時訪問指令和數據;
(3)片內具有快速RAM,通常可通過獨立的數據總線在兩塊中同時訪問;
(4)具有低開銷或無開銷循環及跳轉的硬件支持;
(5)快速的中斷處理和硬件I/O支持;
(6)具有在單周期內操作的多個硬件地址產生器;
(7)可以并行執行多個操作;
(8)支持流水線操作,使取指、譯碼和執行等操作可以重疊執行。
當然,與通用微處理器相比,DSP芯片的其他通用功能相對較弱些。
   FPGA是英文Field Programmable Gate Array(現場可編程門陣列)的縮寫,它是在PAL、GAL、PLD
等可編程器件的基礎上進一步發展的產物,是專用集成電路(ASIC)中集成度最高的 一種。FPGA采用了
邏輯單元陣列LCA(Logic Cell Array)這樣一個新概念,內部包括可配置邏輯模塊CLB(Configurable
Logic Block)、輸出輸入模塊IOB(Input Output Block)和內部連線(Interconnect)三個部分。用
戶可對FPGA內部的邏輯模塊和I/O模塊重新配置,以實現用戶的邏輯。它還具有靜態可 重復編程和動態
在系統重構的特性,使得硬件的功能可以像軟件一樣通過編程來修改。作為專用集成電路(ASIC)領域
中的一種半定制電路,FPGA既解決了 定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。
可以毫不夸張的講,FPGA能完成任何數字器件的功能,上至高性能CPU,下至簡單的74電 路,都可以用
FPGA來實現。FPGA如同一張白紙或是一堆積木,工程師可以通過傳統的原理圖輸入法,或是硬件描述語
言自由的設計一個數字系統。通過軟件 仿真,我們可以事先驗證設計的正確性。在PCB完成以后,還可
以利用FPGA的在線修改能力,隨時修改設計而不必改動硬件電路。使用FPGA來開發數字電 路,可以大大
縮短設計時間,減少PCB面積,提高系統的可靠性。FPGA是由存放在片內RAM中的程序來設置其工作狀態
的,因此工作時需要對片內的RAM 進行編程。用戶可以根據不同的配置模式,采用不同的編程方式。加
電時,FPGA芯片將EPROM中數據讀入片內編程RAM中,配置完成后,FPGA進入工 作狀態。掉電后,FPGA恢
復成白片,內部邏輯關系消失,因此,FPGA能夠反復使用。FPGA的編程無須專用的FPGA編程器,只須用
通用的 EPROM、PROM編程器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片FPGA,
不同的編程數據,可以產生不同的電路功 能。因此,FPGA的使用非常靈活。可以說,FPGA芯片是小批量
系統提高系統集成度、可靠性的最佳選擇之一。目前FPGA的品種很多,有XILINX的 XC系列、TI公司的
TPC系列、ALTERA公司的FIEX系列等。
  ARM作為嵌入式開發最常用的處理器,是嵌入式工程師必須掌握的一門知識。ARM體系架構在嵌入式
學院<嵌入式工程師職業培訓班>的二期課程中將會結合嵌入式linux應用開發、嵌入式linux系統移植進
行詳細介紹,另外華清遠見的短期培訓業務中也分別有針對ARM、DSP、FPGA的培訓課程。
 區別是什么?:ARM具有比較強的事務管理功能,可以用來跑界面以及應用程序等,其優勢主要體現在
控制方面,而DSP主要是用來計算的,比如進行加密解 密、調制解調等,優勢是強大的數據處理能力和
較高的運行速度。FPGA可以用VHDL或verilogHDL來編程,靈活性強,由于能夠進行編程、除錯、 再編程
和重復操作,因此可以充分地進行設計開發和驗證。當電路有少量改動時,更能顯示出FPGA的優勢,其
現場編程能力可以延長產品在市場上的壽命,而這 種能力可以用來進行系統升級或除錯。
]]>
ARM JTAG (Joint Test Action Group)仿真器電路討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1440&Page=1wangxinxin2010-11-18 8:55:07以下是我在實踐中的一些積累,發現這點是因為我在嘗試用對SAMSUNG S3C44B0 JTAG適用的編程板電路給SAMSUNG的另一款ARM9內核MPU S3C2440 JTAG編程時出現問題,查閱了一些資料后最終解決。希望這些對那些在自制ARM JTAG編程器上遇到困難的朋友一點幫助。

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


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

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

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

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

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

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

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

    在JTAG相關搜索里,發現網友李杰給出的一個JTAG編程板電路,如圖五。

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

 


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

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


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

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

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

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

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

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

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

    在JTAG相關搜索里,發現網友李杰給出的一個JTAG編程板電路,如圖五。

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

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

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

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

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

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

嵌入式Java虛擬機的設計限制

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

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

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

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

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

動態編譯技術

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

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

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

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

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

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

硬件加速

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

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

圖2:采用ARM處理器的Java應用嵌入式系統架構。

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

硬件架構擴展和Jazelle DBX技術

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

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

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

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

Jazelle DBX技術增加了一條新的“Branch-to-Java”指令來進入Java狀態。此指令支持條件執行,先檢查條件標志,如果條件滿足,處理器進入Java狀態,跳轉到指定目標地址,開始執行Java字節碼。

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

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

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

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

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

Jazelle DBX技術的性能

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

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

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

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

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

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

本文小結

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

通過融合各種新特性的加入,ARM將在未來架構發展中繼續支持Jazelle DBX以及后續的新技術。Jazlle技術和相應的JTEK軟件包將更廣泛的促進Java在嵌入式設備上的應用,更多更新的移動Java應用將隨之涌現。

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

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

]]>
基于ARM的RFID閱讀器設計http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=14&ID=1435&Page=1wangxinxin2010-11-18 8:48:26<P>  RFID技術可識別高速運動物體并可同時識別多個標簽,操作快捷方便<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">其應用范圍十分廣泛,主要有商品零售、商品防偽、交通運輸、物流倉儲、安全管理、醫療衛生、圖書檔案和國防軍事等<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  RFID系統由三部分組成:1. 標簽(Tag,即射頻卡),由耦合元件及芯片組成,標簽含有內置天線,用于和射頻天線間進行通信;2. 閱讀器,讀取(在讀寫卡中還可以寫入)標簽信息的設備;3. 天線,在標簽和讀取器間傳遞射頻信號<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本文主要介紹基于ARM,工作頻率在13.56MHz的RFID閱讀器設計方案<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> <STRONG> 1系統硬件設計</STRONG></P>
<P>  1.1 系統主要芯片介紹</P>
<P>  本設計方案的兩個主要芯片是LPC2212和MF RC500<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">LPC2212功耗低,性能高,接口資源豐富,可以在RFID閱讀器的基礎上進行其它功能的擴展,實現一個多功能應用系統<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  MF RC500是PHILIPS公司生產的應用于13.56MHz非接觸式通信中高集成讀卡IC系列中的一員<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">MF RC500支持ISO14443A所有的層,內部的發送器部分不需要增加有源電路就能夠直接驅動近操作距離的天線(可達100mm);接收器部分提供一個堅固而有效的解調和解碼電路用于ISO14443A兼容的應答器信號;數字部分處理ISO14443A幀和錯誤檢測奇偶CRC,此外它還支持快速CRYPTO1加密算法用于驗證MIFARE系列產品<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  1.2 系統總體設計</P>
<P>  系統從功能上主要分為4大模塊:控制模塊、發送接收數據模塊、串行通信模塊和顯示模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">各模塊組成的系統總框圖如圖1所示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  控制模塊主要由微控制器LPC2212和晶振組成,負責整個系統的控制工作<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  發送接收數據模塊主要由MF RC500、晶振和天線組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">MF RC500分為模擬部分和數字部分<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">模擬部分負責對射頻卡的發送接收操作,發送主要完成驅動天線,提供13.56MHz的能量載波并根據寄存器的設置對發送數據進行調制;接收主要完成對射頻卡發送的信號進行檢測和解調并根據寄存器的設定進行處理<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">數字部分則通過并口和中斷與微控制器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標準采用的9芯接口和電平轉換電路MAX232A組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本模塊負責閱讀器與PC機通訊,可進行程序下載,射頻卡信息修改等<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="系統總框圖"></P>
<P align=center>圖1 系統總框圖</P>
<P>  顯示模塊主要由低復用率的通用液晶(LCD)驅動器PCF8562和LCD屏組成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">PCF8562與微控制器LPC2212可以通過兩線雙向的I2C總線通信,當這兩條線連接到器件的輸出級時必須通過上拉電阻連接到正電源<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">顯示模塊負責卡片信息顯示<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> <STRONG> 2 系統軟件設計</STRONG></P>
<P>  軟件設計包括三個模塊:系統初始化模塊、射頻卡與讀寫器通信模塊和LCD顯示模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">下面詳細介紹以上模塊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  2.1 系統初始化模塊</P>
<P>  為了使系統能夠正常運行,必須在系統復位時對系統進行初始化工作<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字節存儲中斷向量表<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">為了實現LPC2212在不同操作模式下對中斷的使用,必須對LPC2212中Flash的Boot Block塊和SRAM空間的一小部分REMAP<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">另外,需要對各種模式的堆棧進行初始化<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  LPC2212振蕩器工作在振蕩模式,外部晶體振蕩頻率為20-25MHz,通過內部PLL電路調整時鐘,使系統運行速度更快<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">程序首先使能PLL但不連接PLL,然后設置外設時鐘與系統時鐘的分頻比,接著設置PLL的乘因子和除因子<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">設置完成后,把數據正確寫入硬件,并等待PLL跟蹤完成<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">最后,使能PLL并使PLL連上系統<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  串口是讀卡器與PC機通信端口,在使用前須設置串口波特率、接收和發送數據字符格式和初始化FIFO(先進先出隊列)<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  串口和RC500都是基于IRQ中斷,使用前,須對LPC2212中斷選擇寄存器進行配置,把串口和RC500的中斷請求分配為IRQ模式<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  2.2 射頻卡與讀寫器通信模塊</P>
<P>  本系統采用M1(MIFARE 1)智能卡,本卡自帶天線,內含加密控制邏輯和通訊邏輯電路,M1分為16個扇區,每個扇區為4塊,每塊16個字節,以塊為存取單位,每個扇區有獨立的一組密碼及訪問控制,可一卡多用<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>  復位應答(Answer to request):M1射頻卡的通訊協議和通訊波特率是定義好的,當有卡片進入讀寫器的操作范圍時,讀寫器以特定的協議與它通訊,從而確定該卡是否為M1射頻卡,即驗證卡片的卡型<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  防沖突機制 (Anti-collision Loop):當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作,未選中的則處于空閑模式等待下一次選卡,該過程會返回被選卡的序列號<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):選定要處理的卡片之后,讀寫器就確定要訪問的扇區號,并對該扇區密碼進行密碼校驗,在三次相互認證之后就可以通過加密流進行通訊<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">(在選擇另一扇區時,則必須進行另一扇區密碼校驗<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>  對數據塊的操作: 讀 (Read):讀一個塊;寫 (Write):寫&nbsp;一個塊;加(Increment):對數值塊進行加值;減(Decrement):對數值塊進行減值;存儲(Restore):將塊中的內容存到數據寄存器中;傳輸(Transfer):將數據寄存器中的內容寫入塊中;中止(Halt):將卡置于暫停工作狀態<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">用戶可以顯示專用符號、數字、漢字和圖形<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">顯示模塊主要分為兩部分:第一部分是根據閱讀器從射頻卡讀入的信息確定要顯示的內容,顯示圖形時,則要計算顯示坐標;第二部分是根據系統所采用的LCD建立專用符號庫、漢字庫,顯示圖形時,則要把第一部分得到的坐標轉化為LCD上的顯示坐標<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P>  <STRONG>3 改進的防沖突算法</STRONG></P>
<P>  根據ISO14443協議,M1型卡傳統的防沖突算法是動態二進制檢索樹算法<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">它首先利用MANCH ESTER編碼“沒有變化”的狀態來檢測碰撞位,然后把碰撞位設為二進制“1”,用SELECT命令發送碰撞前接收的部分卡片序列號和碰撞位,如果卡片開頭部分序列號與其相同,則做出應答,不相同則沒有響應<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">以此來縮小卡片范圍,最終達到無碰撞<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>  但是,傳統的防碰撞方法要求所有應答器準確同步,應答器必須準確地在同一時刻開始傳輸他們的序列號<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">然而,在實際使用中,應答器由用戶控制,可能產生異步發送數據,如果仍然采用傳統防沖突算法,有可能導致死循環,如圖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="尋卡死循環"></P>
<P align=center><BR>圖4 尋卡死循環</P>
<P>  為了解決死循環問題,在傳統算法的基礎上設置了一個記錄碰撞位數的變量,如果第二次碰撞位數和第一次相等,則把SELECT發送的部分卡號增加一位,設為二進制數“1”發送出去<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">如果在規定時間內沒有收到應答,則把增加位設為“0”發送出去<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">可以有效預防由于應答器異步導致的死循環問題<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">針對圖4的改進流程如圖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="改進的防沖突流程"><BR>圖5 改進的防沖突流程</P>
<P>  4 結束語</P>
<P>  本文給出了一個基于ARM的RFID閱讀器軟硬件框架,實現了對射頻卡的基本讀寫等功能<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">閱讀器采用的ARM微處理器,接口資源豐富,還有很多空閑接口,可在閱讀器的基礎上進行擴展,例如,可利用ARM的其它接口驅動電機,利用射頻卡對電機實現控制,只有卡內信息正確,系統才能向電機發出控制命令,從而在硬件上增加了安全性<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">另外,改進的防沖突算法也使讀卡器在應答器異步發送數據的情況下有效的避免死鎖<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done">本文對實現帶有RFID功能的多功能系統有一定的參考價值和實用價值<IMG src="http://www.21eic.com/ico/juhao.jpg" twffan="done"></P>
<P> 參考文獻:</P>
<P>  [1]游戰清<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">李蘇劍等.無限射頻識別技術(RFID)理論與應用[M].電子工業出版社<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應用系統開發詳解—基于S3C14510B系統設計[M].清華大學出版社<IMG src="http://www.21eic.com/ico/douhao.jpg" twffan="done">2003.</P>
<P>  [3]周立功等.ARM微控制器基礎與實戰[M].北京航空航天大學出版社<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> ]]>
圖文并茂講解:如何實現ARM固件的遠程升級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
圖片點擊可在新窗口打開查看 ]]>
主站蜘蛛池模板: 在线观看片成人免费视频 | 国产精品亚洲精品日韩已方 | 波多野结衣在线观看高清免费资源 | 久久91亚洲精品中文字幕奶水 | 自拍自录videosfree自拍自录 | 国产欧美曰韩一区二区三区 | 久久免费在线视频 | 高清在线精品一区二区 | 国产一级视频免费 | 日韩亚洲欧美理论片 | a毛片久久免费观看 | 九九九九精品视频在线播放 | 一级毛片免费观看 | 怡红院成人网 | 色婷婷国产精品欧美毛片 | 成人区精品一区二区不卡亚洲 | 国产精品午夜性视频 | 131的美女午夜爱爱爽爽视频 | 欧美黑人xxxxxxxxxx | 亚洲欧美在线观看 | 一级毛片免费在线播放 | 亚洲综合一区二区不卡 | 爽爽免费视频 | 国内精品视频成人一区二区 | 亚洲欧洲日韩在线 | 欧美成人高清免费大片观看 | 久草资源福利 | 免费视频精品一区二区三区 | 成人免费a视频 | 成人一区视频 | 日韩精品一区二区三区视频 | 午夜三级a三级三点在线观看 | 91人人视频国产香蕉 | 欧美成人免费全部观看天天性色 | 国产成人手机视频 | 久久久久久青草大香综合精品 | 亚洲精品一区二区三区在线看 | 亚洲精品在线网 | 国产精品毛片无码 | 在线观看精品视频网站www | 国产一级片播放 |