ARM2200 下的中斷編程三
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一.在uc/os操作系統(tǒng)上設(shè)計(jì)中斷函數(shù)時(shí)所要考慮的一些問題:
1 .操作系統(tǒng)本身必須使用一個(gè)定時(shí)器中斷源來作為系統(tǒng)節(jié)拍中斷,它是操作系統(tǒng)工作的基礎(chǔ)。
2.只要沒有關(guān)閉中斷,中斷服務(wù)程序就可以中斷任何任務(wù)的運(yùn)行,所以將中斷服務(wù)程序看成比最高優(yōu)先級(jí)(0)級(jí)的任務(wù)還要高的任務(wù)。
3.中斷服務(wù)程序的功能應(yīng)該盡量簡(jiǎn)單,只要將獲取的異步事件通信給關(guān)聯(lián)任務(wù)即可,后續(xù)處理由其關(guān)聯(lián)任務(wù)完成。
4.實(shí)時(shí)操作系統(tǒng)UC/OS移植到ARM7體系的CPU上時(shí),沒有對(duì)FIQ進(jìn)行處理,即FIQ是不受操作系統(tǒng)管理的。由于沒有操作系統(tǒng)介入,F(xiàn)IQ的ISR無法與關(guān)聯(lián)任務(wù)進(jìn)行通信,所獲取的信息不能及時(shí)得到關(guān)聯(lián)任務(wù)的處理,故只能以原始形式保存在一個(gè)緩沖區(qū)內(nèi),等待以后進(jìn)行離線處理。
注:由于使用FIQ方式進(jìn)行采樣,其ISR不受操作系統(tǒng)管理,所以只能用使能中斷源和關(guān)閉中斷源來控制FIQ中斷過程。
二.在UC/OS操作系統(tǒng)上編寫ISR
1.在UC/OS上編寫ISR和在裸機(jī)上編寫ISR時(shí)的區(qū)別
l進(jìn)入中斷:除了要保護(hù)現(xiàn)場(chǎng)外,還需要調(diào)用進(jìn)入中斷服務(wù)函數(shù),用來通知實(shí)時(shí)操作系統(tǒng),使UC/OS操作系統(tǒng)掌握當(dāng)前中斷的嵌套深度
l運(yùn)行功能代碼:除了完成ISR的實(shí)質(zhì)公能的代碼外,還要實(shí)現(xiàn)與其他任務(wù)進(jìn)行通信的功能。通過這種通信功能使關(guān)聯(lián)任務(wù)得到同步信號(hào)或數(shù)據(jù),從而進(jìn)入就緒狀態(tài)。但是,在ISR中不允許調(diào)用延遲函數(shù)和可能被掛起的系統(tǒng)服務(wù)函數(shù)。
2.如何在UC/OS操作系統(tǒng)上編寫ISR?
在UC/OS中用中斷程序由以下幾部分組成:
l添加中斷句柄
l配置和初始化中斷源
l配置向量中斷控制器
l編寫中斷服務(wù)函數(shù)
1>.中斷句柄:
在UC/OS操作系統(tǒng)上編寫中斷程序,必須在文件IRQ.S的尾部添加中斷句柄:
XXX_HandlerHANDLERXXX_Exception
lXXX_Handler是ISR的起始地址,即匯編的起始地址,在初始化化向量控制器時(shí)作為中斷向量地址使用。其中的XXX可根據(jù)具體的中斷源名稱命名
lHANDLER是句柄關(guān)鍵字,必須大寫。
lXXX_Exception:是用C語(yǔ)言編寫的功能函數(shù)名,該函數(shù)用匯編調(diào)用。其中的XXX可根據(jù)具體的中斷源名稱命名
Eg:如果要使用UART0作為一個(gè)中斷源,用來接收數(shù)據(jù),則需要在文件IRQ.S的尾部添加一個(gè)中斷句柄:
Timer0_HandlerHANDLER Timer0_Exception
UART0_HandlerHANDLER UART0_Exception
RTC_HandlerHANDLERRTC_Exception
EINT3_HandlerHANDLEREINT3_Exception
2>.配置和初始化中斷源
1>在一個(gè)中斷源開始之前,需要配置和初始化中斷源,使它按預(yù)定的方式工作。
還是以UART0為例:
/***********************************************************
*作者:tiger-john
*時(shí)間:2011年1月29日
*名稱:UART0_Init
*功能:UART0初始化通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)
*入口參數(shù):bps串口波特率
*出口參數(shù):無
***********************************************************/
voidUART0_Init(uint32 bps)
{
uint16Fdiv;
PINSEL0 = (PINSEL0 & ~(0xf) " 0x05) ;//設(shè)置UART0的引腳
U0LCR = 0x83;
Fdiv = (Fpclk>>4)/bps;
U0DLM = Fdiv>>8;
U0DLL = Fdiv%256;
U0LCR = 0x03;
U0FCR = 0x41;//使能FIFO,并設(shè)置觸發(fā)點(diǎn)為4字節(jié)
U0IER = 0x01;//允許RBR中斷,即接收中斷
}
3>.向量中斷控制器配置
為了使中斷信號(hào)和對(duì)應(yīng)的ISR聯(lián)系起來,還必需對(duì)向量中斷控制器進(jìn)行配置。對(duì)于通道號(hào)為X的中斷源XXXX,如果配置中斷優(yōu)先級(jí)為Y,則需要在target.c文件中的
VICInit ()函數(shù)中添加代碼:
//聲明中斷源XXX的中斷服務(wù)函數(shù)ISR
externvoidXXXX_Handler(void);
//將ISR入口地址填入向量寄存器Y
VICVectAddrY = (uint32)XXXX_Handler;
//向量中斷方式,通道號(hào)為X
VICVectCntlY = (0x20 | X);
void VICInit(void)
{
extern void IRQ_Handler(void);
extern void Timer0_Handler(void);
extern void UART0_Handler(void);
extern void RTC_Handler(void);
extern void EINT3_Handler(void);
VICIntEnClr = 0xffffffff;
VICDefVectAddr = (uint32)IRQ_Handler;
VICVectAddr0 = (uint32)Timer0_Handler;
VICVectCntl0 = (0x20 | 0x04);
VICIntEnable = 1 << 4;
VICVectAddr1 = (uint32)UART0_Handler;
VICVectCntl1 = (0x20 | 6);
VICVectAddr2 = (uint32)RTC_Handler;
VICVectCntl2 = (0x20 | 13);
VICIntEnable = 1 << 13;
VICVectAddr3 = (uint32)EINT3_Handler;
VICVectCntl3 = (0x20 | 17);
VICIntEnable = 1 << 17;
}
4>.編寫中斷服務(wù)程序程序的功能函數(shù)
voidXXXX_Exception(void)
{
OS_ENTER_CRITICAL();//關(guān)中斷
清除中斷源;
通知中斷控制器中斷結(jié)束;
OS_EXIT_CRITICAL();//開中斷
用戶中斷處理代碼;
}
注:在UC/OS編寫中斷服務(wù)函數(shù)時(shí),清除中斷源和清除中斷控制器的工作必須放在臨界代碼端中。即在UC/OS中編寫中斷服務(wù)函數(shù)時(shí),必須要有OS_ENTER_CRITICAL();和OS_EXIT_CRITICAL()。
3.控制中斷源的工作:
在程序運(yùn)行過程中,可以通過使能中斷源和關(guān)閉中斷源來啟動(dòng)和關(guān)閉通道號(hào)為X的中斷源。
VICIntEnable = 1 << X;//使能中斷源X產(chǎn)生中斷
VICIntEnClr = 1 << X;//禁止中斷源X產(chǎn)生中斷
三.設(shè)計(jì)ISR與關(guān)聯(lián)任務(wù)之間的通信方法:
1. ISR的主要功能是響應(yīng)異步事件,該異步事件將觸發(fā)一系列操作。ISR設(shè)計(jì)的基本原則是:盡可能簡(jiǎn)短。
2.ISR與關(guān)聯(lián)任務(wù)的通信方式有兩種類型:信號(hào)型和數(shù)據(jù)型。
1>當(dāng)使用信號(hào)量進(jìn)行通信時(shí),ISR只完成發(fā)送信號(hào)量的工作,表示事件已經(jīng)發(fā)生,通過信號(hào)量的同步功能觸發(fā)關(guān)聯(lián)任務(wù)。
2>當(dāng)使用數(shù)據(jù)進(jìn)行通信時(shí),ISR需要完成對(duì)異步事件的信息進(jìn)行采集工作,然后使用消息郵箱(或消息隊(duì)列)將數(shù)據(jù)發(fā)送給關(guān)聯(lián)任務(wù),由關(guān)聯(lián)任務(wù)完成后續(xù)數(shù)據(jù)處理工作。
3>做項(xiàng)目時(shí)常見的三種情況:
?觸發(fā)ISR的事件不包含數(shù)據(jù):不需要對(duì)事件進(jìn)行信息采集。此時(shí),ISR使用信號(hào)量與關(guān)聯(lián)任務(wù)進(jìn)行通信。
?觸發(fā)ISR的事件是包含數(shù)據(jù)的低頻事件:將數(shù)據(jù)采集的工作放在關(guān)聯(lián)任務(wù)中完成,(產(chǎn)生的時(shí)刻延遲與采樣周期相比可以忽略不計(jì),對(duì)采集數(shù)據(jù)的質(zhì)量沒有影響。此時(shí),ISR使用信號(hào)量與關(guān)聯(lián)任務(wù)進(jìn)行通信,從而簡(jiǎn)化了ISR。
?觸發(fā)ISR的事件是包含數(shù)據(jù)的中高頻事件:數(shù)據(jù)采集的工作放在關(guān)聯(lián)任務(wù)中完成時(shí),產(chǎn)生的時(shí)延與采樣周期相比不能忽略不計(jì)時(shí),對(duì)采樣數(shù)據(jù)的質(zhì)量有影響。此時(shí),關(guān)聯(lián)任務(wù)從消息郵箱中得到消息的數(shù)據(jù),并完成后續(xù)處理工作。
?觸發(fā)ISR的事件是包含數(shù)據(jù)的非周期高頻率事件:對(duì)于非周期高頻事件,其最短事件間隔可能小于一個(gè)事件數(shù)據(jù)處理的耗時(shí),如果使用消息郵箱進(jìn)行通信,就可能會(huì)出現(xiàn)數(shù)據(jù)丟失現(xiàn)象。此時(shí),數(shù)據(jù)采集的工作應(yīng)該在ISR中完成,由ISR使用具有數(shù)據(jù)緩沖功能的消息隊(duì)列與關(guān)聯(lián)任務(wù)進(jìn)行通信。關(guān)聯(lián)任務(wù)從消息隊(duì)列中得到消息的數(shù)據(jù),并完成后續(xù)處理工作。