~雜記(4):阿里和華為rtos 的接管中斷邏輯探索
阿新 • • 發佈:2018-12-12
1、首先在某晶片的啟動檔案中,給出的中斷向量表全是指向同一個函式。(一開始我以為是錯的,自己改成各個預設中斷服務函式的入口,這樣就成了非接管中斷)。
部分程式碼如下,其中irq_handler就是那個統一的中斷服務函式。他被定義在排程檔案los_dispatch中。
__Vectors: .long Reset_Handler .long vec_handler /* 此處略去很多字 */ /* External interrupts */ .long irq_handler /* 0: UART */ .long irq_handler /* 1: CoreTIM */ .long irq_handler /* 2: Timer0 */ .long irq_handler /* 3: Timer1 */ .long irq_handler /* 4: Timer2 */ .long irq_handler /* 5: Timer3 */ .long irq_handler .long irq_handler /* 7: GPIO0 */ .long irq_handler /* 8: GPIO1 */ .long irq_handler /* 9: GPIO2 */ /* 此處略去很多字 */ .long irq_handler .long irq_handler .long irq_handler .size __Vectors, . - __Vectors
2、該函式irq_handler是由組合語言編寫,最終跳轉到irq_dispatch函式。
irq_handler:
psrset ee
/*
此處略去很多字
*/
bsr irq_dispatch
/*
此處略去很多字
*/
3、irq_dispatch函式被定義在一個C檔案中(los_hwi.c),根據向量號,查詢表中的函式入口,並執行。(這些函式入口根據使用者的需要自行定義,由LOS_HwiCreate註冊到表中)。
4、上述的流程,結合自己的理解,如下圖所示:
5、阿里的RTOS系統,應該說也算是接管中斷的方式(我認為)。因為這些中斷服務函式入口沒有被羅列在啟動檔案中,而是被寫在一個函式指標陣列中。只是使用者不需要類似華為的那種註冊到陣列的操作,只需要修改程式碼中函式指標陣列的成員。大概的示意圖如下:
6、如果自己哪裡理解錯了,希望得到指正。如果上述資訊涉及到侵權,可通知我刪除。
本文只做自己的學習分享,謝謝。