在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

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

      S3C2440中斷代碼的深層次分析

      作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
      小結(jié):
      我們可以將ARM中采用2級(jí)向量表的形式實(shí)現(xiàn)異常的中斷處理,其中第一級(jí)是CPU中定義好的向量表,也就是異常向量表。在這一級(jí)的向量表中,實(shí)現(xiàn)跳轉(zhuǎn)到對(duì)應(yīng)的異常公共處理函數(shù),另外每一種異常問(wèn)題都存在自己的子問(wèn)題,這時(shí)候采用第二級(jí)的向量表就可以解決各種子問(wèn)題。第一級(jí)的向量表一般來(lái)說(shuō)都是CPU定義好的,而第二級(jí)向量表則是我們?cè)诔绦蛟O(shè)計(jì)中人工實(shí)現(xiàn)的。
      5、那么又是如何得到C語(yǔ)言中的函數(shù)呢,實(shí)質(zhì)上已經(jīng)很簡(jiǎn)單了,具體的分析如下:
      //S3c2440init.s
      ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
      HandleReset # 4
      HandleUndef # 4
      HandleSWI # 4
      HandlePabort # 4
      HandleDabort # 4
      HandleReserved# 4
      HandleIRQ # 4
      HandleFIQ # 4
      這邊就可以看做第二級(jí)中斷向量表
      ;@0x33FF_FF20
      HandleEINT0 # 4
      HandleEINT1 # 4
      HandleUART0 # 4
      ….
      HandleSPI1 # 4
      HandleRTC # 4
      HandleADC # 4
      _ISR_STARTADDRESS在s3c2440中是一個(gè)具體的地址值,這個(gè)地址值可以在option.h中找到。因此依據(jù)這個(gè)值我們就可以知道我們的二級(jí)向量表的實(shí)際位置,這種處理的方式存在一定的巧妙性,同時(shí)中斷地址的選擇也需要我們恰當(dāng)?shù)脑O(shè)置。這里的“^”其實(shí)就是 MAP,這段程序的意思是,從 _ISR_STARTADDRESS開始,預(yù)留一個(gè)變量,每個(gè)變量一個(gè)標(biāo)號(hào),預(yù)留的空間為 4個(gè)字節(jié),也就是 32BIT,其實(shí)這里放的是真正的C寫的處理函數(shù)的地址,說(shuō)白了,就是函數(shù)指針,這樣做就很靈活了。
      //option.h
      #define _ISR_STARTADDRESS 0x33ffff00
      同時(shí)在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í)質(zhì)上就是一個(gè)地址,如果我們?cè)谶@個(gè)地址中填充處理函數(shù)的地址值也就形成了函數(shù)指針,實(shí)際上只需要將函數(shù)名賦值給對(duì)應(yīng)的中斷向量即可。這樣也就找到了適當(dāng)?shù)奶幚矸绞?基本的形式如下所示:
      Void main()
      {
      pISR_EINT0 = (U32)Button_ISR;
      While(1)
      {
      }
      }
      /*中斷服務(wù)函數(shù)*/
      static void _irq Button_ISR(void)
      {
      }
      幾個(gè)分析的比較清晰的網(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
      總結(jié):
      問(wèn)題?在其中的代碼中,我并沒有看到返回地址的操作問(wèn)題,我找了很多的代碼,但是好像都不是特別的準(zhǔn)確。也就是沒有找到對(duì)應(yīng)的subs pc, lr, =0x04操作。
      代碼中經(jīng)典的片段就是如何實(shí)現(xiàn)了代碼的跳轉(zhuǎn)問(wèn)題:
      sub sp,sp, #0x04;為保存PC值預(yù)留空間
      stmfd sp!,{r0};保存需要使用到的寄存器值,需要使用多少,就壓多少的堆棧
      …//使用r0進(jìn)行相關(guān)的操作
      ldr r0,[r0];
      str r0, [sp,#0x04]; //這個(gè)操作類似于函數(shù)調(diào)用中的問(wèn)題
      ldmfd sp!,{r0, pc};//出棧操作,實(shí)現(xiàn)了對(duì)PC值的賦值
      上一頁(yè) 1 2 下一頁(yè)

      關(guān)鍵詞: S3C2440中斷代碼深層次分

      評(píng)論


      技術(shù)專區(qū)

      關(guān)閉