新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IAR下的匯編/單片機(jī)啟動(dòng)代碼匯編

IAR下的匯編/單片機(jī)啟動(dòng)代碼匯編

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
可能大家看到了在IRQ中斷向量地址中裝載的是LDR PC, [PC, #-0x0FF0]指令,這里要和大家解釋一下這條語(yǔ)句,在和大家解釋這條語(yǔ)句時(shí),希望大家去看看LPC2103的datasheet。
當(dāng)處理器開(kāi)始執(zhí)行LDR PC, [PC, #-0x0FF0]
指令,PC寄存器的值就已經(jīng)變成PC+8 = 0x20(這個(gè)不清楚的朋友必須去查詢一下《ARM+Architecture+Reference+Manual(2nd+Edition)》中的Prefetch and self-modifying code),
Result = 0x20 – 0xff0 = 0xFFFFF030(實(shí)在不知道怎么算的就用電腦自帶的計(jì)算器算算);
在查詢LPC2103數(shù)據(jù)手冊(cè)后,發(fā)現(xiàn)該地址對(duì)應(yīng)的寄存器為VICVectAddr。
在這條語(yǔ)句執(zhí)行完畢后,處理器就會(huì)跳轉(zhuǎn)到導(dǎo)致產(chǎn)生IRQ中斷,并跳轉(zhuǎn)到VICVectAddr寄存器所指向的IRQ異常處理函數(shù)中進(jìn)行操作。
實(shí)際運(yùn)用中,我們可以更改一下IRQ異常向量地址的語(yǔ)句,讓大家更加好看。更改如下:
LDR PC, [PC, #0xFFFFF020]
這條語(yǔ)句和剛才的MDK自帶的語(yǔ)句實(shí)現(xiàn)的效果是一樣的!
實(shí)例
軟件實(shí)現(xiàn)中斷處理過(guò)程
實(shí)驗(yàn)芯片:LPC2103
開(kāi)發(fā)環(huán)境:MDK3.50
實(shí)現(xiàn)功能:在不使用__irq關(guān)鍵詞時(shí),如果編寫(xiě)中斷服務(wù)程序。
知識(shí)要點(diǎn):
1、在MDK開(kāi)發(fā)環(huán)境下,對(duì)于LPC2000系列處理器,MDK默認(rèn)的啟動(dòng)模式位系統(tǒng)模式。
2、在不使用__irq關(guān)鍵字聲明時(shí),只將中斷處理函數(shù)當(dāng)成普通函數(shù)進(jìn)行處理,而不會(huì)在進(jìn)入中斷時(shí)對(duì)通用寄存器的內(nèi)容進(jìn)行保存,也不會(huì)再退出中斷時(shí)對(duì)通用寄存器的內(nèi)容進(jìn)行恢復(fù),因此這部分功能是必須手動(dòng)添加的。
下面進(jìn)行代碼講述,下面就是當(dāng)進(jìn)入IRQ中斷處理函數(shù)時(shí)的處理程序,代碼全部用匯編語(yǔ)句完成詳細(xì)代碼如下:
EXPORT IRQ_Uart0
IMPORT DuleUart0
REQUIRE8
PRESERVE8
AREA CODE, CODE, READONLY
CODE32
IRQ_Uart0
STMFD SP!,{R0-R12,LR}
;保存當(dāng)前處理器的所有寄存器
MRS R0,SPSR
;保存當(dāng)前處理器的SPSR
STMFD SP!,{R0}
MRS R0,CPSR ;保存當(dāng)前處理器的CPSR
STMFD SP!,{R0}
MOV R12, SP ;保存當(dāng)前的SP寄存器
MRS R0,CPSR ;重新打開(kāi)FIQ或IRQ中斷
BIC R0,R0,#0xC0
MSR CPSR_cxsf,R0
BL DuleUart0 ;執(zhí)行串口0的實(shí)際處理程序
MOV SP,R12 ;恢復(fù)SP寄存器的值
LDMFD SP!,{R0} ;恢復(fù)中斷時(shí)的CPSR寄存器值
MSR CPSR_cxsf,R0
LDMFD SP!,{R0};恢復(fù)中斷前的SPSR寄存器狀態(tài)
MSR SPSR_cxsf,R0
LDMFD SP!,{R0-R12};恢復(fù)中斷時(shí)的所有寄存器值
LDMFD SP!,{LR};恢復(fù)進(jìn)入中斷時(shí)的PC返回地址
SUBS PC,LR,#4;返回中斷服務(wù)程序
END
大家可能存在的問(wèn)題如下:
1、為什么我們?cè)谶M(jìn)入這段中斷處理程序中還在使用LDM和STM語(yǔ)句呢,不是說(shuō)在用戶或系統(tǒng)模式中使用該語(yǔ)句會(huì)產(chǎn)生不可預(yù)料的結(jié)果么?
答:當(dāng)系統(tǒng)進(jìn)入IRQ異常時(shí),就會(huì)將處理器模式切換到IRQ異常模式。
2、為什么會(huì)在最后一句執(zhí)行SUBS PC,LR,#4(這一句就不在解釋了),不清楚的就去看看《ARM體系結(jié)構(gòu)與編程》
好了,我們現(xiàn)在對(duì)照著在uC/OS-II中的中斷編寫(xiě)方法:
Void ISP_Function( void )
{
保存全部的CPU寄存器;
調(diào)用OSIntEnter()或OSIntNesting++;
If(OSIntNesting == 1 )
{
OSTCBCur->OSTCBStkPtr= SP ;
}
清中斷源;
重新打開(kāi)中斷;
執(zhí)行用戶代碼做中斷服務(wù);
調(diào)用OSIntExit();
恢復(fù)所有CPU寄存器;
執(zhí)行中斷返回指令;
}
而在我們的處理代碼中,我們的執(zhí)行過(guò)程如下偽代碼所示:
Void ISRFunction( void )
{
保存全部寄存器的內(nèi)容;
清中斷源;
執(zhí)行用戶代碼;
恢復(fù)所有CPU寄存器;
執(zhí)行中斷返回;
}
對(duì)于沒(méi)有的部分,大家可以試著去編寫(xiě)一下!
詳細(xì)代碼可以下載,也可以移植到你現(xiàn)有的開(kāi)發(fā)板上去試試。
--------------------------------------------------------------------------------
基于ARM的芯片多數(shù)為復(fù)雜的片上系統(tǒng),這種復(fù)雜系統(tǒng)里的多數(shù)硬件模塊都是可配置的,需要由軟件來(lái)設(shè)置
其需要的工作狀態(tài)。因此在用戶的應(yīng)用程序之前,需要由專門(mén)的一段代碼來(lái)完成對(duì)系統(tǒng)的初始化。由于這
類(lèi)代碼直接面對(duì)處理器內(nèi)核和硬件控制器進(jìn)行編程,一般都是用匯編語(yǔ)言。一般通用的內(nèi)容包括:
中斷向量表
初始化存儲(chǔ)器系統(tǒng)
初始化堆棧
初始化有特殊要求的斷口,設(shè)備
初始化用戶程序執(zhí)行環(huán)境
改變處理器模式
呼叫主應(yīng)用程序
中斷向量表
ARM要求中斷向量表必須放置在從0地址開(kāi)始,連續(xù)8X4字節(jié)的空間內(nèi)。
每當(dāng)一個(gè)中斷發(fā)生以后,ARM處理器便強(qiáng)制把PC指針置為向量表中對(duì)應(yīng)中斷類(lèi)型的地址值。因?yàn)槊?div>
個(gè)中斷只占據(jù)向量表中1個(gè)字的存儲(chǔ)空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲(chǔ)器的其他地方,再執(zhí)行
中斷處理。
中斷向量表的程序?qū)崿F(xiàn)通常如下表示:
AREA Boot ,CODE, READONLY
ENTRY
B  ResetHandler
B  UndefHandler
B  SWIHandler
B  PreAbortHandler
B  DataAbortHandler
B
B  IRQHandler
B  FIQHandler
其中關(guān)鍵字ENTRY是指定編譯器保留這段代碼,因?yàn)榫幾g器可能會(huì)認(rèn)為這是一段亢余代碼而加以優(yōu)化。鏈
接的時(shí)候要確保這段代碼被鏈接在0地址處,并且作為整個(gè)程序的入口。
初始化存儲(chǔ)器系統(tǒng)
存儲(chǔ)器類(lèi)型和時(shí)序配置
通常Flash和SRAM同屬于靜態(tài)存儲(chǔ)器類(lèi)型,可以合用同一個(gè)存儲(chǔ)器端口;而DRAM因?yàn)橛袆?dòng)態(tài)刷新和地
址線復(fù)用等特性,通常配有專用的存儲(chǔ)器端口。
存儲(chǔ)器端口的接口時(shí)序優(yōu)化是非常重要的,這會(huì)影響到整個(gè)系統(tǒng)的性能。因?yàn)橐话阆到y(tǒng)運(yùn)行的速度
瓶頸都存在于存儲(chǔ)器訪問(wèn),所以存儲(chǔ)器訪問(wèn)時(shí)序應(yīng)盡可能的快;而同時(shí)又要考慮到由此帶來(lái)的穩(wěn)定性問(wèn)題
。
存儲(chǔ)器地址分布
一種典型的情況是啟動(dòng)ROM的地址重映射。

評(píng)論


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

關(guān)閉