日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

發(fā)布時間:2025/6/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 一. 異常向量表
    • 1. 異常相關(guān)概念
      • (1) 異常
      • (2) 異常類型簡介
    • 2. 異常處理
      • (1) 異常處理
  • 二. 異常向量表代碼編寫
    • 1. 初始化異常向量表模塊代碼
    • 2. 鏈接器腳本
    • 3. Makefile 編譯腳本
    • 4. 編譯輸出可執(zhí)行文件


本博客的參考文章及相關(guān)資料下載 :

  • 1.ARM 架構(gòu)參考手冊 ( ARM Architecture Reference Manual ) : https://download.csdn.net/download/han1202012/8324641
  • 2.匯編參考手冊 : https://download.csdn.net/download/han1202012/8328375
  • 3.本博客代碼下載 : https://download.csdn.net/download/han1202012/10392901





一. 異常向量表



參考手冊 :

  • 1.異常向量表手冊位置 : ARM Architecture Reference Manual A2.6 ;
  • 2.ARM Architecture Reference Manual 文檔下載地址 : http://download.csdn.net/detail/han1202012/8324641;


1. 異常相關(guān)概念


(1) 異常


異常定義 :

  • 1.異常簡介 : 由于 內(nèi)部或者外部的一些事件 , 導致 處理器停下正在處理的工作, 轉(zhuǎn)而去處理這些發(fā)生的事;
  • 2.處理器狀態(tài) : 當遇到異常的時候, 先將處理器狀態(tài)保存起來, 以便執(zhí)行完異常處理程序后, 可以恢復處理器狀態(tài), 繼續(xù)執(zhí)行異常出現(xiàn)點下面的代碼;
  • 3.異常同時出現(xiàn) : 在一個時間點 可以出現(xiàn) 多個異常;
  • 4.異常向量概念 : 當異常發(fā)生的時候, 程序被強行從一個固定的內(nèi)存地址執(zhí)行, 每個種類的異常都有對應的一固定內(nèi)存地址, 這個內(nèi)存地址就是異常向量 ;


(2) 異常類型簡介


異常類型 : ARM 架構(gòu) 支持 七種類型的異常,

  • 1.Reset : 處理器在工作時, 突然 按下重啟鍵, 就會觸發(fā)該異常;
  • 2.Undefined instructions : 處理器無法識別指令的異常, 處理器執(zhí)行的指令是有規(guī)范的, 如果 嘗試執(zhí)行 不符合要求的指令, 就會進入到該異常指令對應的地址中;
  • 3.Software interrupt (SWI) : 軟中斷, 軟件中需要去打斷處理器工作, 可以使用軟中斷來執(zhí)行 ;
  • 4.Prefetch Abort (instruction fetch memory abort) : 預取指令失敗, ARM 在執(zhí)行指令的過程中, 要先去預取指令準備執(zhí)行, 如果預取指令失敗, 就會產(chǎn)生該異常;
  • 5.Data Abort (data access memory abort) : 讀取數(shù)據(jù)失敗;
  • 6.IRQ (interrupt) : 普通中斷;
  • 7.FIQ (fast interrupt) : 快速中斷, 快速中斷要比普通中斷響應速度要快一些;


2. 異常處理


(1) 異常處理


異常處理簡介 :

  • 1.異常向量工作機制 : 異常發(fā)生時, ARM 處理器會跳轉(zhuǎn)到對應該異常的 固定地址 去執(zhí)行異常處理程序, 這個 固定的地址 就是異常向量;
  • 2.默認地址 和 高位地址 : 每個中斷類型對應兩個異常向量, 默認是 Normal address, 如果經(jīng)過配置, 配置使用高位的異常向量, 就會使用 High vector address 異常向量; 使用 普通 向量 還是 高位向量, 可以使用 CP15 協(xié)處理器進行配置;
  • 3.異常 與 地址 一一對應 : 每個異常都對應著一個地址, 出現(xiàn)指定類型的異常時, 就會跳轉(zhuǎn)到該異常對應的地址執(zhí)行異常處理程序;
  • 4.注意異常向量斷點 ( 保留位 ) : 普通向量 ( Normal Vector ) 地址 0x00000014高位向量 ( High Vector ) 地址 0xFFFF0014 暫時沒有使用, 為今后的擴展保留;







二. 異常向量表代碼編寫




1. 初始化異常向量表模塊代碼



