www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 實(shí)驗(yàn)的目的:當(dāng)TQ2440開(kāi)發(fā)板的按鍵按下的時(shí)候,觸發(fā)中斷,點(diǎn)亮LED燈。實(shí)驗(yàn)的源程序:/**************************************************************************************s3c24xx.h************

實(shí)驗(yàn)的目的:
當(dāng)TQ2440開(kāi)發(fā)板的按鍵按下的時(shí)候,觸發(fā)中斷,點(diǎn)亮LED燈。


實(shí)驗(yàn)的源程序:
/*************************************************************************************
*s3c24xx.h
*************************************************************************************/
/* WOTCH DOG register */
#define WTCON (*(volatile unsigned long *)0x53000000)


/* SDRAM regisers */
#define MEM_CTL_BASE 0x48000000
#define SDRAM_BASE 0x30000000


/* NAND Flash registers */
#define NFCONF (*(volatile unsigned int *)0x4e000000)
#define NFCMD (*(volatile unsigned char *)0x4e000004)
#define NFADDR (*(volatile unsigned char *)0x4e000008)
#define NFDATA (*(volatile unsigned char *)0x4e00000c)
#define NFSTAT (*(volatile unsigned char *)0x4e000010)


/*GPIO registers*/
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)


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


#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
#define GPGUP (*(volatile unsigned long *)0x56000068)


#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHDAT (*(volatile unsigned long *)0x56000074)
#define GPHUP (*(volatile unsigned long *)0x56000078)


/*UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)


/*interrupt registes*/
#define SRCPND (*(volatile unsigned long *)0x4A000000)
#define INTMOD (*(volatile unsigned long *)0x4A000004)
#define INTMSK (*(volatile unsigned long *)0x4A000008)
#define PRIORITY (*(volatile unsigned long *)0x4A00000c)
#define INTPND (*(volatile unsigned long *)0x4A000010)
#define INTOFFSET (*(volatile unsigned long *)0x4A000014)
#define SUBSRCPND (*(volatile unsigned long *)0x4A000018)
#define INTSUBMSK (*(volatile unsigned long *)0x4A00001c)


/*external interrupt registers*/
#define EINTMASK (*(volatile unsigned long *)0x560000a4)
#define EINTPEND (*(volatile unsigned long *)0x560000a8)



@******************************************************************************
@ File:head.S
@ 功能:初始化,設(shè)置中斷模式、管理模式的棧,設(shè)置好中斷處理函數(shù)
@******************************************************************************

.extern main
.text
.global _start
_start:
@******************************************************************************
@ 異常向量,本程序中,除Reset和HandleIRQ外,其它異常都沒(méi)有使用
@******************************************************************************
b Reset


@ 0x04: 未定義指令中止模式的向量地址
HandleUndef:
b HandleUndef

@ 0x08: 管理模式的向量地址,通過(guò)SWI指令進(jìn)入此模式
HandleSWI:
b HandleSWI


@ 0x0c: 指令預(yù)取終止導(dǎo)致的異常的向量地址
HandlePrefetchAbort:
b HandlePrefetchAbort


@ 0x10: 數(shù)據(jù)訪(fǎng)問(wèn)終止導(dǎo)致的異常的向量地址
HandleDataAbort:
b HandleDataAbort


@ 0x14: 保留
HandleNotUsed:
b HandleNotUsed


@ 0x18: 中斷模式的向量地址
b HandleIRQ


@ 0x1c: 快中斷模式的向量地址
HandleFIQ:
b HandleFIQ


Reset:
ldr sp, =4096 @ 設(shè)置棧指針,以下都是C函數(shù),調(diào)用前需要設(shè)好棧
bl disable_watch_dog @ 關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟

msr cpsr_c, #0xd2 @ 進(jìn)入中斷模式
ldr sp, =3072 @ 設(shè)置中斷模式棧指針


msr cpsr_c, #0xd3 @ 進(jìn)入管理模式
ldr sp, =4096 @ 設(shè)置管理模式棧指針,
@ 其實(shí)復(fù)位之后,CPU就處于管理模式,
@ 前面的“l(fā)dr sp, =4096”完成同樣的功能,此句可省略


