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





