📄 cpu_support.s
字号:
swi r24, r1, 28 swi r25, r1, 24 swi r26, r1, 20 swi r27, r1, 16 swi r28, r1, 12 swi r29, r1, 8 swi r30, r1, 4 swi r31, r1, 0 lwi r4 , r13, runtsk /* r4 <- runtsk */ swi r1 , r4, TCB_sp /* タスクスタックをTCBに瘦赂 */ la r5 , r0, dispatch_r /* 悸乖浩倡戎孟を瘦赂 */ swi r5 , r4, TCB_pc /* 悸乖浩倡戎孟をTCBに瘦赂 */ bri dispatcherdispatch_r: lwi r31, r1, 0 /* レジスタを牲耽 */ lwi r30, r1, 4 lwi r29, r1, 8 lwi r28, r1, 12 lwi r27, r1, 16 lwi r26, r1, 20 lwi r25, r1, 24 lwi r24, r1, 28 lwi r23, r1, 32 lwi r22, r1, 36 lwi r21, r1, 40 lwi r20, r1, 44 lwi r19, r1, 48 lwi r18, r1, 52 lwi r3, r1, 56 /* MSRを提す(キャッシュの肋年を提す) */ mts rmsr,r3 addi r1, r1, 60 /* スタックポインタを提す */ /* * タスク毋嘲借妄ル〖チンの弹瓢 * dispatch_r は dispatcher から钙び叫されるため· * tcb のアドレスは r4 に掐っている * Not Yet! */ lwi r5, r4, TCB_enatex /* r5 <- enatex */ andi r6, r5, TCB_enatex_mask beqi r6, dispatch_r_1 /* enatex が FALSE ならリタ〖ン */ lwi r7, r4, TCB_texptn /* r5 <- texptn */ beqi r7, dispatch_r_1 /* texptn が 0 でなければ */ brlid r15 call_texrtn /* タスク毋嘲ル〖チンの钙び叫し */ nopdispatch_r_1: Pop r15 rtsd r15,8 nop .globl exit_and_dispatchexit_and_dispatch: /* interrupt_count をクリア */ swi r0, r13, interrupt_count dispatcher: /* * ここは充哈み敦贿で丸ること */ lwi r4, r13, schedtsk /* r4 <- schedtsk */ swi r4, r13, runtsk /* schedtsk を runtsk に */ beqi r4, dispatcher_1 /* schedtsk があるか */ lwi r1, r4, TCB_sp /* TCBからタスクスタックを牲耽 */ lwi r5, r4, TCB_pc /* TCBから悸乖浩倡戎孟を牲耽 */ bra r5 dispatcher_1: /* * ここで充哈みモ〖ドに磊り仑えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という2つの罢蹋があるˉ */ la r1, r0, STACKTOP /* 充哈みスタックに恃构 */ la r6, r0, 1 /* interrupt_count を1に */ swi r6, r13, interrupt_count la r5, r0, 0x02 | MSR_CACHE_SETTING /* IE = '1' */ la r4, r0, MSR_CACHE_SETTING /* IE = '0' */ dispatcher_2: mts rmsr, r5 /* 充哈み钓材(MSR(IE)をセット) */ nop nop mts rmsr, r4 /* 充哈み敦贿(MSR(IE)をクリア) */ lwi r6, r13, reqflg /* r6 <- reqflg */ beqi r6, dispatcher_2 /* reqflg が FALSE なら */ swi r0, r13, interrupt_count /* interrupt_count をクリア */ swi r0, r13, reqflg /* reqflg を FALSE に */ bri dispatcher /* * 充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 * * 提り黎がタスクで reqflg がセットされている眷圭のみここにくるˉ * interrupt_count = 0·充哈み敦贿觉轮·スクラッチレジスタを瘦赂した * 觉轮で钙び叫すことˉ */ .align 2 .globl ret_int .globl ret_excret_exc:ret_int: swi r0, r13, reqflg /* reqflg を FALSE に */ lwi r5, r13, runtsk /* r5 <- runtsk */ lwi r6, r13, enadsp /* r6 <- enadsp */ beqi r6, ret_int_1 /* enadsp が FALSE なら ret_int_1 へ */ lwi r4, r13, schedtsk /* r4 <- schedtsk */ sub r6, r4, r5 /* runtsk と schedtsk が票じなら */ beqi r6, ret_int_1 /* ret_int_1 へ */ addi r1, r1, -52 /* 荒りのレジスタを瘦赂する */ swi r19, r1, 48 swi r20, r1, 44 swi r21, r1, 40 swi r22, r1, 36 swi r23, r1, 32 swi r24, r1, 28 swi r25, r1, 24 swi r26, r1, 20 swi r27, r1, 16 swi r28, r1, 12 swi r29, r1, 8 swi r30, r1, 4 swi r31, r1, 0 swi r1 , r5, TCB_sp /* タスクスタックをTCBに瘦赂 */ la r6 , r0, ret_int_r /* 悸乖浩倡戎孟を瘦赂 */ swi r6 , r5, TCB_pc /* 悸乖浩倡戎孟をTCBに瘦赂 */ bri dispatcherret_int_r: lwi r31, r1, 0 /* レジスタを牲耽 */ lwi r30, r1, 4 lwi r29, r1, 8 lwi r28, r1, 12 lwi r27, r1, 16 lwi r26, r1, 20 lwi r25, r1, 24 lwi r24, r1, 28 lwi r23, r1, 32 lwi r22, r1, 36 lwi r21, r1, 40 lwi r20, r1, 44 lwi r19, r1, 48 addi r1, r1, 52 lwi r3, r1, 0 /* MSR を提す∈キャッシュの肋年を提す∷*/ mts rmsr, r3 ret_int_1: /* * タスク毋嘲ル〖チンの弹瓢 * ret_int_r は dispatcher から钙び叫されるため· * tcb のアドレスは r4 に掐っている * Not Yet! */ lwi r5, r4, TCB_enatex /* r5 <- enatex */ andi r6, r5, TCB_enatex_mask beqi r6, ret_int_2 /* enatex が FALSE ならリタ〖ン */ lwi r7, r4, TCB_texptn /* r5 <- texptn */ beqi r7, ret_int_2 /* texptn が 0 でなければ */ brlid r15 call_texrtn /* タスク毋嘲ル〖チンの钙び叫し */ nopret_int_2: lwi r3, r1, 0 /* MSR を提す∈充哈みIE=0で充哈み敦贿になる∷*/ mts rmsr,r3 lwi r18, r1, 4 lwi r17, r1, 8 lwi r16, r1, 12 lwi r15, r1, 16 lwi r14, r1, 20 lwi r12, r1, 24 lwi r11, r1, 28 lwi r10, r1, 32 lwi r9, r1, 36 lwi r8, r1, 40 lwi r7, r1, 44 lwi r6, r1, 48 lwi r5, r1, 52 lwi r4, r1, 56 lwi r3, r1, 60 rtid r14,0 addik r1,r1,64 /* * タスク弹瓢借妄 * * スタックの艰り数 * Microblaze Processor Reference Guide 52×53より * 簇眶钙叫しのさい苞眶は·r5×r10 に呈羌するˉ * それと票箕に钙叫し傅はスタックフレ〖ムに苞眶の呈羌眷疥を澄瘦する涩妥 * があるˉさらにその惧にはリンクレジスタ(R15)の尸の挝拌が涩妥となるˉ * 钙叫し黎は构に戮の簇眶を钙び叫す眷圭霹に r5×r10 をこの挝拌に瘦赂す * るˉ * Low Address * -------------------- * new_sp -> | Link Register(R15) | * -------------------- * | Arg1脱の挝拌 | * -------------------- * | Arg2脱の挝拌 | * -------------------- * | .... | * -------------------- * High Address */ .text .globl activate_r .align 2activate_r: ori r4, r0, 0x02 | MSR_CACHE_SETTING /* msrの介袋猛 */ mts rmsr,r4 /* 充哈み钓材(MSR(IE)をセット) */ lw r11, r1, r0 /* タスクの悸乖戎孟 */ lwi r5, r1, 4 /* 苞眶∈exinf∷ */ la r15, r0, ext_tsk -8 /* タスクからの提り黎 */ bra r11 /* タスクの悸乖倡幌 */ /* * 腮警箕粗略ち */ .globl _sil_dly_nse_sil_dly_nse: addi r5, r5, -SIL_DLY_TIM1 bgti r5, _sil_dly_nse_1 rtsd r15, 8 nop _sil_dly_nse_1: addi r5, r5, -SIL_DLY_TIM2 bgti r5, _sil_dly_nse_1 rtsd r15, 8 nop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -