基於Blackfin構架體系的DSR實現
對於作業系統核心有些瞭解的朋友應該對DSR不會感到陌生——Deferred Interrupt Service Routine,即延遲的中斷服務例程。
對於一些操作較複雜、耗時的操作我們往往想將它從中斷服務例程中拿出來,放在外面完成。這樣可以加快中斷響應時間,對於一些緊迫的事件處理則顯得更為重要。因此應該提供一個DSR這樣的機制。這個在Windows和Linux中均有體現。
下面我將談談在Blackfin DSP處理器系列中對DSR的一種處理方法。
其實對於一些並不緊急、完全可以拖後操作的事情甚至可以通過一個任務(執行緒)專門處理這些事件。在Linux中,DSR的處理分為三個不同的機制,其中有一個實際上是在某些檢查點(如系統中斷處理結束後、定時中斷處理結束後、任務排程結束後等等)檢查是否有DSR事件,如果有則處理它們。那麼下面我將基於這種情況作出處理。
// 某個中斷處理例程
extern void test(void);
// 軟體中斷處理例程
extern void soft_isr(void);
int main(void)
{
// 將test註冊到IVG13系統中斷向量
*(unsigned long*)0xffe02034 = (unsigned long)&test;
// 將soft_isr註冊到IVG14軟體中斷向量
*(unsigned long*)0xffe02038 = (unsigned long)&soft_isr;
// 開啟所有中斷開關
*(unsigned long*)0xffe02104 = 0xffff;
// 直接通過核心將中斷號為13的系統事件中斷髮給核心中斷控制器(這裡模擬一個外部中斷事件)
asm("raise 13;");
return 0;
}
extern void test(void);
// 軟體中斷處理例程
extern void soft_isr(void);
int main(void)
{
// 將test註冊到IVG13系統中斷向量
*(unsigned long*)0xffe02034 = (unsigned long)&test;
// 將soft_isr註冊到IVG14軟體中斷向量
*(unsigned long*)0xffe02038 = (unsigned long)&soft_isr;
// 開啟所有中斷開關
*(unsigned long*)0xffe02104 = 0xffff;
// 直接通過核心將中斷號為13的系統事件中斷髮給核心中斷控制器(這裡模擬一個外部中斷事件)
asm("raise 13;");
return 0;
}
以上是一個C檔案。這裡對Blackfin的中斷控制器做一下簡單介紹:Blackfin中斷控制器分為16箇中斷優先順序,0~4是非遮蔽中斷,7到13屬於外部系統中斷,14、15屬於軟體中斷。
下面貼出核心的彙編部分程式碼:
.section program;
.global _soft_isr;
.global _user_isr_callback;
// DSR處理函式
execute:
// 呼叫使用者的DSR處理例程
call _user_isr_callback;
// 作為軟體中斷的引數,這裡0表示準備結束DSR處理
r0 = 0;
// 釋出14號中斷(程式碼將跳往_soft_isr)
raise 14;
.global _soft_isr;
.global _user_isr_callback;
// DSR處理函式
execute:
// 呼叫使用者的DSR處理例程
call _user_isr_callback;
// 作為軟體中斷的引數,這裡0表示準備結束DSR處理
r0 = 0;
// 釋出14號中斷(程式碼將跳往_soft_isr)
raise 14;
idle;
execute.end:
_test:
.global _test;
// 中斷入口,保護相關的暫存器
[--sp] = astat;
[--sp] = p0;
[--sp] = r0;
[--sp] = rets;
// 這裡用兩個nop表示中斷例程中先處理一些事務
nop;
nop;
// 這裡是關鍵步驟:
// 將中斷返回暫存器的值先賦給r0
r0 = reti;
// 將這個值壓棧
[--sp] = r0;
// r0指向execute子過程的首地址
r0.h = hi(execute);
r0.l = lo(execute);
// 將execute的入口地址賦給中斷返回暫存器
reti = r0;
// 這裡將返回到execute子過程
rti;
_test.end:
_soft_isr:
// 判斷軟體中斷引數
cc = r0 == 0;
if !cc jump SOFT_ISR_OTHER;
// 如果是作為DSR的結束處理:
// 恢復上下文暫存器
// 將reti恢復為原來被中斷的下一條指令地址處
r0 = [sp++];
reti = r0;
rets = [sp++];
r0 = [sp++];
p0 = [sp++];
astat = [sp++];
SOFT_ISR_OTHER:
// 中斷返回
rti;
_soft_isr.end:
// 使用者DSR處理例程
_user_isr_callback:
p0 = 0;
r0 = 100;
r0 = r0 -|- r0 || [p0++] = r0;
[p0++] = r0;
rts;
_user_isr_callback.end:
execute.end:
_test:
.global _test;
// 中斷入口,保護相關的暫存器
[--sp] = astat;
[--sp] = p0;
[--sp] = r0;
[--sp] = rets;
// 這裡用兩個nop表示中斷例程中先處理一些事務
nop;
nop;
// 這裡是關鍵步驟:
// 將中斷返回暫存器的值先賦給r0
r0 = reti;
// 將這個值壓棧
[--sp] = r0;
// r0指向execute子過程的首地址
r0.h = hi(execute);
r0.l = lo(execute);
// 將execute的入口地址賦給中斷返回暫存器
reti = r0;
// 這裡將返回到execute子過程
rti;
_test.end:
_soft_isr:
// 判斷軟體中斷引數
cc = r0 == 0;
if !cc jump SOFT_ISR_OTHER;
// 如果是作為DSR的結束處理:
// 恢復上下文暫存器
// 將reti恢復為原來被中斷的下一條指令地址處
r0 = [sp++];
reti = r0;
rets = [sp++];
r0 = [sp++];
p0 = [sp++];
astat = [sp++];
SOFT_ISR_OTHER:
// 中斷返回
rti;
_soft_isr.end:
// 使用者DSR處理例程
_user_isr_callback:
p0 = 0;
r0 = 100;
r0 = r0 -|- r0 || [p0++] = r0;
[p0++] = r0;
rts;
_user_isr_callback.end:
以上是對中斷處理一結束馬上處理DSR的情況。
相關文章
- 基於零信任架構的IDaaS實現架構
- IT轉型與基於雲的架構實現架構
- 基於 RocketMQ 的基金數字化陪伴體系的架構實踐MQ架構
- 基於雲的政府網站群體系架構網站架構
- EF架構~基於EF資料層的實現架構
- 基於訂閱的服務通訊架構體系架構
- 基於 WebGL 的 CSG 構造實體幾何書架Web
- B站基於Iceberg的湖倉一體架構實踐架構
- 基於golang分散式爬蟲系統的架構體系v1.0Golang分散式爬蟲架構
- 基於SPA架構的GraphQL工程實踐架構
- 基於SpringCloud的Microservices架構實戰案例-架構拆解SpringGCCloudROS架構
- OnZoom 基於Apache Hudi的流批一體架構實踐OOMApache架構
- 如何基於COLA架構快速實現一個CRUD操作架構
- 基於Drone實現CI/CD【0到1架構系列】架構
- 基於OpenSSL實現C/S架構中的https會話架構HTTP會話
- 基於hyperf架構的後臺骨架系統架構
- ERP與SOA結合:基於SOA的ERP體系架構架構
- [提問]討基於J2EE標準的C/S/S三層體系架構怎麼實現?架構
- 基於“結構體”實現簡易版學生管理系統(Golang)結構體Golang
- 基於容器雲的微服務架構實踐微服務架構
- 觸寶科技基於Apache Hudi的流批一體架構實踐Apache架構
- 基於HTML5 Canvas的CSG構造實體幾何書架HTMLCanvas
- 如何基於LSM-tree架構實現一寫多讀架構
- 基於Maven的SSM總體架構設計(一)MavenSSM架構
- 基於AngularJS的企業軟體前端架構AngularJS前端架構
- 基礎架構體系中介軟體學習架構
- 軟考 - 系統架構設計師(基於中介軟體的開發)架構
- 基於Spring Boot和Spring Cloud實現微服務架構Spring BootCloud微服務架構
- 架構設計|基於 raft-listener 實現實時同步的主備叢集架構Raft
- 關於軟體架構和業務架構的思考架構
- 阿里架構師,講述基於微服務的軟體架構模式(附資料)阿里架構微服務模式
- 介紹基於事件的架構事件架構
- 基於 dubbo 的分散式架構分散式架構
- 基於REST與Web架構的構想RESTWeb架構
- 基於AWS的檔案同步服務系統架構架構
- 基於sanic的微服務基礎架構微服務架構
- Android系統架構-----Android的系統體系架構Android架構
- 基於Hadoop的大資料平臺實施——整體架構設計Hadoop大資料架構