<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > S3C2440中斷代碼的深層次分析

          S3C2440中斷代碼的深層次分析

          作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏
          小結:
          我們可以將ARM中采用2級向量表的形式實現(xiàn)異常的中斷處理,其中第一級是CPU中定義好的向量表,也就是異常向量表。在這一級的向量表中,實現(xiàn)跳轉到對應的異常公共處理函數(shù),另外每一種異常問題都存在自己的子問題,這時候采用第二級的向量表就可以解決各種子問題。第一級的向量表一般來說都是CPU定義好的,而第二級向量表則是我們在程序設計中人工實現(xiàn)的。
          5、那么又是如何得到C語言中的函數(shù)呢,實質上已經(jīng)很簡單了,具體的分析如下:
          //S3c2440init.s
          ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
          HandleReset # 4
          HandleUndef # 4
          HandleSWI # 4
          HandlePabort # 4
          HandleDabort # 4
          HandleReserved# 4
          HandleIRQ # 4
          HandleFIQ # 4
          這邊就可以看做第二級中斷向量表
          ;@0x33FF_FF20
          HandleEINT0 # 4
          HandleEINT1 # 4
          HandleUART0 # 4
          ….
          HandleSPI1 # 4
          HandleRTC # 4
          HandleADC # 4
          _ISR_STARTADDRESS在s3c2440中是一個具體的地址值,這個地址值可以在option.h中找到。因此依據(jù)這個值我們就可以知道我們的二級向量表的實際位置,這種處理的方式存在一定的巧妙性,同時中斷地址的選擇也需要我們恰當?shù)脑O置。這里的“^”其實就是 MAP,這段程序的意思是,從 _ISR_STARTADDRESS開始,預留一個變量,每個變量一個標號,預留的空間為 4個字節(jié),也就是 32BIT,其實這里放的是真正的C寫的處理函數(shù)的地址,說白了,就是函數(shù)指針,這樣做就很靈活了。
          //option.h
          #define _ISR_STARTADDRESS 0x33ffff00
          同時在s3c2440addr.h中又可以找到下面的定義:
          //s3c2440addr.h
          // Exception vector(異常向量,不是CPU的異常向量)
          #define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))
          #define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))
          #define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))
          #define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
          #define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))
          #define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
          #define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))
          #define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))
          // Interrupt vector(中斷向量)
          #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
          #define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))
          #define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))
          #define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))
          #define pISR_EINT4_7(*(unsigned *)(_ISR_STARTADDRESS+0x30))
          #define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))
          #define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))
          #define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x9c))
          從上面的代碼中我們可以知道pISR_EINT0之類的實質上就是一個地址,如果我們在這個地址中填充處理函數(shù)的地址值也就形成了函數(shù)指針,實際上只需要將函數(shù)名賦值給對應的中斷向量即可。這樣也就找到了適當?shù)奶幚矸绞?基本的形式如下所示:
          Void main()
          {
          pISR_EINT0 = (U32)Button_ISR;
          While(1)
          {
          }
          }
          /*中斷服務函數(shù)*/
          static void _irq Button_ISR(void)
          {
          }
          幾個分析的比較清晰的網(wǎng)址可以去看看:
          http://blog.sina.com.cn/s/blog_8c134b590100yke9.html
          http://hi.baidu.com/%C9%B3%BC%D3%BB%C6%BD%F0%CA%A5%B6%B7%CA%BF/blog/item/fbc56f137f475a085baf5334.html
          總結:
          問題?在其中的代碼中,我并沒有看到返回地址的操作問題,我找了很多的代碼,但是好像都不是特別的準確。也就是沒有找到對應的subs pc, lr, =0x04操作。
          代碼中經(jīng)典的片段就是如何實現(xiàn)了代碼的跳轉問題:
          sub sp,sp, #0x04;為保存PC值預留空間
          stmfd sp!,{r0};保存需要使用到的寄存器值,需要使用多少,就壓多少的堆棧
          …//使用r0進行相關的操作
          ldr r0,[r0];
          str r0, [sp,#0x04]; //這個操作類似于函數(shù)調(diào)用中的問題
          ldmfd sp!,{r0, pc};//出棧操作,實現(xiàn)了對PC值的賦值
          上一頁 1 2 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();