Start.S 匯編程序解析 :

  • 1.匯編參考文章 : https://blog.csdn.net/shulianghan/article/details/42408137 ;
  • 2.匯編參考手冊下載地址 : https://download.csdn.net/download/han1202012/8328375
  • 3.指明匯編代碼段 : 使用 .text 宏 指明匯編代碼段;
  • 4.標明程序入口標號 : 先使用 .global _start 將 _start 聲明成全局符號; 使用 _start: 標明程序的入口標號是 _start;
  • 5.定義標號( 類似于函數(shù)名 ) : 定義自定義標號, 格式 標號:, 例如 irq:;

    • ( 1 ) 定義標號執(zhí)行的指令 : 標號下面定義要執(zhí)行的指令, 如果想要執(zhí)行標號下面的指令, 直接跳轉(zhuǎn)到對應標號即可;
    • ( 2 ) 異常執(zhí)行的代碼內(nèi)容 : 在下面代碼的 27 ~ 49 行就是定義了 7 個異常執(zhí)行操作的 標號 以及要執(zhí)行的指令 nop; 這些都是異常發(fā)生的時候要處理的代碼;
    • ( 3 ) 代碼示例 : 下面代碼定義了一個 irq 標號, 跳轉(zhuǎn)到該標號即開始執(zhí)行標號下的代碼 nop, irq : nop;
  • 6.空操作 : 如果在某個位置執(zhí)行指令, 不想做任何操作, 可以使用 nop 表示 什么操作都不執(zhí)行;

  • 7.定義標號 ( 類似于變量 ) : 定義一個標號, 在標號中存放 32 位的值, 定義格式 標號: .word 存儲值的內(nèi)容;

    • ( 1 ) 示例 : _irq: .word irq, 定義 _irq 標號, .word 表示該標號存儲的是 32 位值, 這個值的大小就是 irq 地址;
  • 8.分支指令 : 當異常發(fā)生的時候, 需要跳轉(zhuǎn)到對應的異常處理指令中;

    • ( 1 ) 分支指令語法格式 : b{條件} 地址, 如果①滿足條件, 就跳轉(zhuǎn)到 地址 位置, 如果②不滿足條件, 就執(zhí)行下面的語句, ③如果沒有條件, 就是 100% 執(zhí)行;
    • ( 2 ) 代碼示例 : b reset, 異常發(fā)生時, 直接跳轉(zhuǎn)到 reset 標號處執(zhí)行代碼;
  • 9.裝載指令 :

    • ( 1 ) 裝載指令語法格式 : ldr 寄存器, 地址, 將 地址 中存放的數(shù)據(jù) 裝載 到 寄存器中;
    • ( 2 ) 代碼示例 :
      • a.定義標號 ( 函數(shù) ) : 定義要執(zhí)行的指令的標號 irq , 即跳轉(zhuǎn)到該標號處, 就開始執(zhí)行標號下面的指令, irq : nop ;
      • b.定義標號 ( 變量 ) : 定義一個標號 _irq , 用于存放一個 32 位的值, 這里用于存放 上面 定義的標號 地址, _irq .word irq
      • c.裝載地址到 pc 寄存器 : ldr pc, _irq, 將 _irq 標號中存放的值, 這個值是 irq 標號的地址, 就是跳轉(zhuǎn)到該地址去執(zhí)行指令;
  • 10.完整匯編代碼示例 :
@**************************** @File:start.S @ @異常處理框架 @**************************** .text @ 宏 指明代碼段 .global _start @ 偽指令聲明全局開始符號 _start: @ 程序入口標志 b reset @ reset 復位異常 ldr pc, _undefined_instruction @ 未定義異常, 將 _undefined_instruction 值裝載到 pc 指針中 ldr pc, _software_interrupt @ 軟中斷異常 ldr pc, _prefetch_abort @ 預取指令異常 ldr pc, _data_abort @ 數(shù)據(jù)讀取異常 ldr pc, _not_used @ 占用 0x00000014 地址 ldr pc, _irq @ 普通中斷異常 ldr pc, _fiq @ 軟中斷異常 _undefined_instruction: .word undefined_instruction @ _undefined_instruction 標號存放了一個值, 該值是 32 位地址 undefined_instruction, undefined_instruction 是一個地址 _software_interrupt: .word software_interrupt @ 軟中斷異常 _prefetch_abort: .word prefetch_abort @ 預取指令異常 處理 _data_abort: .word data_abort @ 數(shù)據(jù)讀取異常 _not_used: .word not_used @ 空位處理 _irq: .word irq @ 普通中斷處理 _fiq: .word fiq @ 快速中斷處理 undefined_instruction: @ undefined_instruction 地址存放要執(zhí)行的內(nèi)容 nop software_interrupt: @ software_interrupt 地址存放要執(zhí)行的內(nèi)容 nop prefetch_abort: @ prefetch_abort 地址存放要執(zhí)行的內(nèi)容 nop data_abort: @ data_abort 地址存放要執(zhí)行的內(nèi)容 nop not_used: @ not_used 地址存放要執(zhí)行的內(nèi)容 nop irq: @ irq 地址存放要執(zhí)行的內(nèi)容 nop fiq: @ fiq 地址存放要執(zhí)行的內(nèi)容 nop reset: @ reset 地址存放要執(zhí)行的內(nèi)容 nop




