平头哥E90X中断处理汇编部分

任务上下文保存

    addi sp, sp, -portCONTEXT_SIZE
    store_x x1,  1  * portWORD_SIZE( sp )
    store_x x5,  2  * portWORD_SIZE( sp )
    store_x x6,  3  * portWORD_SIZE( sp )
    store_x x7,  4  * portWORD_SIZE( sp )
    store_x x8,  5  * portWORD_SIZE( sp )
    store_x x9,  6  * portWORD_SIZE( sp )
    store_x x10, 7  * portWORD_SIZE( sp )
    store_x x11, 8  * portWORD_SIZE( sp )
    store_x x12, 9  * portWORD_SIZE( sp )
    store_x x13, 10 * portWORD_SIZE( sp )
    store_x x14, 11 * portWORD_SIZE( sp )
    store_x x15, 12 * portWORD_SIZE( sp )
    store_x x16, 13 * portWORD_SIZE( sp )
    store_x x17, 14 * portWORD_SIZE( sp )
    store_x x18, 15 * portWORD_SIZE( sp )
    store_x x19, 16 * portWORD_SIZE( sp )
    store_x x20, 17 * portWORD_SIZE( sp )
    store_x x21, 18 * portWORD_SIZE( sp )
    store_x x22, 19 * portWORD_SIZE( sp )
    store_x x23, 20 * portWORD_SIZE( sp )
    store_x x24, 21 * portWORD_SIZE( sp )
    store_x x25, 22 * portWORD_SIZE( sp )
    store_x x26, 23 * portWORD_SIZE( sp )
    store_x x27, 24 * portWORD_SIZE( sp )
    store_x x28, 25 * portWORD_SIZE( sp )
    store_x x29, 26 * portWORD_SIZE( sp )
    store_x x30, 27 * portWORD_SIZE( sp )
    store_x x31, 28 * portWORD_SIZE( sp )
    store_x x3,  31 * portWORD_SIZE( sp )
    store_x x4,  32 * portWORD_SIZE( sp )

    addi a0, sp, portCONTEXT_SIZE
    store_x a0,  30 * portWORD_SIZE( sp )

    csrr a0, mepc
    store_x a0,  0 * portWORD_SIZE( sp )   ----中断返回执行的地址指令存储到栈中
    csrr t0, mscratch
    store_x t0, 33 * portWORD_SIZE( sp )

    csrr t0, mstatus
    store_x t0, 29 * portWORD_SIZE( sp )


    lw      t0, pxCurrentTCB        /* Load pxCurrentTCB. */
    sw      sp, 0( t0 )             /* Write sp to first TCB member. */

检查是否为中断并跳转

    load_x sp, xISRStackTop        ----设置中断栈,中断与用户是不同栈
    call enter_interrupt_handler
    csrr a0, mcause
    andi a0, a0, 0x7FF          ---按位与,只取低11位,低11位也有2048个中断了
    call irq_core_handle_root_ic_irq  --跳转到中断处理,参数为a0
    call exit_interrupt_handler

任务上下文恢复

lw      t1, pxCurrentTCB            /* Load pxCurrentTCB. */
lw      sp, 0( t1 )                 /* Read sp from first TCB member. */
                                   中断函数处理完成后,准备恢复任务的上下文,需要先获取sp
                                   中断用的是中断的栈


    load_x  t0, 0  * portWORD_SIZE( sp )  
    csrw mepc, t0        ----中断返回后,跳转执行的地址指令

    /* Load mstatus with the interrupt enable bits used by the task. */
    load_x  t0, 29 * portWORD_SIZE( sp )
    csrw mstatus, t0     ----恢复mstatus,使能中断

    load_x  t0, 33 * portWORD_SIZE( sp )
    csrw mscratch, t0   

    load_x  x1 , 1  * portWORD_SIZE( sp )
    load_x  x5 , 2  * portWORD_SIZE( sp )       /* t0 */
    load_x  x6 , 3  * portWORD_SIZE( sp )       /* t1 */
    load_x  x7 , 4  * portWORD_SIZE( sp )       /* t2 */
    load_x  x8 , 5  * portWORD_SIZE( sp )       /* s0/fp */
    load_x  x9 , 6  * portWORD_SIZE( sp )       /* s1 */
    load_x  x10, 7  * portWORD_SIZE( sp )   /* a0 */
    load_x  x11, 8  * portWORD_SIZE( sp )   /* a1 */
    load_x  x12, 9  * portWORD_SIZE( sp )   /* a2 */
    load_x  x13, 10 * portWORD_SIZE( sp )   /* a3 */
    load_x  x14, 11 * portWORD_SIZE( sp )   /* a4 */
    load_x  x15, 12 * portWORD_SIZE( sp )   /* a5 */
    load_x  x16, 13 * portWORD_SIZE( sp )   /* a6 */
    load_x  x17, 14 * portWORD_SIZE( sp )   /* a7 */
    load_x  x18, 15 * portWORD_SIZE( sp )   /* s2 */
    load_x  x19, 16 * portWORD_SIZE( sp )   /* s3 */
    load_x  x20, 17 * portWORD_SIZE( sp )   /* s4 */
    load_x  x21, 18 * portWORD_SIZE( sp )   /* s5 */
    load_x  x22, 19 * portWORD_SIZE( sp )   /* s6 */
    load_x  x23, 20 * portWORD_SIZE( sp )   /* s7 */
    load_x  x24, 21 * portWORD_SIZE( sp )   /* s8 */
    load_x  x25, 22 * portWORD_SIZE( sp )   /* s9 */
    load_x  x26, 23 * portWORD_SIZE( sp )   /* s10 */
    load_x  x27, 24 * portWORD_SIZE( sp )   /* s11 */
    load_x  x28, 25 * portWORD_SIZE( sp )   /* t3 */
    load_x  x29, 26 * portWORD_SIZE( sp )   /* t4 */
    load_x  x30, 27 * portWORD_SIZE( sp )   /* t5 */
    load_x  x31, 28 * portWORD_SIZE( sp )   /* t6 */
    addi sp, sp, portCONTEXT_SIZE   ----销毁栈空间

    mret                            ---中断返回