智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常,可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題,下面給大家分享一下。

一、Arm的中斷。
1.觸發異常
2.保存現場
3.cpu進入異常工作模式,程序指針(pc)跳入異常入口(處理異常的代碼地址)
a.分辨中斷源
b.進行邏輯處理
c.清理工作
4.恢復現場
流程圖(來源于《2440數據手冊》)如下:

這里的工作模式,其實就是不同情況下,cpu有一組不同的寄存器。正是有了不同的寄存器,程序在可以在不同的狀態下來回切換。如下圖:

中斷例子的匯編代碼如下:

b Reset

@******************一堆設置代碼已省略************************************************* Reset:
ldr sp, =4096 @ 設置棧指針,以下都是C函數,調用前需要設好棧
bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重啟
msr cpsr_c, #0xd2 @ 進入中斷模式,d的前兩位是11,意思是關閉所有的中斷
ldr sp, =3072 @ 設置中斷模式棧指針
msr cpsr_c, #0xd3 @ 進入管理模式
ldr sp, =4096 @ 設置管理模式棧指針,
@ 其實復位之后,CPU就處于管理模式,
@ 前面的“ldr sp, =4096”完成同樣的功能,此句可省略
bl init_led @ 初始化LED的GPIO管腳
bl init_irq @ 調用中斷初始化函數,在init.c中
msr cpsr_c, #0x53 @ 設置I-bit=0,開IRQ中斷
ldr lr, =halt_loop @ 設置返回地址
ldr pc, =main @ 調用main函數
halt_loop:
b halt_loop
@中斷函數
HandleIRQ:
sub lr, lr, #4 @ 計算返回地址,arm架構規定的
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器,保存現場
@ 注意,此時的sp是中斷模式的sp
@ 初始值是上面設置的3072
ldr lr, =int_return @ 設置調用ISR即EINT_Handle函數后的返回地址
ldr pc, =EINT_Handle @ 調用中斷服務函數,在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復制到cpsr

EINT_Handle 函數的實現就是判斷是那個按鈕然后點相應的燈,我這里就不復制代碼了。
msr cpsr_c指令值的來源如下圖(來源于《嵌入式Linux應用開發完全手冊》):


二、java中的異常,很簡單。
try{
}catch(Exception e){
}finally{
}
不用關心什么工作模式,catch中代碼命中就執行,finally里的代碼一定會執行。根據自己的邏輯來寫就行了。

java中的中斷,Thread有個interrupt方法,但調用這個方法并不知道線程會在什么狀態下中斷,我沒有用過這種方式。需要中斷的話,我一般自己寫個狀態變量,在while里判斷中斷狀態做下處理。

三、硬件實現中斷。
用繼電器就可以實現開關,如下圖:

給線圈一點電壓就能切換這個開關,也就能觸發工作模式的切換了。

轉載于:https://www.cnblogs.com/chengzhong/p/7658417.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370967.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++builder提高批量動態創建panel的速度_騎行時影響速度的事項有哪些 怎樣有效提高騎行速度 單車租賃信息...

撇開人的因素在自行車的組件中對車速影響最大的幾項是什么?車重?自鎖?輪組?傳動?我的個人感受,從提高幅度上來講,而不是重要性上來講一、自鎖起碼提高你50%的速度,我不用自鎖和別人一起走AVS25就很辛苦了,用了自鎖&#xff0…

ansys matlab 調用,matlab 調用ansys (轉載)

問題的提出:我們經常會需要用ansys計算一些東西,之后再用matlab來處理計算的結果。當修改某些參數重復上述過程的時候,就比較容易出現問題——比如ansys模型中的參數和matlab程序中參數的一致性問題等。這時可以考慮采用下面的協同工作的方法…

本地存儲之sessionStorage

源碼可以到GitHub上下載! sessionStorage: 關閉瀏覽器再打開將不保存數據 復制標簽頁會連同sessionStorage數據一同復制 復制鏈接地址打開網頁不會復制seessionStorage內的數據 清除緩存加載當前頁對頁面無影響 1) 同源策略限制。若想在不同頁面之間對同…

哈希三道題

兩數之和 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。 你可以按任意…

zemax光學設計超級學習手冊_穿越十年的一個ZEMAX光學設計案例

目前超過兩千人的光學與光學設計方面的微信公眾號,歡迎您!穿越十年的一個ZEMAX光學設計案例作者:窗臺小綠蘿CAD,這個詞已經深入到學習、工作很多年,翻譯過來就是Computer Aided Design,計算機輔助設計。隨著…

Java本質和性能

最初的問題是如何計算二進制數中1的個數? 我包含了使用Integer.bitCount()的性能比較,該性能可以轉換為固有特性,即單個機器代碼指令POPCNT和執行相同功能的Java代碼。 題 如何計算二進制數中1的個數? 假…

spring RequestMapping 包含http的部分以及各部分詳解

