📄 cpu_support.sh
字号:
.long STACKTOP /* タスク迫惟婶のスタックの介袋猛 */_expevt: .long EXPEVT_exc_table_exc: .long _exc_table_unmak_rb_bl_exc: .long 0x4fffffff_mask_md_ipm_exc: .long 0x40000000 + MAX_IPM << 4 _reqflg_exc: .long _reqflg_cpu_expevt_k: .long _cpu_expevt _mask_md_bl_exc: .long 0x50000000 + MAX_IPM << 4 #ifdef GHS_HOOK .global _exception_hook_exception_hook_dis: .long _exception_hook#endif /* * タスクディスパッチャ * * _dispatch は、r7_bank1 = 0,充哈み敦贿觉轮で钙び叫さなければならな * いˉ_exit_and_dispatch も·r7_bank1 = 0ˇ充哈み敦贿觉轮で钙び叫す * のが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·r7_bank1 = 1で钙び * 叫した眷圭にも滦炳しているˉ */ .text .align 2 .global _dispatch_dispatch: sts.l pr,@-r15 /* pr,r8×r15 をスタックに瘦赂 */ mov.l r14,@-r15 /* r0×r7は钙び叫し傅で瘦赂しているため */ mov.l r13,@-r15 /* 瘦赂する涩妥が痰い */ mov.l r12,@-r15 mov.l r11,@-r15 mov.l r10,@-r15 mov.l r9, @-r15 mov.l r8, @-r15 mov.l _runtsk_dis,r2 /* r0 <- runtsk */ mov.l @r2,r0 mov.l r15,@(TCB_sp,r0) /* タスクスタックをTCBに瘦赂 60笆布ならOK*/ mov.l dispatch_r_k,r1 /* 悸乖浩倡戎孟を瘦赂 */ mov.l r1,@(TCB_pc,r0) /* 悸乖浩倡戎孟をTCBに瘦赂 60笆布ならOK */ bra dispatcher nopdispatch_r: mov.l @r15+,r8 /* レジスタを牲耽 */ mov.l @r15+,r9 mov.l @r15+,r10 mov.l @r15+,r11 mov.l @r15+,r12 mov.l @r15+,r13 mov.l @r15+,r14 lds.l @r15+,pr /* * タスク毋嘲借妄ル〖チンの弹瓢 * dispatch_rはdispatcherから钙び叫されるため· * tcbのアドレスはr0に掐っているˉ */ mov.l @(TCB_enatex,r0),r1 mov.l _enatex_mask_dis,r2 tst r1,r2 bt dispatch_r_1 /* enatex が FALSE ならリタ〖ン */ mov.l @(TCB_texptn,r0),r1 /* texptnをロ〖ド */ tst r1,r1 bt dispatch_r_1 /* texptn が 0で痰ければ */ mov.l _call_texrtn_dis,r1 /* タスク毋嘲ル〖チンの钙び叫し */ jmp @r1 nop dispatch_r_1: rts nop .global _exit_and_dispatch_exit_and_dispatch: xor r1,r1 /* r7_bank1を0クリア */ ldc r1,r7_bankdispatcher: /* * ここには充り哈み敦贿で丸ること */ mov.l _schedtsk_dis,r12 /* r0 <- schedtsk */ mov.l @r12,r0 cmp/eq #0,r0 /* schedtsk があるか々 */ bt dispatcher_1 /* 痰ければジャンプ */#ifdef GHS_HOOK mov.l _dispatch_hook_dis,r2 jsr @r2 mov r0,r4 mov.l @r12,r0#endif mov.l _runtsk_dis,r2 mov.l r0,@r2 /* schedtskをruntskに */ mov.l @(TCB_sp,r0),r15 /* TCBからタスクスタックを牲耽 */ mov.l @(TCB_pc,r0),r1 /* TCBから悸乖浩倡戎孟を牲耽 */ jmp @r1 nopdispatcher_1: /* イミディエイト猛を髓搀粕み哈むのは跟唯が碍いので祸涟に脱罢する * r8 : 充り哈み敦贿のためのSRの猛 * r9 : 充り哈み略ち面のSRの猛 * r10 : reqflgの戎孟 * r11 : 0x01 * r12 : 0x00 * r13 : sleep面のSRの觉轮 */ mov.l _mask_md_ipm_dis,r8 /* 充り哈み敦贿のSRの猛 */#ifdef NO_SLEEP mov.l _mask_md_dis,r9 /* 充り哈み略ち面のSRの猛 */ #else mov.l _mask_bl_md_dis,r9 /* 充り哈み略ち面のSRの猛 */#endif #ifdef SUPPORT_CHG_IPM mov.l _task_intmask_k,r2 mov.l @r2,r3 or r3,r9#endif mov.l _reqflg_dis,r10 mov #0x01,r11 xor r12,r12 mov.l _stacktop_dis,r15 /* スタックを充り哈みスタックに */ ldc r11,r7_bank /* r7_bank1 を1にして充り哈み觉轮に */ dispatcher_2: /* * ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という企つの罢蹋があるˉ */ /* * 充哈み钓材稿にsleep炭吾を悸乖すると·充哈み钓材炭吾の悸乖涟に * 充哈み妥滇が掐っている眷圭·充哈み钓材炭吾の悸乖と鼎に充哈みが * 减け烧けられその牲耽稿に·reqflgのチェックではなく sleep 觉轮 * に掐ってしまうˉ * この啼玛は·充哈みの钓材と sleep 觉轮への败乖がアトミックに悸 * 乖できないことに弹傍するˉ * そのため·sleep 悸乖木涟の SR 恃构では BL ビットを'1'に肋年す * ることで·充哈みの钓材と sleep 觉轮への笆惯をアトミックに悸乖 * するˉ * ldc r9,sr ではBLビットがセットされるため·充哈みは减け烧けずス * リ〖プモ〖ドに败乖するˉスリ〖プモ〖ド面は·BLビットが1でも充 * 哈みを减け烧けるため(SH7709ハ〖ドウェアマニュアル 8-10)·スリ〖 * プモ〖ドへの败乖木稿に充哈みを减烧スリ〖プモ〖ドから牲耽するˉ */ ldc r9,sr /* 充り哈みの钓材 */#ifndef NO_SLEEP sleep /* 充哈み略ち */#endif /* NO_SLEEP */ ldc r8,sr /* 充り哈み敦贿 */ mov.l @r10,r7 /* r7 <- reqflg */ tst r7,r7 /* reqflg が FALSEなら */ bt dispatcher_2 /* dispatcher_2 へ */ ldc r12,r7_bank /* r7_bank1 をクリア */ mov.l r12,@r10 /* reqflg を FALSEに */ bra dispatcher nop .align 4_runtsk_dis: .long _runtsk_schedtsk_dis: .long _schedtsk_enatex_mask_dis: .long TCB_enatex_mask_call_texrtn_dis: .long _call_texrtn_mask_md_ipm_dis: .long 0x40000000 + MAX_IPM << 4_mask_md_dis: .long 0x40000000_mask_bl_md_dis: .long 0x50000000 dispatch_r_k: .long dispatch_r_stacktop_dis: .long STACKTOP /* タスク迫惟婶のスタックの介袋猛 */_reqflg_dis: .long _reqflg#ifdef GHS_HOOK .global _dispatch_hook_dispatch_hook_dis: .long _dispatch_hook#endif/* * 充り哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 * * 提り黎がタスクでreqflgがセットされている眷圭のみここにくる。 * r7_bank1 = 0,充り哈み敦贿觉轮,スクラッチレジスタを瘦赂した * 觉轮で钙び叫すこと。 * */ .text .align 2 .globl ret_int .globl ret_excret_exc:ret_int: mov.l _runtsk_ret,r1 /* r0 <- runtsk */ mov.l @r1,r0 mov.l _enadsp_ret,r2 /* enadspのチェック */ mov.l @r2,r3 tst r3,r3 bt ret_int_1 mov.l _schedtsk_ret,r4 /* r5 <- schedtsk */ mov.l @r4,r5 cmp/eq r0,r5 /* runtsk と schedtsk を孺秤 */ bt ret_int_1 mov.l r14,@-r15 /* 荒りのレジスタを瘦赂 */ mov.l r13,@-r15 mov.l r12,@-r15 mov.l r11,@-r15 mov.l r10,@-r15 mov.l r9,@-r15 mov.l r8,@-r15 mov #TCB_sp,r1 /* タスクスタックを瘦赂 */ mov.l r15,@(r0,r1) mov.l ret_int_r_k,r1 /* 悸乖浩倡戎孟を瘦赂 */ mov #TCB_pc,r2 mov.l r1,@(r0,r2) bra dispatcher nop ret_int_r: mov.l @r15+,r8 mov.l @r15+,r9 mov.l @r15+,r10 mov.l @r15+,r11 mov.l @r15+,r12 mov.l @r15+,r13 mov.l @r15+,r14 ret_int_1: /* * タスク毋嘲借妄ル〖チンの弹瓢 * ret_int_r は dispatcher から钙び叫されるため·tcbのアドレスはr0に * 掐っているˉ * なお·充哈みの叫庚でタスクスイッチが券栏しない眷圭はディスパッチャ * を奶らずに ret_int から木儡 ret_int_1 に若ぶ */ mov.l @(TCB_enatex,r0),r1 mov.l _enatex_mask_ret,r2 tst r1,r2 bt ret_int_2 /* enatex が FALSE ならリタ〖ン */ mov.l @(TCB_texptn,r0),r1 /* texptnをロ〖ド */ tst r1,r1 bt ret_int_2 /* texptn が 0で痰ければT<= 0 */ mov.l _call_texrtn_ret,r1 /* タスク毋嘲ル〖チンの钙び叫し */ jsr @r1 nop ret_int_2: #ifdef SUPPORT_CHG_IPM mov #32,r0 mov.l @(r0,r15),r1 mov.l _unmask_ipm,r2 and r2,r1 mov.l _task_intmask_k,r2 mov.l @r2,r3 or r3,r1 mov.l r1,@(r0,r15)#endif /* SUPPORT_CHG_IMP */ mov.l @r15+,r7 /* spc,pr,ssr,スクラッチレジスタを牲耽 */ mov.l @r15+,r6 mov.l @r15+,r5 mov.l @r15+,r4 mov.l @r15+,r3 mov.l @r15+,r2 mov.l @r15+,r1 mov.l _mask_md_bl_ret,r0 ldc r0,sr /* BLを1に */ mov.l @r15+,r0 lds.l @r15+,mach lds.l @r15+,macl ldc.l @r15+,gbr ldc.l @r15+,ssr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -