1. 程式人生 > >~雜記(4):阿里和華為rtos 的接管中斷邏輯探索

~雜記(4):阿里和華為rtos 的接管中斷邏輯探索

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、如果自己哪裡理解錯了,希望得到指正。如果上述資訊涉及到侵權,可通知我刪除。

本文只做自己的學習分享,謝謝。