bl init_led @ 初始化LED的GPIO管腳
bl init_irq @ 調(diào)用中斷初始化函數(shù),在init.c中
msr cpsr_c, #0x53 @ 設(shè)置I-bit=0,開(kāi)IRQ中斷

ldr lr, =halt_loop @ 設(shè)置返回地址
ldr pc, =main @ 調(diào)用main函數(shù)
halt_loop:
b halt_loop


HandleIRQ:
sub lr, lr, #4 @ 計(jì)算返回地址
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
@ 注意,此時(shí)的sp是中斷模式的sp
@ 初始值是上面設(shè)置的3072

ldr lr, =int_return @ 設(shè)置調(diào)用ISR即EINT_Handle函數(shù)后的返回地址
ldr pc, =EINT_Handle @ 調(diào)用中斷服務(wù)函數(shù),在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復(fù)制到cpsr

======================================================

注:ARM9的異常向量表:


======================================================

/**************************************************************************************************
*%20init.c:%20進(jìn)行一些初始化
*************************************************************************************************/


#include%20"s3c24xx.h"


/*
*%20LED1,LED2,LED4對(duì)應(yīng)GPB5、GPB6、GPB7、GPB8
*/
#define%20GPB5_out%20(1<<(5*2))
#define%20GPB6_out%20(1<<(6*2))
#define%20GPB7_out%20(1<<(7*2))
#define%20GPB8_out%20(1<<(8*2))


#define%20GPB5_msk%20(3<<(5*2))
#define%20GPB6_msk%20(3<<(6*2))
#define%20GPB7_msk%20(3<<(7*2))
#define%20GPB8_msk%20(3<<(8*2))


/*
*%20K1,K2,K3,K4對(duì)應(yīng)GPF1、GPF4、GPF2、GPF0
*/
#define%20GPF0_int%20%20%20(0x2<<(0*2))
#define%20GPF1_int%20%20%20(0x2<<(1*2))
#define%20GPF2_int%20%20%20(0x2<<(2*2))
#define%20GPF4_int%20%20%20(0x2<<(4*2))


#define%20GPF0_msk%20%20(3<<(0*2))
#define%20GPF1_msk%20%20(3<<(1*2))
#define%20GPF2_msk%20%20(3<<(2*2))
#define%20GPF4_msk%20%20(3<<(4*2))


/*
*%20關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟
*/
void%20disable_watch_dog(void)
{
%20%20WTCON%20=%200;%20//%20關(guān)閉WATCHDOG很簡(jiǎn)單,往這個(gè)寄存器寫(xiě)0即可
}