2. 鏈接器腳本


gboot.lds 鏈接器腳本 代碼解析 :

  • 1.指明輸出格式 ( 處理器架構(gòu) ) : 使用 OUTPUT_ARCH(架構(gòu)名稱) 指明輸出格式, 即處理器的架構(gòu), 這里是 arm 架構(gòu)的, OUTPUT_ARCH(arm) ;
  • 2.指明輸出程序的入口 : 設置編譯輸出的程序入口位置, 語法為 ENTRY(入口位置), 在上面的 Start.S 中設置的程序入口是 _start, 代碼為 ENTRY(_start) ;
  • 3.設置代碼段 : 使用 .text : 設置代碼段;
  • 4.設置數(shù)據(jù)段 : 使用 .data : 設置數(shù)據(jù)段;
  • 5.設置 BSS 段 : 使用 .bss : 設置 BSS 段;
    • ( 1 ) 記錄 BSS 段的起始地址 : bss_start = .; ;
    • ( 2 ) 記錄 BSS 段的結(jié)束地址 : bss_end = .; ;
  • 6.對齊 : 每個段都需要設置內(nèi)存的對齊格式, 使用 . = ALIGN(4); 設置四字節(jié)對齊即可;
  • 7.代碼示例 :
OUTPUT_ARCH(arm) /*指明處理器結(jié)構(gòu)*/ ENTRY(_start) /*指明程序入口 在 _start 標號處*/ SECTIONS { . = 0x50008000; /*整個程序鏈接的起始位置, 根據(jù)開發(fā)板確定, 不同開發(fā)板地址不一致*/ . = ALIGN(4); /*對齊處理, 每段開始之前進行 4 字節(jié)對齊*/ .text : /*代碼段*/ { start.o (.text) /*start.S 轉(zhuǎn)化來的代碼段*/ *(.text) /*其它代碼段*/ } . = ALIGN(4); /*對齊處理, 每段開始之前進行 4 字節(jié)對齊*/ .data : /*數(shù)據(jù)段*/ { *(.data) } . = ALIGN(4); /*對齊處理, 每段開始之前進行 4 字節(jié)對齊*/ bss_start = .; /*記錄 bss 段起始位置*/ .bss : /*bss 段*/ { *(.bss) } bss_end = .; /*記錄 bss 段結(jié)束位置*/ }




3. Makefile 編譯腳本


makefile 文件編寫 :

  • 1.通用規(guī)則 ( 匯編文件編譯規(guī)則 ) : 匯編文件 編譯 成同名的 .o 文件, 文件名稱相同, 后綴不同, %.o : %.S, 產(chǎn)生過程是 arm-linux-gcc -g -c $^ , 其中 ^ 標識是所有的依賴文件, 在該規(guī)則下 start.S 會被變異成 start.o ;
  • 2.通用規(guī)則 ( C 文件編譯規(guī)則 ) : C 代碼編譯成同名的 .o 文件, %.o : %.c , 產(chǎn)生過程是 arm-linux-gcc -g -c $^ ;
  • 3.設置最終目標 : 使用 all: 設置最終編譯目標;
    • ( 1 ) 依賴文件 : 產(chǎn)生最終目標需要依賴 start.o 文件, 使用 all: start.o 表示最終目標需要依賴該文件;
    • ( 2 ) 鏈接過程 : arm-linux-ld -Tgboot.lds -o gboot.elf $^, 需要使用鏈接器腳本進行連接, ①鏈接工具是 arm-linux-ld 工具, ②使用 -Tgboot.lds 設置鏈接器腳本 是剛寫的 gboot.lds 鏈接器腳本, ③輸出文件是 gboot.elf 這是個中間文件, ④ 依賴文件是 $^ 代表所有的依賴;
    • ( 3 ) 轉(zhuǎn)換成可執(zhí)行二進制文件 : arm-linux-objcopy -O binary gboot.elf gboot.bin, 使用 -O binary 設置輸出二進制文件, 依賴文件是 gboot.elf, 輸出的可執(zhí)行二進制文件 即 結(jié)果是 gboot.bin ;
  • 4.makefile 文件內(nèi)容 :
