日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] 在篇文章中主要講講調(diào)試中斷過程中獲得的知識,也許會對大家有用。大家應該都知道在使用S3C2440這塊芯片時,有一個十分大的問題,就是對于keil軟件自帶的初始化代碼沒有給全,在初始化代碼中主要做了以

在篇文章中主要講講調(diào)試中斷過程中獲得的知識,也許會對大家有用。

大家應該都知道在使用S3C2440這塊芯片時,有一個十分大的問題,就是對于keil軟件自帶的初始化代碼沒有給全,在初始化代碼中主要做了以下幾件事

可以看出,也就是對I/O口進行了配置,看門狗,時鐘進行了初始化,同時也對內(nèi)存塊進行了一定的配置,是十分基本的一些初始化,其中對于中斷向量表根本就沒有進行建立,因此如果要用他的文件進行中斷的實驗,必須自己去改動初始化代碼,完成他沒有完成的工作,自己嘗試了一下,沒有成功,因此就對ADS事例程序的初始化代碼進行移植(參看某大神的教程實現(xiàn),)

一、ARM中斷的執(zhí)行方式

這里中斷有兩種,一種外部中斷,一種內(nèi)部中斷,對于兩種中斷稍有不同,原理相似,我以外部中斷進行介紹。

1)當然首先必須配置好各種寄存器,當外部中斷在滿足條件的時候會發(fā)生中斷,這時EINTPEND這個寄存器的對應位會被寫為1,其中這個寄存器可以有多位置一

2)再繼續(xù)和EINTMASK這個寄存器進行操作,如果觸發(fā)的中斷沒有被屏蔽,則可以產(chǎn)生,這時SRCPND對應的位置會置1,當然SRCPND這個寄存器也可能會多位被置1,僅僅表示此時有多個中斷發(fā)生了。

3)查看中斷模式,是普通中斷還是快速中斷,如果是快速中斷直接進入FIQ異常,如果是普通中斷還需要進行后續(xù)操作。

4)如果是普通中斷,再與INTMSK進行操作,操作后,如果還有多個中斷,則進入中斷判優(yōu),最終對INTPND中的某一位進行置1,表示某個中斷產(chǎn)生并相應。注意INTPND這個寄存器有且僅有一位能夠被置1。

以上就是有中斷來了后,整個硬件操作的過程,因此我們可以看出,其實我們有時候可以不通過中斷服務的方式來進行,直接進行中斷位這些標志的查詢就可以了,(類似單片機),但是這樣沒有任何效率的提升了。

對于復位、未定義指令、軟件中斷、指令異常、數(shù)據(jù)異常、普通中斷、快速中斷,在這里我們叫他們異常

對于普通中斷中具體的中斷,我們才叫中斷。

對于以上異常發(fā)生時,都會有一個固定的跳轉(zhuǎn)地址,即異常向量表:


地址異常0x0000,0000復位0x0000,0004未定義指令0x0000,0008軟件中斷0x0000,000c指令異常0x0000,0010數(shù)據(jù)異常0x0000,0014保留0x0000,0018普通中斷0x0000,001c快速中斷


下面是當進入IRQ中斷發(fā)生后,軟件方面的一些操作:

1)當中斷產(chǎn)生時,程序會自動的跳轉(zhuǎn)到0x0000,0018這個地址上去,在這個地址上一般會有一個跳轉(zhuǎn)指令,就可以直接跳轉(zhuǎn)到異常處理函數(shù)。