RequestMapping有四個參數,分別為:1、value:表示請求URL2、method:表示請求方法3、params:表示請求參數4、headers:表示請求頭 【例如】:RequestMapping(value"/testRequestMapping",…

【ZBH選講·拍照】

【問題描述】 假設這是一個二次元。LYK召集了n個小伙伴一起來拍照。他們分別有自己的身高Hi和寬度Wi。為了放下這個照片并且每個小伙伴都完整的露出來,必須需要一個寬度為ΣWi,長度為max{Hi}的相框。(因為不能疊羅漢)。LYK為了節省…

php基礎是什么,php基礎學什么?

有不少同學想要學習 PHP,但又不清楚 PHP 基礎學什么,那么這篇文章告訴你。熟悉前端開發語言學習 PHP 之前,首先要學習前端語言包括 HTML、CSS、JS 等。等對前端語言有個大致掌握后,能編寫一個 web 靜態頁面。學習 PHP 基本語法和函…

名為 cursor_jinserted 的游標不存在_生鮮電商存在的問題及對策解析:未來生鮮電商如何發展?...

生鮮電商的特點有哪些?生鮮電商特點:1,生鮮電商具有粘性高、重復購買率高、毛利高的“三高”特性;2,生鮮食品需要保鮮、冷藏、冷凍;3,生鮮食品保質期比較短;保存不易、對物流配送的條件要求極高;4,生鮮商品…

遇到短信轟炸,別人換ip調你的短信接口怎么辦

前端開發者很容易暴露自己的請求地址和參數,我們都知道,一個h5頁面,按 F12 是可以看到頁面的源碼的,所以經常很多人會利用這一點惡意調取別人的接口。 我們公司出現了好多次短信接口被大量調用,導致一天發了幾萬條短信…

UVa 10170 - The Hotel with Infinite Rooms

題目:求從s開始的遞增序列(每次加1)。求出他們加和不小于D的那個最后的加數。 分析:數學題。分治。s s1 ... n n*(n1)/2 - s*(s-1)/2 (ns)*(…

番石榴函數和Java 8 Lambdas

我最近閱讀了Brian Goetz的《 Lambda的狀況》 ,在閱讀了該文章之后,我想嘗試使用Java 8 Lambda表達式。 Brian在他的文章中繼續描述了將一種方法稱為“功能”接口的接口。 功能接口幾乎總是用作匿名類,其中ActionListener是規范示例。 這些“…

linux rsync刪文件速度,為什么用rsync刪除大量文件的時候比用rm快

為什么用rsync刪除大量文件的時候比用rm快今天研究怎么在Linux下快速刪除大量文件,搜到很多人都說可以用rsync來刪除大量文件,速度比rm要快很多,但是沒有人說為什么,仔細研究了一下原因,總結起來大概就是,一…

關于源碼,反碼,補碼(正數--負數)---------(-128)自己的理解

以一個字節為例 1、無符號位,一個字節可以存放0~255共256個數字;有符號位存放-128~127共256個數字; 2、無符號全都表示為正數;有符號位則首位表示正負數,正數首位為0,負數首位為1(因此在判斷一個…

英特爾x722網卡驅動_產品詳情 | 從核心到邊緣,英特爾加速5G網絡基礎設施建設...

英特爾近期宣布推出無可比擬的5G基礎設施芯片產品組合,包括一款面向無線基站的10納米片上系統(SoC)英特爾凌動P5900,和一款面向5G網絡處理的結構化ASIC,一款針對5G網絡優化、提供基于GPS的高精度網絡服務同步功能的以太網適配器。此外&#x…

canvas離屏技術與放大鏡實現

教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步>>> (原文)canvas 離屏技術與放大鏡實現。 更多討論或者錯誤提交,也請移步。 利用canvas除了可以實現濾鏡,還可以利用離屏技術放大鏡功能。為了方…

虛擬機下安裝ubuntu后root密碼設置

問題描述: 在虛擬機下安裝了ubuntu中要輸入用戶名,一般情況下大家都會輸入一個自己的網名或綽號之類的,密碼也在這時設置過了。 但是當安裝成功之后,使用命令#su root,然后輸入剛才設置的密碼,發現密碼錯誤…

使用Ajax的Spring MVC REST調用

這篇文章提供了對Spring MVC Web應用程序的REST調用的簡單示例。 它基于在Spring MVC上下文示例中使用Spring MVC服務靜態資源和使用Ajax獲取JSON 。 該代碼可在GitHub的Spring-REST-With-Ajax目錄中找到。 主頁 我們的主頁包含與執行Ajax調用的Javascript函數鏈接的四個按鈕…

團隊作業—預則立他山之石

團隊作業—預則立&&他山之石 Deadline: 2017.10.24 22:00pm 作業要求 一、確立團隊選題,建立和初步熟悉團隊git的協作方式。項目后續的代碼、文檔都要通過github增量式管理。實現文檔的版本化和增量式管理。 二、初步確立團隊任務計劃,將團隊的任…