void%20init_led(void)
{
//%20LED1,LED2,LED3,LED4對(duì)應(yīng)的4根引腳設(shè)為輸出
GPBCON%20&=%20~(GPB5_msk%20"%20GPB6_msk%20|%20GPB7_msk%20|%20GPB8_msk);
GPBCON%20|=%20GPB5_out%20|%20GPB6_out%20|%20GPB7_out%20|%20GPB8_out;
}


/*
*%20初始化GPIO引腳為外部中斷
*%20GPIO引腳用作外部中斷時(shí),默認(rèn)為低電平觸發(fā)、IRQ方式(不用設(shè)置INTMOD)
*/
void%20init_irq(%20)
{
//%20K1,K2,K3,K4對(duì)應(yīng)的4根引腳設(shè)為中斷功能
GPFCON%20&=%20~(GPF0_msk%20|%20GPF1_msk%20|%20GPF2_msk%20|%20GPF4_msk);
GPFCON%20|=%20GPF0_int%20|%20GPF1_int%20|%20GPF2_int%20|%20GPF4_int;


%20%20//%20對(duì)于EINT4,需要在EINTMASK寄存器中使能它
%20%20EINTMASK%20&=%20~(1<<4);
%20%20%20%20%20
%20%20/*
%20%20*%20設(shè)定優(yōu)先級(jí):
%20%20*%20ARB_SEL0%20=%2000b,%20ARB_MODE0%20=%200:%20REQ1%20>%20REQ2%20>%20REQ3,即EINT0%20>%20EINT1%20>%20EINT2
%20%20*%20仲裁器1、6無(wú)需設(shè)置
%20%20*%20最終:
%20%20*%20EINT0%20>%20EINT1>%20EINT2%20>%20EINT4%20即K4%20>%20K1%20>%20K3%20>%20K2
%20%20*/
%20%20PRIORITY%20=%20(PRIORITY%20&%20((~0x01)%20|%20~(0x3<<7)));


%20%20//%20EINT0、EINT1、EINT2、EINT4_7使能
%20%20INTMSK%20%20&=%20(~(1<<0))%20&%20(~(1<<1))%20&%20(~(1<<2))%20&%20(~(1<<4));
}



/*******************************************************************************************
*interrupt.c
*******************************************************************************************/
#include%20"s3c24xx.h"


void%20EINT_Handle()
{
%20%20unsigned%20long%20oft%20=%20INTOFFSET;
%20%20unsigned%20long%20val;


/*
*%20K1,K2,K3,K4對(duì)應(yīng)GPF1、GPF4、GPF2、GPF0
*%20%20%20%20%20%20即%20EINT1,%20ETIN4,%20EINT2,%20EINT0
*%20%20%20%20%20%20oft為%201,%204,%202,%200%20(對(duì)應(yīng)INTMSK寄存器)
*/
%20
%20%20switch(%20oft%20)
%20%20{
%20%20%20%20//%20K1被按下
%20%20%20%20case%201:
%20%20%20%20{%20
%20%20%20%20%20%20GPBDAT%20|=%20(0xF<<5);%20%20//%20所有LED熄滅
%20%20%20%20%20%20GPBDAT%20&=%20~(1<<5);%20%20%20//%20LED1點(diǎn)亮
%20%20%20%20%20%20break;
%20%20%20%20}
%20%20%20
%20%20%20%20//%20K2被按下
%20%20%20%20case%204:
%20%20%20%20{%20
%20%20%20%20%20%20GPBDAT%20|=%20(0xF<<5);%20%20//%20所有LED熄滅
%20%20%20%20%20%20GPBDAT%20&=%20~(1<<6);%20%20%20//%20LED2點(diǎn)亮
%20%20%20%20%20%20break;
%20%20%20%20}


%20%20%20%20//%20K3被按下
%20%20%20%20case%202:
%20%20%20%20{%20
%20%20%20%20%20%20GPBDAT%20|=%20(0xF<<5);%20%20//%20所有LED熄滅
%20%20%20%20%20%20GPBDAT%20&=%20~(1<<7);%20%20%20//%20LED3點(diǎn)亮
%20%20%20%20%20%20break;
%20%20%20%20}


%20%20%20%20//%20K4被按下
%20%20%20%20case%200:
%20%20%20%20{%20
%20%20%20%20%20%20GPBDAT%20|=%20(0xF<<5);%20%20//%20所有LED熄滅
%20%20%20%20%20%20GPBDAT%20&=%20~(1<<8);%20%20%20//%20LED4點(diǎn)亮
%20%20%20%20%20%20break;
%20%20%20%20}


%20%20%20%20default:
%20%20%20%20%20%20break;
%20%20}


%20%20//清中斷
%20%20if(%20oft%20==%204%20)
%20%20%20%20EINTPEND%20=%20(1<<4);%20%20//%20EINT4_7合用IRQ4
%20%20SRCPND%20=%201<%20%20INTPND%20=%201<}



/*****************************************************************************
*main.c
*****************************************************************************/
int%20main()
{
%20%20while(1);
%20%20return%200;
}


/************************************************************************************
*Makefile
************************************************************************************/

objs%20:=%20head.o%20init.o%20interrupt.o%20main.o

int.bin:%20$(objs)
arm-linux-ld%20-Ttext%200x00000000%20-o%20int_elf%20$^
arm-linux-objcopy%20-O%20binary%20-S%20int_elf%20$@
arm-linux-objdump%20-D%20-m%20arm%20int_elf%20>%20int.dis

%.o:%.c
arm-linux-gcc%20-Wall%20-O2%20-c%20-o%20$@%20$<


%.o:%.S
arm-linux-gcc%20-Wall%20-O2%20-c%20-o%20$@%20$<


clean:
rm%20-f%20int.bin%20int_elf%20int.dis%20*.o



實(shí)驗(yàn)的問(wèn)題總結(jié):
I.剛開(kāi)始程序會(huì)執(zhí)行head.S文件,第一條指令是b%20reset指令。在reset中,我們可以知道:
設(shè)置了reset模式下的棧,因?yàn)槲覀冎笮枰{(diào)用C語(yǔ)言函數(shù),而C語(yǔ)言函數(shù)的局部變量是需要棧來(lái)保存的。
然后我們可以看到,執(zhí)行了這樣一條指令:msr%20cpsr_c,%20#0xd2
其原因可以看一下解釋?zhuān)?br/>
/***************************MRS%20和%20MSR*********************************
%20%20MRS%20R0,%20CPSR%20%20%20%20%20%20%20%20讀取CPSR的內(nèi)容寫(xiě)入R0
%20%20MSR%20CPSR,%20R0%20%20%20%20%20%20%20%20讀取R0的內(nèi)容寫(xiě)入CPSR
%20%20MSR%20CPSR_f,%20R0%20%20%20%20%20%20%20讀取R0的24-31的內(nèi)容寫(xiě)入CPSR的24-31bit
%20%20MSR%20CPSR_c,%20R0%20%20%20%20%20%20%20讀取R0的0-7的內(nèi)容寫(xiě)入CPSR的0-7bit
%20%20MSR%20CPSR_fc,%20R0%20
%20%20MSR%20CPSR_f,%20#0xf0000000%20%20將0xf寫(xiě)入CPSR的24-31bit
%20%20所有的CPSR可以替換成SPSR
***************************MRS%20和%20MSR*********************************/