2)但是對于普通中斷異常中還有相當多的中斷,因此對于普通中斷異常跳入的異常處理函數(shù)不是一個正真的處理函數(shù),而是一個中斷偏移在此跳轉(zhuǎn)的中間過程。其函數(shù)如下:


  1. ;呵呵,來了來了.好戲來了,這一段程序就是用來進行第二次查表的過程了.

  2. ;如果說第一次查表是由硬件來完成的,那這一次查表就是由軟件來實現(xiàn)的了.

  3. ;為什么要查兩次表??

  4. ;沒有辦法,ARM把所有的中斷都歸納成一個IRQ中斷異常和一個FIRQ中斷異常

  5. ;第一次查表主要是查出是什么異常,可我們總要知道是這個中斷異常中的什么中斷呀!

  6. ;沒辦法了,再查一次表唄!

  7. ;===================================================================================

  8. ;//外部中斷號判斷,通過中斷服務程序入口地址存儲器的地址偏移確定

  9. ;//PC=[HandleEINT0+[INTOFFSET]]

  10. ;H|------|

  11. ;|///|

  12. ;|--isr-|====>pc

  13. ;L|--r8--|

  14. ;|--r9--|<----sp

  15. IsrIRQ

  16. subsp,sp,#4;給PC寄存器保留reservedforPC

  17. stmfdsp!,{r8-r9};把r8-r9壓入棧

  18. ldrr9,=INTOFFSET;把INTOFFSET的地址裝入r9INTOFFSET是一個內(nèi)部的寄存器,存著中斷的偏移

  19. ldrr9,[r9];I_ISR

  20. ldrr8,=HandleEINT0;這就是我們第二個中斷向量表的入口的,先裝入r8

  21. ;===================================================================================

  22. ;哈哈,這查表方法夠好了吧,r8(入口)+index*4(別望了一條指令是4bytes的喔),

  23. ;這不就是我們要找的那一項了嗎.找到了表項,下一步做什么?肯定先裝入了!

  24. ;==================================================================================

  25. addr8,r8,r9,lsl#2;地址對齊,因為每個中斷向量占4個字節(jié),即isr=IvectTable+Offeset*4

  26. ldrr8,[r8];裝入中斷服務程序的入口

  27. strr8,[sp,#8];把入口也入棧,準備用舊招

  28. ldmfdsp!,{r8-r9,pc};施招,彈出棧,哈哈,順便把r8彈出到PC了,跳轉(zhuǎn)成功!



這段語句就實現(xiàn)了普通中斷異常到具體中斷的偏移處理。

這樣就可以跳轉(zhuǎn)到具體的中斷處理程序中了。

對于如果用S3C2440.S這個初始化文件,肯定是沒有二次查表,并且也沒有建立后續(xù)具體中斷的偏移地址,這樣如果我們自己僅僅在S3C2440.S添加出硬件中斷發(fā)生后,異常跳轉(zhuǎn),讓異常跳轉(zhuǎn)到一個C程序中,再在C程序中檢測INTPND這個寄存器的值,根據(jù)這個置調(diào)用不同的子函數(shù)也可以實現(xiàn)中斷。(當然在跳轉(zhuǎn)過程中,從正常情況進入中斷異常,需要進行模式轉(zhuǎn)換,棧的保存等)

二、在ARM中執(zhí)行中斷時,內(nèi)存的映射情況

第一部分所說的直接跳轉(zhuǎn)地址,都是硬件執(zhí)行時直接使用的地址,當MMU沒有開啟的時候,上面的地址就是物理地址,直接去實際的那塊地址,但是當MMU開啟后,上面的地址就是虛擬地址(開啟MMU之后,所有使用的地址都應該是虛擬地址了,都會被映射到某一塊對應的物理地址中去)。但是從keil forARM的工程配置

我們程序代碼是從ROM1的0x3000,0000這里開始存放的,因此如果產(chǎn)生中斷了,MMU沒有開啟,那硬件直接去訪問0x0000,0000這里,是不可能找到我們的代碼,這時候程序就跑飛了。因此為了當硬件去訪問0x0000,0000時,其實訪問的是ROM1的0x3000,0000,我們必須開啟MMU把0x0000,0000變成一個虛擬的地址,這個虛擬地址映射的實際物理地址是0x3000,0000,這里我們就需要介紹一個函數(shù)MMU_SetMTT,源代碼如下


  1. voidMMU_SetMTT(intvaddrStart,intvaddrEnd,intpaddrStart,intattr)

  2. {

  3. volatileU32*pTT;

  4. volatileinti,nSec;

  5. pTT=(U32*)_MMUTT_STARTADDRESS+(vaddrStart>>20);

  6. nSec=(vaddrEnd>>20)-(vaddrStart>>20);

  7. for(i=0;i<=nSec;i++)*pTT++=attr|(((paddrStart>>20)+i)<<20);

  8. }

在內(nèi)存映射中增加MMU_SetMTT(0x00000000,0x03F00000,0x30000000,RW_CB);

或者增加MMU_SetMTT(0x00000000,0x03f00000,(int)__ENTRY,RW_CB); 因為ENTRY就是等于0x30000000;

這樣在中斷產(chǎn)生的時候就不會跑飛了,并且能按照程序代碼找到對應中斷入口等。

三、特別提醒

在上面兩個問題解決后,順利的把中斷調(diào)試通過,但是需要注意的小細節(jié)是:

1)在每次中斷發(fā)生后,記得要對中斷進行清除,并且清除的過程是從內(nèi)部向外部清除,

2)在對于的中斷函數(shù)一定要記住掛載對應的中斷向量地址上,不然同樣程序會跑飛,如果沒有注意這里,可能會調(diào)試很久。

四、中斷向量表

這是初始化代碼中用于上面二次偏移的標號,定義在RAM中


  1. ALIGN

  2. AREARamData,DATA,READWRITE

  3. ^_ISR_STARTADDRESS;_ISR_STARTADDRESS=0x33FF_FF00

  4. HandleReset#4

  5. HandleUndef#4

  6. HandleSWI#4

  7. HandlePabort#4

  8. HandleDabort#4

  9. HandleReserved#4

  10. HandleIRQ#4

  11. HandleFIQ#4

  12. ;Donotusethelabel'IntVectorTable',

  13. ;ThevalueofIntVectorTableisdifferentwiththeaddressyouthinkitmaybe.

  14. ;IntVectorTable

  15. ;@0x33FF_FF20

  16. HandleEINT0#4

  17. HandleEINT1 # 4

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