all: start.o #依賴于 start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ #使用鏈接器腳本, 將 start.o 轉(zhuǎn)為 gboot.elf arm-linux-objcopy -O binary gboot.elf gboot.bin #將 gboot.elf 轉(zhuǎn)化為可以直接在板子上執(zhí)行的 gboot.bin 文件 %.o : %.S #通用規(guī)則, 如 start.o 是由 start.S 編譯來的, -c 是只編譯不鏈接 arm-linux-gcc -g -c $^ %.o : %.c #通用規(guī)則, 如 start.o 是由 start.c 編譯來的, -c 是只編譯不鏈接 arm-linux-gcc -g -c $^ .PHONY: clean clean: #清除編譯信息 rm *.o *.elf *.bin




4. 編譯輸出可執(zhí)行文件


編譯過程 :

  • 1.文件準備 : 將 匯編代碼 ( start.S ) 鏈接器腳本 ( gboot.lds ) makefile 文件 拷貝到編譯目錄 ;
  • 2.執(zhí)行編譯命令 : make ;
  • 3.編譯結(jié)果 : 可以看到 生成了 編譯目標文件 start.o, 鏈接文件 gboot.elf, 可執(zhí)行的二進制文件 gboot.bin ;


本博客的參考文章及相關(guān)資料下載 :

  • 1.ARM 架構(gòu)參考手冊 ( ARM Architecture Reference Manual ) : https://download.csdn.net/download/han1202012/8324641
  • 2.匯編參考手冊 : https://download.csdn.net/download/han1202012/8328375
  • 3.本博客代碼下載 : https://download.csdn.net/download/han1202012/10392901


總結(jié)

以上是生活随笔為你收集整理的【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品第一页 | 中文字幕一区二区三区乱码人妻 | 一级片播放 | 欧美aaaaaa | 公交顶臀绿裙妇女配视频 | 免费中文字幕 | 免费av在线电影 | 国产精品久久久一区二区 | 永久免费精品 | 香蕉视频网页版 | 欧美黄色小说 | 成人午夜影院在线观看 | 天天天天| 亚洲三级大片 | 日本视频免费在线播放 | 欧美性xxxxxx | 婷婷综合av | 国产成人无码www免费视频播放 | 欧美黑人性xxx猛交 少妇无套内谢久久久久 | 日日综合网 | ass日本| 极品尤物一区二区 | 99视频精品免费 | 动漫美女隐私无遮挡 | 国产鲁鲁视频在线观看特色 | 欧美区一区二 | 黄色在线小视频 | 黄色片一级 | 日韩免费高清一区二区 | 91毛片观看| 国产精品jizz视频 | 欧美福利网站 | 婷婷激情视频 | 日韩欧美一区二区三区四区 | 黄色国产在线播放 | 欧美1级片 | 色涩色| 日本精品三级 | 亚洲综合日韩在线 | 日韩激情在线视频 | 国产在线97 | 91在线观| 国产精品黄 | 丁香花高清视频完整电影 | 秘密爱大尺度做爰呻吟 | 91色多多| 天天干天天爱天天操 | aa成人| 黑人一级 | 国产刺激高潮av | 亚洲精选久久 | 欧美精品一区在线观看 | 黄色一机片 | 国产精品久久九九 | 日韩精品中文字幕一区 | 国产青青操 | 国家队动漫免费观看在线观看晨光 | 天天射天天操天天干 | 久久久久免费观看 | 日韩欧美网址 | 天天干夜夜添 | 欧美影院久久 | 亚洲第1页| 成人性生交大片免费 | 欧美性猛交乱大交 | 精品国产乱码久久久久久蜜柚 | 欧产日产国产精品 | 超碰碰97| 免费黄色在线网址 | 国产自产在线 | 成人aⅴ视频 | 成人综合网站 | 一区二区三区av在线 | 成人伊人网 | 香蕉久久av一区二区三区 | 欧美在线综合 | 精品日韩在线观看 | 爱啪啪网站 | 天天天av| 国产精品入口麻豆九色 | 红桃视频国产 | 美女av片 | 免费观看污 | 欧美交 | 黄色小说视频网站 | 美女扒开大腿让男人桶 | 美女久久久 | 自拍视频一区 | 久久艹影院 | 日日摸天天添天天添破 | 日本一区二区三区免费在线观看 | 四虎黄色网址 | 国产精品一线二线三线 | 色伊人av | 国产精品21p | 色播五月综合 | 三级91| 欧美日韩三区 | 影音先锋亚洲一区 |