久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    44b0引導注釋(一)

     ccbupt 2009-05-16

    44b0引導注釋(一) 

     

    *******************************************************

    ; * NAME : 44BINIT.S *

    ; * Version : 10.JAn.2003 *

    ; * Description: *

    ; * C start up codes *

    ; * Configure memory, Initialize ISR ,stacks *

    ; * Initialize C-variables *

    ; * Fill zeros into zero-initialized C-variables *

    ; *******************************************************

    GET option.s ;相當于c語言中的#include "option.s"

    GET memcfg.s

    ;Interrupt Control

    ;聲明一些符號常量,這些符號常量和地址相應寄存器的地址對應

    INTPND EQU 0x01e00004 ;指示中斷請求狀態寄存器 每一位代變一種中斷請求具體表一種中斷請參考44b0 spec

    INTMOD EQU 0x01e00008 ;中斷模式寄存器 有兩種中斷模式對應位為1代表fip mode 0代表riq mode

    INTMSK EQU 0x01e0000c ;確定哪個中斷源被屏蔽屏蔽的中斷源將不被服務

    I_ISPR EQU 0x01e00020 ;中斷服務掛起寄存器

    I_CMST EQU 0x01e0001c ;當前主寄存器irq優先級

    ;Watchdog timer

    WTCON EQU 0x01d30000 ;看門狗定時器控制寄存器

    ;Clock Controller

    PLLCON EQU 0x01d80000 ;pll控制寄存器

    CLKCON EQU 0x01d80004 ;時鐘控制寄存器

    LOCKTIME EQU 0x01d8000c ;鎖定時間計數值寄存器

    ;Memory Controller

    REFRESH EQU 0x01c80024 ;Dram/sdram刷新控制寄存器

    ;下面是對arm處理器模式寄存器對應值的常數定義,arm處理器中有一個CPSR程序狀態寄存器它的后五位決定目前的處理器模式

    ;Pre-defined constants

    USERMODE EQU 0x10 ;CPSR后5位為10000設定為用戶模式

    FIQMODE EQU 0x11 ;10001FIQ模式

    IRQMODE EQU 0x12 ;10010IRQ模式

    SVCMODE EQU 0x13 ;10011管理模式

    ABORTMODE EQU 0x17 ;10111中止模式

    UNDEFMODE EQU 0x1b ;11011未定義

    MODEMASK EQU 0x1f ;11111系統模式

    NOINT EQU 0xc0 ;

    ;check if tasm.exe is used.

    ;arm處理器有兩種工作狀態 1.arm:32位 這種工作狀態下執行字對準的arm指令 2.Thumb:16位這種工作狀態執行半字對準的Thumb指令

    ;因為處理器分為16位 32位兩種工作狀態程序的編譯器也是分16位和32兩種編譯方式所以下面的程序用于根據處理器工作狀態確定編譯器編譯方式

    ;code16偽指令指示匯編編譯器后面的指令為16位的thumb指令

    ;code32偽指令指示匯編編譯器后面的指令為32位的arm指令

    ;這段是為了統一目前的處理器工作狀態和軟件編譯方式(16位編譯環境使用tasm.exe譯)

    ;其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM狀態。這些都是偽操作

    ;這段我理解為設定THUMCODE的值,然后確定,用戶的程序是在ARM狀態還是THUM狀態。不過不管THUMCODE 

    ;何值下面代碼都是ARM狀態

    GBLL THUMBCODE ;設置一個全局變量

    [ {CONFIG} = 16 ;if config==16 這里表示你的目前處于領先地16位編譯方式

    THUMBCODE SETL {TRUE} ;設置THUMBCODE 為 true

    CODE32 ;轉入32位編譯模式

    ;else

    THUMBCODE SETL {FALSE} ;設置THUMBCODE 為 false

    ]

    [ THUMBCODE ;if THUMBCODE==TRUE

    CODE32 ;for start-up code for Thumb mode;轉入32位編譯方式

    ]

    ;注意下面這段程序是個宏定義很多人對這段程序不理解我再次強調這是一個宏定義所以大家要注意了下面包含的HandlerXXX HANDLER HandleXXX將都被下面這段程序展開

    ;這段程序用于把中斷服務程序的首地址裝載到pc中,有人稱之為“加載程序”。

    ;本初始化程序定義了一個數據區(在文件最后),34個字空間,存放相應中斷服務程序的首地址。每個字空間都有一個標號,以Handle***命名。

    ;在向量中斷模式下使用“加載程序”來執行中斷服務程序。

    ;這里就必須講一下向量中斷模式和非向量中斷模式的概念

    ;向量中斷模式是當cpu讀取位于0x18處的IRQ中斷指令的時候,系統自動讀取對應于該中斷源確定地址上的指令取代0x18處的指令,通過跳轉指令系統就直接跳轉到對應地址

    ;函數中 節省了中斷處理時間提高了中斷處理速度標 例如 ADC中斷的向量地址為0xC0,則在0xC0處放如下代碼:ldr PC,=HandlerADC 當ADC中斷產生的時候系統會

    ;自動跳轉到HandlerADC函數中

    ;非向量中斷模式處理方式是一種傳統的中斷處理方法,當系統產生中斷的時候,系統將interrupt pending寄存器中對應標志位置位然后跳轉到位于0x18處的統一中斷

    ;函數中 該函數通過讀取interrupt pending寄存器中對應標志位來判斷中斷源并根據優先級關系再跳到對應中斷源的處理代碼中

    MACRO

    $HandlerLabel HANDLER $HandleLabel

    $HandlerLabel

    sub sp,sp,#4 ;decrement sp(to store jump address)

    stmfd sp!,{r0} ;PUSH the work register to stack

    ;將要使用的r0寄存器入棧

    ldr r0,=$HandleLabel;load the address of HandleXXX to r0

    ldr r0,[r0] ;

    str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

    ;將對應的中斷函數首地址入棧

    ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

    ;將中斷函數首地址出棧 放入程序指針中 系統將跳轉到對應中斷處理函數

    MEND

    ;一個arm由RO,RW,ZI三個斷組成其中RO為代碼段,RW是已經初始化的全局變量,ZI是未初始化的全局變量(對于GNU工具對應的概念是TEXT ,DATA,BSS)bootloader

    ;bootloader要將RW段復制到ram中并將ZI段清零 編譯器使用下列段來記錄各段的起始和結束地址

    ; |Image$$RO$$Base| ; RO段起始地址

    ; |Image$$RO$$Limit| ; RO段結束地址加1

    ; |Image$$RW$$Base| ; RW段起始地址

    ; |Image$$RW$$Limit| ; RW段結束地址加1

    ; |Image$$ZI$$Base| ; ZI段起始地址

    ; |Image$$ZI$$Limit| ; ZI段結束地址加1

    ;這些標號的值是通過編譯器的設定來確定的如編譯軟件中對ro-base和rw-base的設定,例如 ro-base=0xc000000 rw-base=0xc5f0000

    IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

    IMPORT |Image$$RW$$Base| ; Base of RAM to initialise

    IMPORT |Image$$ZI$$Base| ; Base and limit of area

    IMPORT |Image$$ZI$$Limit| ; to zero initialise

    IMPORT Main ; The main entry of mon program

    ;下面為代碼段

    AREA Init,CODE,READONLY

    ;異常中斷矢量表(每個表項占4個字節)下面是中斷向量表一旦系統運行時有中斷發生即使移植了操作系統 如linux 處理器已經把控制權交給了操作系統一旦發生中斷處理器還是會跳轉到從0x0開始

    ;中斷向量表中某個中斷表項(依據中斷類型)開始執行

    ;具體中斷向量布局請參考s3c44b0 spec 例如 adc中斷向量為 0x000000c0下面對應表中第49項位置向量地址0x0+4*(49-1)=0x000000c0

    ENTRY

    ;扳子上電和復位后 程序開始從位于0x0處開始執行硬件剛剛上電復位后程序從這里開始執行跳轉到標號為ResetHandler處執行

    ;與FLASH上地址一一對應

    b ResetHandler ;for debug 0x00000000

    b HandlerUndef ;handlerUndef 0x00000004

    b HandlerSWI ;SWI interrupt handler 0x00000008

    b HandlerPabort ;handlerPAbort 0x0000000c

    b HandlerDabort ;handlerDAbort 0x00000010

    b . ;handlerReserved 0x00000014

    b HandlerIRQ ;0x00000018

    b HandlerFIQ

    ;***IMPORTANT NOTE***

    ;If the H/W vectored interrutp mode is enabled, The above two instructions should

    ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controler.

    ; b HandlerIRQ -> subs pc,lr,#4

    ; b HandlerIRQ -> subs pc,lr,#4

    VECTOR_BRANCH ;與FLASH上地址一一對應

    ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table

    ldr pc,=HandlerEINT1 ;

    ldr pc,=HandlerEINT2 ;

    ldr pc,=HandlerEINT3 ;

    ldr pc,=HandlerEINT4567 ;

    ldr pc,=HandlerTICK ;mGA

    b .

    b .

    ldr pc,=HandlerZDMA0 ;mGB

    ldr pc,=HandlerZDMA1 ;

    ldr pc,=HandlerBDMA0 ;

    ldr pc,=HandlerBDMA1 ;

    ldr pc,=HandlerWDT ;

    ldr pc,=HandlerUERR01 ;mGB

    b .

    b .

    ldr pc,=HandlerTIMER0 ;mGC

    ldr pc,=HandlerTIMER1 ;

    ldr pc,=HandlerTIMER2 ;

    ldr pc,=HandlerTIMER3 ;

    ldr pc,=HandlerTIMER4 ;

    ldr pc,=HandlerTIMER5 ;mGC

    b .

    b .

    ldr pc,=HandlerURXD0 ;mGD

    ldr pc,=HandlerURXD1 ;

    ldr pc,=HandlerIIC ;

    ldr pc,=HandlerSIO ;

    ldr pc,=HandlerUTXD0 ;

    ldr pc,=HandlerUTXD1 ;mGD

    b .

    b .

    ldr pc,=HandlerRTC ;mGKA

    b . ;

    b . ;

    b . ;

    b . ;

    b . ;mGKA

    b .

    b .

    ldr pc,=HandlerADC ;mGKB

    b . ;

    b . ;

    b . ;

    b . ;

    b . ;mGKB

    b .

    b .

    ;0xe0=EnterPWDN

    ldr pc,=EnterPWDN

    LTORG

    ;下面是具體的中斷處理函數跳轉的宏,通過上面的$HandlerLabel的宏定義展開后跳轉到對應的中斷處理函數(對于向量中斷)

    HandlerFIQ HANDLER HandleFIQ

    HandlerIRQ HANDLER HandleIRQ

    HandlerUndef HANDLER HandleUndef

    HandlerSWI HANDLER HandleSWI

    HandlerDabort HANDLER HandleDabort

    HandlerPabort HANDLER HandlePabort

    HandlerADC HANDLER HandleADC

    HandlerRTC HANDLER HandleRTC

    HandlerUTXD1 HANDLER HandleUTXD1

    HandlerUTXD0 HANDLER HandleUTXD0

    HandlerSIO HANDLER HandleSIO

    HandlerIIC HANDLER HandleIIC

    HandlerURXD1 HANDLER HandleURXD1

    HandlerURXD0 HANDLER HandleURXD0

    HandlerTIMER5 HANDLER HandleTIMER5

    HandlerTIMER4 HANDLER HandleTIMER4

    HandlerTIMER3 HANDLER HandleTIMER3

    HandlerTIMER2 HANDLER HandleTIMER2

    HandlerTIMER1 HANDLER HandleTIMER1

    HandlerTIMER0 HANDLER HandleTIMER0

    HandlerUERR01 HANDLER HandleUERR01

    HandlerWDT HANDLER HandleWDT

    HandlerBDMA1 HANDLER HandleBDMA1

    HandlerBDMA0 HANDLER HandleBDMA0

    HandlerZDMA1 HANDLER HandleZDMA1

    HandlerZDMA0 HANDLER HandleZDMA0

    HandlerTICK HANDLER HandleTICK

    HandlerEINT4567 HANDLER HandleEINT4567

    HandlerEINT3 HANDLER HandleEINT3

    HandlerEINT2 HANDLER HandleEINT2

    HandlerEINT1 HANDLER HandleEINT1

    HandlerEINT0 HANDLER HandleEINT0

    ;One of the following two routines can be used for non-vectored interrupt.

    ;這段是沒有使用非向量模式下如何裝載中斷子程序,因為44B0有30個中斷源,所以需要程序處理以確定調用那個中斷程序

    ;0,1是局部標號,%B是向后搜索局部標號, %F是向前搜索局部標號 。都是偽操作

    ;I_ISPR寄存器各位表明發生了應該調用那個中斷子程序。只能1位置位,其它位為0,比如說串口1發送中斷發生,這時I_ISPR的

    ;值為0X04,ldr r9,=I_ISPR

    ;ldr r9,[r9] 兩條指令后,r9的內容為0X4 ,

    ;movs r9,r9,lsr #1 r9內容右移一位

    ;bcs %F1 判斷是否把置位是否轉移到C位,

    ;add r8,r8,#4 如果沒有的R8加4

    ;如果r9內容為0x04 需要右移3次 ,之后r8的內容為8 然后HandleADC的地址加上r8的值就是串口1發送中斷的地址,這個地址的內容是中斷子程序的地址

    IsrIRQ ;using I_ISPR register.

    sub sp,sp,#4 ;reserved for PC 預留給PC,以便下面的程序中把中斷函數入口放入此位置,出棧給PC

    stmfd sp!,{r8-r9}

    ;IMPORTANT CAUTION

    ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.

    ldr r9,=I_ISPR

    ldr r9,[r9]

    mov r8,#0x0

    0

    movs r9,r9,lsr #1

    bcs %F1 ;檢測I_ISPR哪位被置1  %F1表示向前跳轉到1標識

    add r8,r8,#4

    b %B0   ;向后跳轉到標號1 

    ; 這段構成一個循環檢測I_ISPR哪位被置一并計算出中斷入口地址的偏移量

    1

    ldr r9,=HandleADC

    add r9,r9,r8 ;計算出中斷函數入口地址

    ldr r9,[r9]

    str r9,[sp,#8] ;將中斷函數入口地址放入預留堆棧

    ldmfd sp!,{r8-r9,pc} ;將中斷入口函數地址出棧給PC

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日韩丝袜欧美人妻制服| 久久久无码精品亚洲日韩按摩| 国内精品无码一区二区三区| 亚洲国产成人久久久网站| 亚洲精品天堂一区二区| 女人十八毛片A级十八女人| 熟妇人妻无码中文字幕| 亚洲熟妇自偷自拍另类| 天天日天天谢天天视2019天干| 亚洲国产精品久久久天堂麻豆宅男| 久久久久久久波多野结衣高潮| 国产精品天干天干综合网| 2020国产欧洲精品网站| 国产成人午夜福利在线播放| 日本高清乱理伦片中文字幕| 男人扒开女人腿桶到爽免费 | 亚洲欧美日韩国产综合一区二区 | 无码国产精品一区二区免费式影视 | 久久精品人妻无码专区| 五月丁香啪啪| 国产成人一区二区三区视频免费| 日本福利一区二区精品| 丰满人妻AV无码一区二区三区| 又湿又紧又大又爽A视频男| 99久久99久久免费精品小说| 国产精品久久福利新婚之夜| 日韩人妻无码一区二区三区99| 国产好大好硬好爽免费不卡| 中文字幕在线国产精品| 日韩欧美群交P内射捆绑| 免费无码AV一区二区波多野结衣| 亚洲国产精品久久一线不卡| 欧美视频专区一二在线观看| 欧洲一区二区中文字幕| 亚洲精品55夜色66夜色| 日韩人妻系列无码专区| 色欲国产精品一区成人精品| 虎白女粉嫩尤物福利视频| 人妻丰满AV无码中文字幕| 午夜宅男在线永久免费观看网| 成人拍拍拍无遮挡免费视频 |