青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 60, 文章 - 0, 評(píng)論 - 197, 引用 - 0
數(shù)據(jù)加載中……

s3c2410 MMU 啟用后設(shè)置中斷跳轉(zhuǎn)指令遇到的問題

事情是這樣的, 前些日子在 FS2410 (核心板為三星 s3c2410)開發(fā)板上實(shí)現(xiàn)了中斷,包括
響應(yīng)時(shí)鐘 Timer0, 響應(yīng)按鍵,并實(shí)現(xiàn)了串口通信,能把任何數(shù)據(jù)通過 UART0 發(fā)送到 PC 機(jī)
上的超級(jí)終端上進(jìn)行顯示,這樣也便于調(diào)試。前兩天又實(shí)現(xiàn)了 MMU 的啟用代碼,歡呼雀躍
啊..., 可就在這個(gè)時(shí)候問題來了...

MMU 啟用后中斷不能響應(yīng)了!, start.S 的代碼片段如下(arm-linux-gcc 匯編格式):

   text
   .global _start
   _start:
    b reset
    NOP
    NOP
    NOP
    NOP
    NOP
    ldr pc ,=handle_irq
    NOP
   reset:
    ldr r0, =0x53000000  @ Close Watch-dog Timer
    mov r1, #0x0
    str r1, [r0]
  
    @ init stack
    ldr sp,=4096
    
    @ disable all interrupts
    mov r1, #0x4A000000
    mov r2, #0xffffffff
    str r2, [r1, #0x08]
    ldr r2, =0x7ff
    str r2, [r1, #0x1c]
  
    bl  memory_setup  @ Initialize memory setting
    bl  flash_to_sdram  @ Copy code to sdram
   
    ldr pc, =run_on_sdram
 run_on_sdram:
    ldr sp, =0x33000000
    bl init_mmu_tlb   @ setup page table
    bl init_mmu   @ MMU enabled
  
    msr cpsr_c, #0xd2  @ set the irq mode stack
    ldr sp, =0x31000000
    msr cpsr_c, #0xdf  @ set the system mode stack
    ldr sp, =0x32000000
    bl  init_irq           
    msr cpsr_c, #0x5f  @ set the system mode open the irq
    
    ldr sp, =0x33000000  @ Set stack pointer
    bl  main
   loop:
    b loop
  
我是通過在地址 0x00000018 放入一條長(zhǎng)跳轉(zhuǎn)指 ldr pc, =handle_irq 來響應(yīng)中斷的,在
沒有啟用 MMU 之前,代碼工作的很好。通過如下兩個(gè)函數(shù)啟用了 MMU 實(shí)現(xiàn)虛擬內(nèi)存管理:

     bl init_mmu_tlb   @ setup page table
     bl init_mmu   @ MMU enabled

通過下面代碼來映射低端和高端中斷向量表:

  *(tb_base + 0x00000000) = (0x00000000)|(0x03<<10)|(0<<5)|(1<<4)|(1<<3)|0x02;
  *(tb_base + (0xffff0000>>20)) = VECTORS_PHY_BASE|(0x03<<10)|(0<<5)|(1<<4)|(0<<3)|0x02;

其中 VECTORS_PHY_BASE=0x33f00000, 可以看到:
通過設(shè)置頁(yè)表,將 0xffff0000 為首地址的 32 個(gè)字節(jié)的中斷向量表被映射到 0x33ff0000 為首地址的 32 字節(jié)區(qū)域,

既然設(shè)置了高端中斷向量,我們就要在 0x33ff0000 處設(shè)置中斷跳轉(zhuǎn)指令,通過調(diào)用下面這個(gè)函數(shù):

   bl  flash_to_sdram

把程序自身復(fù)制到 SDRAM 的 0x30004000為首地址的區(qū)域,而 0x30004000 前面的 16K 即 0x30000000~0x30003FFF
用來放置頁(yè)表,并且把 nand flash 的前 512byte 復(fù)制到 SDRAM 0x33ff0000 處, 因?yàn)閚and flash 的前32byte 是8 個(gè)
中斷跳轉(zhuǎn)指令,這樣中斷向量表就在 0x33ff0000 處被設(shè)置。

如何讓 ARM 使用高端的中斷跳轉(zhuǎn)指令呢?通過設(shè)置 CP15 協(xié)處理器的一些寄存器來啟用。以下是內(nèi)聯(lián)匯編片段

   /*
    * turn on what we want
    * base location of exception = 0xffff0000
    */
   "orr r0, r0, #0x2000\n"
   "orr r0, r0, #0x0002\n"

   /* MMU enabled*/
   "orr r0, r0, #0x0001\n"

   /* write control register*/
   "mcr p15, 0, r0, c1, c0, 0\n"

萬事俱備,我們可以實(shí)驗(yàn)了,可不幸的中斷不能響應(yīng)了?!...

......經(jīng)過了一天的折騰,發(fā)現(xiàn)將中斷跳轉(zhuǎn)指令由
   b reset
    NOP
    NOP
    NOP
    NOP
    NOP
    ldr pc,=handle_irq
    NOP

改為

   b reset
    NOP
    NOP
    NOP
    NOP
    NOP
    ldr pc, handle_irq_addr
    NOP
   handle_irq_addr: 
    .long handle_irq


中斷就能響應(yīng)了,代碼運(yùn)行的很好,可百思不得其解,為什么不能用 ldr pc, =handle_irq
設(shè)置而非要用下面這種形式呢

        ldr pc, handle_irq_addr
        NOP
   handle_irq_addr: 
        .long handle_irq

我在 main 函數(shù)里通過如下代碼將所有的中斷跳轉(zhuǎn)指令(高端的和低端的)都打印出來了:

#include "serl.h"
#include "printf.h"

#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)

int main()
{
  init_uart();
  GPFDAT = 0x0;
  uart_printf("starting:\n");
  unsigned long *ptr = (unsigned long *)0x30004000;
  unsigned long *ptr2 =(unsigned long *)0x33ff0000;

  unsigned long *ptr3 = (unsigned long *)0x00000000;
  unsigned long *ptr4 = (unsigned long *)0xffff0000;

  int i= 8;
  while (i--) {
    uart_printf("%x  %x  %x  %x\n", *ptr++, *ptr2++, *ptr3++, *ptr4++);
  }
  while (1);
  return 0;
}

代碼將數(shù)據(jù)通過串口在超級(jí)終端上進(jìn)行顯示后,發(fā)現(xiàn)確有微妙不同:

中斷不能響應(yīng)時(shí)(ldr pc, =handle_irq):
0x30004000 0x33ff0000 0x00000000 0xffff0000
-------------------------------------------
ea000006   ea000006   ea000006   ea000006
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e59ff1fc      e59ff1fc      e59ff1fc      e59ff1fc
e1a00000   e1a00000   e1a00000   e1a00000


中斷可以響應(yīng)時(shí)(ldr pc, handle_irq_addr):
0x30004000 0x33ff0000 0x00000000 0xffff0000
-------------------------------------------
ea000007   ea000007   ea000007   ea000007
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e1a00000   e1a00000   e1a00000   e1a00000
e59ff000     e59ff000     e59ff000     e59ff000
e1a00000   e1a00000   e1a00000   e1a00000


難道編譯器對(duì)這兩種跳轉(zhuǎn)產(chǎn)生了不同的影響? 將代碼反匯編來看個(gè)究竟:

中斷不能響應(yīng)時(shí)(ldr pc, =handle_irq):
---------------------------------------------------------------------
       0: ea000006  b 0x20
       4: e1a00000  nop   (mov r0,r0)
       8: e1a00000  nop   (mov r0,r0)
       c: e1a00000  nop   (mov r0,r0)
      10: e1a00000  nop   (mov r0,r0)
      14: e1a00000  nop   (mov r0,r0)
      18: e59ff1fc  ldr pc, [pc, #508] ; 0x21c
      1c: e1a00000  nop   (mov r0,r0)


發(fā)現(xiàn) ldr pc, =handle_irq 被匯編成

   ldr pc, [pc, #508] ; 0x21c

我們又發(fā)現(xiàn)編譯器為這條指令生成了一條注釋: ; 0x21c, 它的意思是說去地址0x21c 處加載
數(shù)據(jù),怎么算的呢? 當(dāng)前地址是 0x18, 加上 508 即 0x1fc 得出 0x214,好像不是0x21c,
慢著... ARM 采用三級(jí)流水結(jié)構(gòu),那么讀 pc 時(shí)得到的得數(shù)值會(huì)是相對(duì)當(dāng)前指令的第二條指
令的地址, 即當(dāng)前地址值加上 0x8,這么算來:

  0x18 + 0x1fc + 0x8 = 0x21c

去 0x21c 處看看:

  21c: 30004208  andcc r4, r0, r8, lsl #4

是 0x30004208 這么個(gè)值,也就是說 ARM 把 0x30004208 裝進(jìn)了 pc
......


再來看看將中斷跳轉(zhuǎn)指令改成

        ldr pc, handle_irq_addr
        NOP
   handle_irq_addr: 
         .long handle_irq

也就是中斷能響應(yīng)時(shí)的反匯編代碼:

       0: ea000007  b 0x24
       4: e1a00000  nop   (mov r0,r0)
       8: e1a00000  nop   (mov r0,r0)
       c: e1a00000  nop   (mov r0,r0)
      10: e1a00000  nop   (mov r0,r0)
      14: e1a00000  nop   (mov r0,r0)
      18: e59ff000  ldr pc, [pc, #0] ; 0x20
      1c: e1a00000  nop   (mov r0,r0)

可以看到 0x18 處為      

      18: e59ff000  ldr pc, [pc, #0] ; 0x20

與上面分析同理,去 0x20 處看看:

      20: 3000420c  andcc r4, r0, ip, lsl #4

發(fā)現(xiàn) ARM 把 0x3000420c 這個(gè)數(shù)值裝進(jìn)了 pc


前后對(duì)比一下, 一個(gè)是 0x30004208, 另一個(gè)是 0x3000420c, 兩者相差 4 個(gè)字節(jié)
而后一種情況多出的4個(gè)字節(jié)是由于 定義
   
   handle_irq_addr: 
    .long handle_irq

而占用的 4 個(gè)字節(jié)。

看來編譯器忠實(shí)的匯編了代碼,那么很可能是 MMU 啟用后對(duì) ldr pc, =handle_irq 這樣
的中斷跳轉(zhuǎn)指令產(chǎn)生了影響?

......現(xiàn)在還沒有找到合理的解釋,請(qǐng)高手不吝賜教

posted on 2008-01-28 11:11 Normandy 閱讀(3841) 評(píng)論(3)  編輯 收藏 引用 所屬分類: Embeded Area

評(píng)論

# re: s3c2410 MMU 啟用后設(shè)置中斷跳轉(zhuǎn)指令遇到的問題  回復(fù)  更多評(píng)論   

樓主其實(shí)已經(jīng)摸到錯(cuò)誤的門了,雖然沒能得出結(jié)論…………
2008-01-28 14:36 | ggyy

# re: s3c2410 MMU 啟用后設(shè)置中斷跳轉(zhuǎn)指令遇到的問題  回復(fù)  更多評(píng)論   

@ggyy

呵呵,問題已經(jīng)解決,一個(gè)低級(jí)的錯(cuò)誤,原因如下:
508 + 0x8 即 516, 大于 512, 前面我提到把 Nand flash 的前 512 字節(jié)復(fù)制到 0x33ff0000 處用以設(shè)置高端中斷向量表,這樣當(dāng)發(fā)生 IRQ 中斷時(shí),程序會(huì)去 0x33ff0000 + 508 + 0x8 處把 0x30004208 裝進(jìn) pc 并進(jìn)行跳轉(zhuǎn)來響應(yīng)中斷,但不幸的是我只復(fù)制了512字節(jié),所以 IRQ 中斷是不能響應(yīng)的。總結(jié)一下,對(duì)比上面提到的兩種設(shè)置中斷跳轉(zhuǎn)指令的方式:

(1)
b reset
NOP
NOP
NOP
NOP
NOP
ldr pc,=handle_irq
NOP

(2)
b reset
NOP
NOP
NOP
NOP
NOP
ldr pc, handle_irq_addr
NOP
handle_irq_addr:
.long handle_irq

第二種方式的好處是顯而易見的,只需要偏移 0x8 就能取到目的地址了;對(duì)第一種方式,ARM 要去通過一個(gè)偏移來取到目的地址,具體數(shù)值要看編譯如何設(shè)置了。
2008-01-29 14:00 | Normandy

# re: s3c2410 MMU 啟用后設(shè)置中斷跳轉(zhuǎn)指令遇到的問題  回復(fù)  更多評(píng)論   

其實(shí),ARM匯編指令LDR很好的說明了這個(gè)問題,看看它的說明,好好理解下。
2008-11-14 17:12 | zqs
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品国产三级国产专播精品人 | 欧美福利视频网站| 国内一区二区三区在线视频| 亚洲午夜久久久久久久久电影院| 亚洲精品乱码久久久久久蜜桃91 | 亚洲国产一区在线| 蜜桃av一区| 日韩一二三在线视频播| 日韩亚洲视频在线| 国产女人水真多18毛片18精品视频| 午夜久久久久久| 西瓜成人精品人成网站| 韩国久久久久| 亚洲国产精品久久久| 欧美精品在线播放| 亚洲欧美日本另类| 欧美专区在线播放| 亚洲三级性片| 亚洲自拍电影| 1024国产精品| 一区二区三区高清在线观看| 国产伦一区二区三区色一情| 久久米奇亚洲| 欧美激情一区三区| 欧美伊人影院| 欧美肥婆bbw| 欧美一区二区三区视频免费| 久久尤物视频| 午夜视频在线观看一区| 久久综合久久88| 午夜精品久久久久久久久久久久| 欧美一级午夜免费电影| 亚洲精品美女在线| 亚洲欧美久久| 一区二区免费看| 久久久不卡网国产精品一区| 中日韩美女免费视频网站在线观看| 亚洲男人第一网站| 亚洲麻豆国产自偷在线| 欧美影视一区| 亚洲欧美卡通另类91av| 美女啪啪无遮挡免费久久网站| 在线视频亚洲欧美| 久久伊人免费视频| 欧美专区福利在线| 国产精品扒开腿做爽爽爽视频| 欧美成人午夜剧场免费观看| 国产欧美日韩免费看aⅴ视频| 亚洲国产成人精品久久久国产成人一区 | 欧美成人免费全部| 久久国产一区二区三区| 欧美亚一区二区| 亚洲国产欧美不卡在线观看| 国产夜色精品一区二区av| 99精品热视频只有精品10| 亚洲人在线视频| 老司机aⅴ在线精品导航| 久久av二区| 国产精品亚洲一区二区三区在线| 亚洲精品之草原avav久久| 女同性一区二区三区人了人一| 欧美一区二区免费| 欧美午夜不卡影院在线观看完整版免费 | 亚洲欧洲日韩女同| 久久精品国产欧美激情| 久久av免费一区| 国产精品专区一| 亚洲制服少妇| 性色av香蕉一区二区| 欧美日本在线观看| 亚洲人体大胆视频| 艳女tv在线观看国产一区| 欧美黄网免费在线观看| 亚洲风情亚aⅴ在线发布| 亚洲高清色综合| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美11—12娇小xxxx| 精品成人a区在线观看| 久久久久五月天| 欧美大片免费| 日韩亚洲欧美一区二区三区| 欧美韩国日本一区| 91久久久精品| 亚洲男同1069视频| 国产精品永久免费在线| 香蕉av777xxx色综合一区| 久久福利影视| 亚洲国产欧美不卡在线观看| 欧美不卡一卡二卡免费版| 亚洲精品一区二区三区99| 亚洲午夜精品久久| 国产欧美丝祙| 麻豆精品在线播放| 夜夜精品视频| 久久亚洲国产成人| 亚洲精品日韩在线观看| 国产精品扒开腿做爽爽爽视频| 午夜国产不卡在线观看视频| 蜜臀久久久99精品久久久久久| 亚洲另类黄色| 国产欧美视频一区二区| 久久综合色综合88| 亚洲天堂免费在线观看视频| 久久蜜桃香蕉精品一区二区三区| 亚洲欧洲精品一区二区三区 | 免费在线看一区| 一区二区三区日韩在线观看| 久久精品国产77777蜜臀| 亚洲欧洲一区| 国产一区91| 欧美日韩中文字幕在线视频| 久久爱另类一区二区小说| 亚洲精品一级| 欧美va天堂va视频va在线| 亚洲综合二区| 亚洲人成亚洲人成在线观看| 国产精品一区视频| 欧美精品久久99| 久久久久久久综合| 亚洲私人影院| 最近中文字幕日韩精品| 久久免费观看视频| 亚洲欧美日韩久久精品| 亚洲精品一区中文| 一区三区视频| 国语自产在线不卡| 国产精品区二区三区日本| 欧美黄色精品| 牛牛国产精品| 美女精品网站| 久久综合精品一区| 欧美一区亚洲| 亚洲欧美制服中文字幕| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美日韩大陆在线| 久久综合九九| 久久人体大胆视频| 久久精品国产亚洲一区二区三区| 亚洲小说欧美另类社区| 99国内精品| av成人毛片| 在线视频一区观看| 一区二区不卡在线视频 午夜欧美不卡在 | 一区二区三区四区五区在线| 亚洲国产日韩一区二区| 伊人久久大香线蕉av超碰演员| 国产人成一区二区三区影院| 国产精品久久久久久久久久久久久| 欧美美女操人视频| 欧美日韩成人一区| 欧美日韩国产三级| 欧美午夜片在线免费观看| 欧美日韩国内| 国产精品久久久久毛片软件| 国产精品久久久久久久久婷婷 | 欧美成人午夜免费视在线看片 | 久久青草久久| 免费欧美在线| 欧美欧美天天天天操| 欧美区高清在线| 国产精品久久久久久久久免费樱桃| 国产精品白丝jk黑袜喷水| 国产精品日本精品| 国产亚洲成精品久久| 国产永久精品大片wwwapp| 在线成人黄色| 一本色道久久88亚洲综合88| 亚洲一区二区成人| 久久福利视频导航| 欧美成人激情在线| 91久久国产综合久久蜜月精品| 亚洲看片网站| 欧美亚洲在线观看| 欧美电影免费观看网站| 欧美视频在线观看视频极品| 国产精品一区免费视频| 狠狠综合久久| 亚洲视频www| 久久久久久久综合色一本| 欧美 日韩 国产 一区| 91久久久久久久久| 亚洲欧美另类国产| 欧美激情精品久久久久久大尺度| 国产精品九九| 亚洲激情专区| 久久精品毛片| 亚洲激情av在线| 久久国产一区二区三区| 欧美日韩成人| 亚洲国产精品美女| 欧美专区日韩视频| 亚洲三级影片| 久久婷婷亚洲| 国产一区二区三区四区老人| 亚洲美女在线视频| 麻豆精品一区二区综合av| 亚洲一级在线| 欧美日韩国产成人精品| 影院欧美亚洲|