/****************************CPSR***********************************
CPSR格式如下所示。SPSR和CPSR格式相同。
31%20%20%2030%20%20%2029%20%2028%20%20%2027%20%20%2026%20%20%20%20%20%20%20%207%20%20%206%20%20%205%20%20%204%20%20%203%20%20%202%20%20%201%20%20%200
N%20%20%20Z%20%20%20C%20%20%20V%20%20%20Q%20%20%20DNM(RAZ)%20%20%20%20%20I%20%20%20F%20%20%20T%20%20%20M4%20%20M3%20%20M2%20%20M1%20%20M0


***條件標(biāo)志位***
N——本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit[31]的值。當(dāng)兩個(gè)表示的有符號(hào)整數(shù)運(yùn)算時(shí),n=1表示運(yùn)算結(jié)果為負(fù)數(shù),n=0表示結(jié)果為正書(shū)或零。
Z——z=1表示運(yùn)算的結(jié)果為零;z=0表示運(yùn)算的結(jié)果不為零。對(duì)于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。
C——下面分四種情況討論C的設(shè)置方法:
在加法指令中(包括比較指令CMP),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無(wú)符號(hào)運(yùn)算發(fā)生上溢出;其他情況C=0。
在減法指令中(包括減法指令CMP),當(dāng)運(yùn)算中發(fā)生錯(cuò)位,則C=0,表示無(wú)符號(hào)運(yùn)算數(shù)發(fā)生下溢出;其他情況下C=1。
對(duì)于包含移位操作的非加減運(yùn)算指令,C中包含最后一次溢出的的位的數(shù)值。對(duì)于其他非加減運(yùn)算指令,C位的值通常不受影響。
V——對(duì)于加減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)為溢出;通常其他指令不影響V位。
***Q標(biāo)識(shí)位***
在ARM%20V5的E系列處理器中,CPSR的bit[27]稱(chēng)為q標(biāo)識(shí)位,主要用于指示增強(qiáng)的dsp指令是否發(fā)生了溢出。同樣的spsr的bit[27]位也稱(chēng)為q標(biāo)識(shí)位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)識(shí)位。
在ARM%20V5以前的版本及ARM%20V5的非E系列的處理器中,Q標(biāo)識(shí)位沒(méi)有被定義。
***CPSR中的控制位***
CPSR的低八位I、F、T、M[4:0]統(tǒng)稱(chēng)為控制位。當(dāng)異常中斷發(fā)生時(shí)這些位發(fā)生變化。在特權(quán)級(jí)的處理器模式下,軟件可以修改這些控制位。
**中斷禁止位I,F:當(dāng)I=1時(shí)禁止IRQ中斷,當(dāng)F=1時(shí)禁止FIQ中斷
**T控制位:T控制位用于控制指令執(zhí)行的狀態(tài),即說(shuō)明本指令是ARM指令還是Thumb指令。對(duì)于ARM%20V4以更高版本的T系列ARM處理器,T控制位含義如下:
T=0表示執(zhí)行ARM指令
T=1表示執(zhí)行Thumb指令
對(duì)于ARM%20V5以及更高版本的非T系列處理器,T控制位的含義如下
T=0表示執(zhí)行ARM指令
T=1表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生未定指令中斷
***M控制位***
M控制位控制處理器模式,具體含義如下:
M[4:0]%20處理器模式%20%20可訪(fǎng)問(wèn)的寄存器
ob10000%20user%20%20%20pc,r14~r0,CPSR
0b10001%20FIQ%20%20%20PC,R14_FIQ-R8_FIQ,R7~R0,CPSR,SPSR_FIQ
0b10010%20IRQ%20%20%20PC,R14_IRQ-R13_IRQ,R12~R0,CPSR,SPSR_IRQ
0B10011%20SUPERVISOR%20%20PC,R14_SVC-R13_SVC,R12~R0,CPSR,SPSR_SVC
0b10111%20ABORT%20%20%20PC,R14_ABT-R13_ABT,R12~R0,CPSR,SPSR_ABT
0b11011%20UNDEFINEED%20%20PC,R14_UND-R8_UND,R12~R0,CPSR,SPSR_UND
0b11111%20SYSTEM%20%20%20PC,R14-R0,CPSR(ARM%20V4以及更高版本)
*****************************CPSR*************************************/
看完這兩點(diǎn),你就知道為什么要設(shè)置的值為#0xd2。接下來(lái)是設(shè)置中斷模式下的棧指針。同上,因?yàn)槊糠N模式下的棧寄存器是不共用的。


