新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C44B0的初始化程序的理解

        S3C44B0的初始化程序的理解

        作者: 時間:2011-10-08 來源:網絡 收藏

        就是化各個關鍵的寄存器,建立中斷向量,然后轉移到主函數去執行。不過不支持地址映射,所以不COPY到RAM種執行。化對我們廣大初學者來說,比較難的是中斷的處理和一些少見的操作符號,S3C44B0的中斷子程序地址存放在初始化程序最后就是

        本文引用地址:http://www.104case.com/article/150137.htm

          HandleADC # 4

          HandleRTC # 4

          HandleUTXD1 # 4

          HandleUTXD0 # 4

          HandleSIO # 4

          HandleIIC # 4

          HandleURXD1 # 4

          HandleURXD0 # 4

          這一段,它的其實地址是ISR_STARTADDRESS,個人寫中斷程序的時候,子程序地址被編譯器連放在相應的位置。初始化完成后,程序轉通過BL Main 轉到用戶定義的主程序上執行。以下是我個人的一些,有錯誤的地方希望大家指出來。

          GBLL THUMBCODE

          [ {CONFIG} = 16

          THUMBCODE SETL {TRUE}

          CODE32

          |

          THUMBCODE SETL {FALSE}

          ]

          [ THUMBCODE

          CODE32 ;for start-up code for Thumb mode

          ]

          ×××××××××××××××××××××××

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

          這段我為設定THUMCODE的值,然后確定,用戶的程序是在ARM狀態還是THUM狀態。不過不管THUMCODE是何值,下面代碼都是ARM狀態

          這段沒有什么很復雜的,就是這三個[,|,]操作符讓我迷惑了半天,翻了半天書才找到解釋

          MACRO 宏 偽操作

          $HandlerLabel HANDLER(宏的名稱) $HandleLabel(宏的參數)

          $HandlerLabel

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

          stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)

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

          ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

          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

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

          這段當初我覺得比較難理解,不過通過看各種程序,對這段有了一個基本的理解。這個宏的作用是把各個中斷程序的地址裝入當前的PC,44B0有兩種裝斷模式 一種是沒有中斷向量表,一種是使用中斷向量表的

          使用中斷向量表只能是IRQ方式,當使用中斷向量表的時候,中斷發生時由44B0的中斷控制器自動跳轉到

          相應的位置。比如在中斷向量表的模式下,一個外部中斷0發生程序自動跳轉到 地址0X20處,0X20地址單元的指令時ldr pc,=HandlerEINT0

          因而程序PC跳到HandlerEINT0處,執行這個宏操作,把外部中斷的函數的地址賦給PC。 44B0里面定義了一個

          #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84)) ,_ISR_STARTADDRES是中斷程序地址的起始地址,_ISR_STARTADDRESS+0X84是HandleEINT0的地址

          例如一個外部中斷函數名void EXINT(),程序里執行 pISR_EINT0=(unsigned)EXIT,就把自己的函數地址賦給了標號為HandleEINT0處的內存單元

          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

          ××××××××××××××××××××××××××××××××××

          這段我個人的理解為這些是連接器生成的于輸出段相關的符號,是在沒有使用SCATTER文件的情況可以調用。這段指出了在ROM和RAM種的數據的地址,這些地址應該是連接器生成的,不過為什么能調用

          連接器生產的符號,我不大明白其中的原因,還希望各位說說自己的理解

          IsrIRQ ;using I_ISPR register.

          sub sp,sp,#4 ;reserved for 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

          add r8,r8,#4

          b %B0

          1

          ldr r9,=HandleADC

          add r9,r9,r8

          ldr r9,[r9]

          str r9,[sp,#8]

          ldmfd sp!,{r8-r9,pc}

          ×××××××××××××××××××××××

          這段是沒有使用裝斷向量模式下如何裝載中斷子程序,因為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發送中斷的地址,這個地址的內容是中斷子程序的地址

          再說明幾個偽操作:^=MAP. #=field

          別的方面我覺得比較容易理解了,就不多講了。



        關鍵詞: 理解 程序 初始 S3C44B0

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 弋阳县| 封丘县| 玉田县| 博罗县| 喀喇| 钟祥市| 西乡县| 儋州市| 洱源县| 肃北| 长治县| 鹤壁市| 鹰潭市| 临沭县| 嘉兴市| 黑龙江省| 司法| 石林| 丁青县| 白河县| 乐安县| 卢湾区| 孟村| 丹棱县| 高邮市| 香格里拉县| 乌拉特后旗| 共和县| 绥宁县| 布尔津县| 永安市| 宾川县| 博客| 固镇县| 雅江县| 平山县| 永嘉县| 界首市| 汶上县| 平舆县| 清远市|