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 + -
显示快捷键?