II.接下來(lái),我們重點(diǎn)看一下ldr%20lr,%20=halt_loop%20這條指令,為什么在調(diào)用main函數(shù)之前需要設(shè)置lr寄存器呢?不設(shè)置難道不可以么?
具體解釋如下:
在跳轉(zhuǎn)的時(shí)候,PC的值會(huì)賦給lr寄存器。
在匯編調(diào)用C語(yǔ)言的時(shí)候,不一定非得配置lr寄存器,這要看你調(diào)用完C語(yǔ)言后想再往下執(zhí)行哪條指令,
若接下來(lái)執(zhí)行的指令剛好是C語(yǔ)言完了之后的這條指令,那么這種情況下可以不用設(shè)置,因?yàn)镃PU會(huì)自動(dòng)將lr%20=%20lr%20-%204,
也就是接下來(lái)該執(zhí)行的一條指令,若你想再調(diào)用C語(yǔ)言之后,是跳轉(zhuǎn)到某處的一標(biāo)號(hào),此時(shí)需要設(shè)置lr。

III.接下來(lái),若發(fā)生中斷的時(shí)候,CPU會(huì)自動(dòng)讓PC跳轉(zhuǎn)到HandleIRQ%20去執(zhí)行對(duì)應(yīng)的指令。
然后,我們可以看到:sub%20lr,%20lr,%20#4
為什么要將lr的值減4呢?具體解釋如下:


