cpu_support.s

来自「toppers操作系统源码」· S 代码 · 共 815 行 · 第 1/2 页

S
815
字号
        pop r2        pop r1        pop r0        iret/* *  毋嘲ハンドラ掐り庚 */        .global _kernel_int_irq_ex_kernel_int_irq_ex:        push r0                                /*                                 *  UART毋嘲は充り哈みとして借妄                                 */        bn __U0CR,#0,1f                 /* UART0 RxRdy */        bn __U0CR,#1,1f        mov r0,#_kernel_ih_table+32        br _int_common1:        bn __U0CR,#2,2f                 /* UART0 TxEmpty */        bn __U0CR,#3,2f        mov r0,#_kernel_ih_table+32        br _int_common2:        bn __U1CR,#0,3f                 /* UART1 RxRdy */        bn __U1CR,#1,3f        mov r0,#_kernel_ih_table+32        br _int_common3:        bn __U1CR,#2,4f                 /* UART1 TxEmpty */        bn __U1CR,#3,4f        mov r0,#_kernel_ih_table+32        br _int_common4:                                /*                                 *  r1,r2を锣闰し、r2に毋嘲券栏箕のSPを肋年                                 *  (毋嘲ハンドラへの苞眶)                                 */        push r1        push r2        mov r2,sp        sub r2,#6                                /*                                 *  券栏した毋嘲を冉年/クリアする                                 */        bn __EXCPL,#1,5f                /* undefined instruction */        set1 psw,#11        clr1 __EXCPL,#1        clr1 psw,#11        mov r0,#_kernel_eh_table+0        br _exc_common5:        bn __EXCPL,#3,6f                /* word access to odd address */        set1 psw,#11        clr1 __EXCPL,#3        clr1 psw,#11        mov r0,#_kernel_eh_table+2        br _exc_common6:        bn __EXCPL,#5,7f                /* acccess out of mamoey range */        set1 psw,#11        clr1 __EXCPL,#5        clr1 psw,#11        mov r0,#_kernel_eh_table+4        br _exc_common7:        mov r0,#_kernel_eh_table+6      /* unknown exception */        br _exc_common/* *  毋嘲ハンドラ掐り庚借妄 */_exc_common:                                /*                                 *  ネストした毋嘲かどうかチェック                                 *  (毋嘲は、戮の充り哈みにネストされる                                 *  ことは痰いので、充り哈み敦贿借妄は                                 *  稍妥)                                 */        mov r1,_kernel_intnest        bz exception_from_task/* *  ネストした毋嘲の借妄 */                                /*                                 *  ネストカウンタをインクリメント                                 */        inc r1        mov _kernel_intnest,r1                                /*                                 *  r3-r9(caller saved register)の锣闰                                 */        push r3        push r4        push r5        push r6        push r7        push r8        push r9                                /*                                 *  毋嘲ハンドラの钙び叫し                                 */        mov r1,(r0)        bz 1f        mov r8,#0        call r8,r11:                                /*                                 *  r1-r9の牲傅                                 */        pop r9        pop r8        pop r7        pop r6        pop r5        pop r4        pop r3        pop r2        pop r1                                /*                                 *  ネストカウンタをデクリメントし、                                 *  充り哈まれた傅の充り哈みハンドラへ提る                                 */        mov r0,_kernel_intnest        dec r0        mov _kernel_intnest,r0        pop r0        iret/* *  ネストしていない毋嘲の借妄 */exception_from_task:                                /*                                 *  ネストカウンタをインクリメント                                 */        mov _kernel_intnest,#1                                /*                                 *  スタックを润タスク脱に磊り仑える                                 */        mov r1,sp        mov sp,#__stack                                /*                                 *  r3-r9(caller saved register)を                                 *  タスク娄スタックに锣闰                                 */        mov (r1++),r3        mov (r1++),r4        mov (r1++),r5        mov (r1++),r6        mov (r1++),r7        mov r3,r8        mov (r1++),r3        mov r3,r9        mov (r1++),r3                                /*                                 *  タスク娄スタックポインタを充り哈み脱                                 *  スタックに锣闰                                 */        push r1                                /*                                 *  毋嘲ハンドラの钙び叫し                                 */        mov r1,(r0)        bz 1f        mov r8,#0        call r8,r11:                                /*                                 *  充り哈みˇ毋嘲鼎奶叫庚借妄へ                                 */        br ret_int_and_exc/* *  exit_and_dispatch() *  傅のコンテキストを瘦赂せず糠しいタスクへ磊り仑える *  (カ〖ネル倡幌稿呵介のタスクの弹瓢を崔む) */        .global _kernel_exit_and_dispatch_kernel_exit_and_dispatch:                                /*                                 *  ネストカウンタをクリア                                 *  (カ〖ネル倡幌木稿霹、涟に悸乖されていた                                 *  タスクが痰い眷圭、润タスクコンテキスト                                 *  悸乖面を绩すため、ネストカウンタは1に                                 *  なっている。これをクリア)                                 */        mov _kernel_intnest,#0                                /*                                 *  ディスパッチャでジャンプ                                 */        br dispatcher/* *  dispatch() *  傅のコンテキストを瘦赂し糠しいタスクへ磊り仑える */        .global _kernel_dispatch_kernel_dispatch:                                /*                                 *  r10-r14(callee-saved egister)を瘦赂                                 */        push r10        push r11        push r12        push r13        push psw                                /*                                 *  SPをruntsk->tskctxb.spに瘦赂                                 */        mov r0,#_kernel_runtsk        mov r1,(r0)        mov r7,sp        mov (r1,+TCB_sp),r7                                /*                                 *  mode=0(dispatch_rに提る)を肋年し                                 *  ディスパッチャへ                                 */        mov r7,#0        mov (r1,+TCB_mode),r7        br dispatcher/* *  dispatch()からの提り借妄 *  (r3はTCBを绩す) */dispatch_r:                                /*                                 *  r10-r14(callee-saved egister)を牲傅                                 */        pop psw        pop r13        pop r12        pop r11        pop r10                                /*                                 *  タスク毋嘲をチェックし、钓材&                                 *  毋嘲ありなら钙び叫す                                 */        mov.b r7,(r3,+TCB_enatex)        bn r7,#TCB_enatex_bit,1f        mov r7,(r3,+TCB_texptn)        bz 1f        jmpf _kernel_call_texrtn1:                                /*                                 *  dispatch()を钙んだタスクに提る                                 */        ret/* *  create_context()/activate_context() *  糠しいタスクの弹瓢借妄 *  (r2はTCBを绩す) */        .global _kernel_create_context_kernel_create_context:        ret        .global _kernel_activate_context_kernel_activate_context:                                /*                                 *  スタックポインタを介袋步                                 *  tcb->tskctxb.sp=tcb->tinib->stk                                 */        mov r0,(r2,+TCB_tinib)        mov r1,(r0,+TINIB_stk)        mov (r2,+TCB_sp),r1                                /*                                 *  mode=2(activate_rに提る)を肋年                                 */        mov r1,#2        mov (r2,+TCB_mode),r1        ret/* *  activate_context()されたタスクの弹瓢借妄 *  (r3はTCBを绩す) */activate_r:                                /*                                 *  タスクがreturnで姜位したときに、                                 *  ext_tsk()が钙ばれるよう、これを                                 *  スタックに姥む                                 */        mov r1,#@lo(ext_tsk)        push r1        mov r2,#@hi(ext_tsk)        push r2                                /*                                 *  タスク倡幌アドレスをスタックに姥む                                 */        mov r0,(r3,+TCB_tinib)        mov r1,(r0,+TINIB_task)        push r1        mov r2,#0        push r2                                /*                                 *  PSW介袋猛をスタックに姥む                                 */        mov r1,#0x0080        push r1                                /*                                 *  r2=exinf                                 */        mov r2,(r0,+TINIB_exinf)                                /*                                 *  タスク弹瓢                                 */        iret/* *  ディスパッチャ〖 */dispatcher:                                /*                                 *  runtsk = schedtsk                                 */        mov r2,#_kernel_schedtsk        mov r3,(r2)        mov r0,#_kernel_runtsk        mov (r0),r3                                /*                                 *  schedtsk = NULL(悸乖材墙なタスク痰し)                                 *  の眷圭、アイドル借妄へ                                 */        bz dispatcher_1                                /*                                 *  SPを牲傅                                 */        mov r7,(r3,+TCB_sp)        mov sp,r7                                /*                                 *  modeにしたがって、                                 *   =0 : dispatch_r                                 *   =1 : ret_int_r                                 *   =2 : activate_r                                 */        mov r7,(r3,+TCB_mode)        bz dispatch_r        bz r7,#1,ret_int_r        br activate_r/* *  アイドル借妄(悸乖材墙タスク痰し) */dispatcher_1:                                /*                                 *  スタックを润タスク脱に磊り仑える                                 */        mov sp,#__stack                                /*                                 *  润タスクを绩すために                                 *  ネストカウンタに1をセット                                 */        mov _kernel_intnest,#1                                /*                                 *  タスク悸乖材墙略ちのル〖プ                                 */dispatcher_2:                                /*                                 *  充り哈みレベルを0に(IL=0)                                 */        mov psw,#0x0000                                /*                                 *  アイドルル〖チンを钙び叫す                                 */        callf _kernel_idle                                /*                                 *  タスクが悸乖材墙になったかのチェック                                 *  (reqflg=1?)                                 */        mov r0,#_kernel_reqflg        mov r1,(r0)        bz dispatcher_2                                /*                                 *  reqflgとネストカウンタをクリアし、                                 *  ディスパッチャに提る                                 */        mov r1,#0        mov (r0),r1        mov _kernel_intnest,#0        br dispatcher/* *  デフォルトのアイドルル〖チン */        .weak _kernel_idle_kernel_idle:                                /*                                 *  充り哈みを钓材                                 */        set1 psw,#7                                /*                                 *  充り哈み略ち                                 */        halt                                /*                                 *  充り哈みを敦贿                                 */        clr1 psw,#7        ret        .end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?