/***************************************************************************
我們知道在ARM 架構(gòu)里,PC值指向當(dāng)前執(zhí)行指令的地址加8處,也就是說(shuō), 當(dāng)執(zhí)行指令A(yù)(地址0x8000)時(shí),PC 等于指令C 的地址(0x8008)。
假如指令A(yù) 是“BL”指令,則當(dāng)執(zhí)行該指令時(shí),會(huì)把PC(=0x8008)保存到LR 寄存器里面,但是接下去處理器會(huì)馬上對(duì)LR 進(jìn)行一個(gè)自動(dòng)的調(diào)整動(dòng)作:
LR=LR-0x4。這樣,最終保存在 LR 里面的是 B 指令的地址,所以當(dāng)從 BL 返回時(shí),LR 里面正好是正確的返回地址。同樣的調(diào)整機(jī)制在所有LR
自動(dòng)保存操作中都存在,比如進(jìn)入中斷響應(yīng)時(shí),處理器所做的LR 保存中,也進(jìn)行了一次自動(dòng)調(diào)整,并且調(diào)整動(dòng)作都是LR=LR-0x4。


下面,我們對(duì)不同類(lèi)型的異常的返回地址依次進(jìn)行說(shuō)明:
假設(shè)在指令A(yù) 處(地址0x8000)發(fā)生了異常,進(jìn)入異常響應(yīng)后,LR 上經(jīng)過(guò)調(diào)整保存的地址值應(yīng)該是B 的地址0x8004。
1、 如果發(fā)生的是軟件中斷,即A 是“SWI”指令
異常是由指令本身引起的,從 SWI 中斷返回后下一條執(zhí)行指令就是B,正好是LR 寄存器保存的地址, 所以只要直接把LR 恢復(fù)給PC。
MOVS pc, lr
2、 發(fā)生的是Undefined instruction異常
異常是由指令本身引起的,從異常返回后下一條執(zhí)行指令就是B,正好是LR 寄存器保存的地址, 所以只要直接把LR 恢復(fù)給PC。
MOVS pc, lr
3、 發(fā)生的是IRQ或FIQ中斷
因?yàn)橹噶畈豢赡鼙恢袛啻驍?,所以A指令執(zhí)行完以后才能響應(yīng)中斷,此時(shí)PC已更新,指向指令D的地址(地址0x800C),
LR 上經(jīng)過(guò)調(diào)整保存的地址值是C 的地址0x8008。中斷返回后應(yīng)該執(zhí)行B指令,所以返回操作是:
SUBS pc, lr, #4
4、 發(fā)生的是Prefetch Abort異常
該異常并不是處理器試圖從一個(gè)非法地址取指令時(shí)觸發(fā),取出的指令只是被標(biāo)記為非法,按正常處理流程放在流水線(xiàn)上,
在執(zhí)行階段觸發(fā)Prefetch Abort異常,此時(shí)LR 上經(jīng)過(guò)調(diào)整保存的地址值是B 的地址0x8004。異常返回應(yīng)該返回到A指令,
嘗試重新取指令,所以返回操作是:
SUBS pc, lr, #4
5、 發(fā)生的是“Data Abort”
CPU訪(fǎng)問(wèn)存儲(chǔ)器時(shí)觸發(fā)該異常,此時(shí)PC指向指令D的地址(地址0x800C),LR 上經(jīng)過(guò)調(diào)整保存的地址值是C 的地址0x8008。
異常返回后,應(yīng)回到指令A(yù),嘗試重新操作存儲(chǔ)器,所以返回操作是:
SUBS pc, lr, #8
****************************************************************************/
這就是為什么我們需要將lr的值減4,具體可以參考我轉(zhuǎn)載的博客。

IV.然后我們可以看得這樣一條指令:stmdb sp!, { r0-r12,lr },它是和ldmia sp!, { r0-r12,pc }^ 指令對(duì)應(yīng)起來(lái)的。
在跳轉(zhuǎn)到中斷服務(wù)程序之前,先保存用到的寄存器,在完成中斷服務(wù)程序之后,又恢復(fù)寄存器。其中,lr和pc是對(duì)應(yīng)起來(lái)的。
也就是說(shuō),恢復(fù)寄存器后,pc中保存的值是lr寄存器中的。所以當(dāng)執(zhí)行完這條指令之后,就又跳回來(lái)了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