📄 core_support.s
字号:
* タスク倡幌箕借妄 * * dispatcherから钙び叫されるため·TCBのアドレスはr1に掐っている */ .text .globl start_rstart_r: msr cpsr, #(CPSR_SVC|CPSR_ALWAYS_SET) /* CPUロック豺近觉轮に */ ldr lr, =ext_tsk /* 提り戎孟肋年 */ ldr r2, [r1, #TCB_p_tinib] /* p_runtsk->p_tinibをr2に */ ldr r0, [r2, #TINIB_exinf] /* exinfを苞眶レジスタr0に */ ldr r1, [r2, #TINIB_task] /* タスク弹瓢戎孟にジャンプ */ mov pc, r1 /* * 充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 * * ret_intは·充哈みハンドラから提った木稿に悸乖するル〖チンで· * 充哈みハンドラ姜位稿·タ〖ゲット巴赂の借妄を悸乖した稿· * カ〖ネル瓷妄の充哈みを敦贿·スタックを充哈み涟のスタックにした * 觉轮で钙び叫されるˉ */ .text .global ret_int .global ret_excret_int:ret_exc: /* * 毋嘲ˇ充哈みのネストカウント∈excpt_nest_count)のデクリメント */ ldr r0, =excpt_nest_count /* r0 <-excpt_nest_count */ ldr r1, [r0] sub r2, r1, #1 str r2, [r0] cmp r2, #0 /* 提り黎が润タスクコンテキストなら */ bne ret_int_1 /* すぐにリタ〖ン */ /* * reqflgをチェックする涟に充哈みを敦贿するのは·reqflgをチェック * した木稿に充哈みハンドラが弹瓢され·その面でディスパッチが妥滇 * された眷圭に·すぐにディスパッチされないという啼玛が栏じるため * であるˉ */ ldr r0, =reqflg ldr r1, [r0] cmp r1, #0 /* reqflgがtrueであればret_int_2へ */ bne ret_int_2ret_int_1: /* * 充哈み借妄からのリタ〖ンにより·CPUロック豺近觉轮に败乖しなければ * ならないˉ * ARMでは·CPSRのIRQビットでCPUロック豺近觉轮とするため·帽にリタ〖ン * すればよいˉ */ ldmfd sp!,{r1} /* CPSRの牲耽借妄 */ msr spsr, r1 /* 提り黎のcpsrをspsrに肋年 */ ldmfd sp!,{r0-r3,ip,lr,pc}^ /* コンテキストの牲耽·^烧きなので、cpsr <- spsr */ ret_int_2:ret_int_3: /* * ここへは·CPU毋嘲ハンドラの叫庚借妄からも尸呆してくるˉ * * ここでは·提り黎がタスクであり·スタックは·タスクスタックの惧 * にスクラッチレジスタのみが瘦赂された觉轮になっているˉまた· * プロセッサは·ス〖パ〖バイザ〖モ〖ドˇカ〖ネル瓷妄の充哈みを敦贿 * した觉轮となっているˉ */ ldr r0, =reqflg /* reqflgをfalseに */ mov r1, #0 str r1, [r0] /* * CPUロック觉轮に败乖するˉ * * この箕爬でCPUロック觉轮とするのは·dispatcherへ尸呆する箕と· * call_texrtnを钙び叫す箕に·CPUロック觉轮になっている涩妥がある * ためであるˉ * * ARMでは·CPSRのIRQビットでCPUロック觉轮を山附するため·ここでは· * 泼に部も乖わないˉ */ /* * dspflgがfalseである眷圭と·p_runtskとp_schedtskが票じ眷圭には· * ディスパッチを乖わないˉこのチェックが涩妥なのは·タスク毋嘲借 * 妄ル〖チンの钙叫しが涩妥な眷圭に·ディスパッチが涩妥なくても· * reqflgをtrueにするためであるˉ */ ldr r0, =p_runtsk /* p_runtsk をr1に粕み哈む */ ldr r1, [r0] ldr r0, =dspflg ldr r2, [r0] cmp r2, #0 /* dspflgがfalseならret_int_4へ */ beq ret_int_4 ldr r0, =p_schedtsk /* p_schedtsk をr2に粕み哈む */ ldr r2, [r0] cmp r1, r2 /* p_runtskとp_schedtskが票じなら */ beq ret_int_4 /* ret_int_4へ */ stmfd sp!, {r4-r11} /* 荒りのレジスタを瘦赂 */ str sp, [r1,#TCB_sp] /* タスクスタックを瘦赂 */ adr r0, ret_int_r /* 悸乖浩倡戎孟を瘦赂 */ str r0, [r1,#TCB_pc] b dispatcherret_int_r: ldmfd sp!, {r4-r11} /* レジスタの牲耽 */ ret_int_4: /* * enatexがtrueで·texptnが0でなければ·タスク毋嘲借妄ル〖チンを * 钙び叫すˉ * dispatcherから钙び叫されるため·TCBのアドレスはr1に掐っている */ ldrb r0, [r1,#TCB_enatex] tst r0, #TCB_enatex_mask beq ret_int_5 /* enatex が false なら ret_int5へ */ ldr r0, [r1,#TCB_texptn] /* texptnをロ〖ド */ tst r0, r0 /* texptn が0で痰ければ */ blne call_texrtn /* タスク毋嘲ル〖チンの钙び叫し */ ret_int_5: /* * 充哈み借妄からのリタ〖ンにより·CPUロック豺近觉轮に败乖するよ * うにするˉARMはCPSRのIRQビットによってCPUロック觉轮を山してい * るため·そのままリタ〖ンすればよいˉ */ ldmfd sp!, {r0} /* spsr を牲耽 */ msr spsr,r0 /* 提り黎のcpsrをspsrに肋年 */ ldmfd sp!,{r0-r3,ip,lr,pc}^ /* タスクに牲耽 ^烧きなので、cpsr <- spsr */ /* * CPU毋嘲ハンドラ * * CPU毋嘲ハンドラは·润タスクコンテキストで悸乖するˉ * *//* * 踏年盗炭吾 毋嘲ハンドラ */ .text .align 2 .global undef_handlerundef_handler: /* * タスクの瓢侯箕モ〖ド(ス〖パ〖バイザ〖モ〖ド)へ */ msr cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミ〖 */ /* * spsrと提り戎孟を艰评するために踏年盗モ〖ドへ */ msr cpsr, #(CPSR_UND|CPSR_CPULOCK|CPSR_ALWAYS_SET) mov r0, lr mrs r1, spsr mov r2, #EXCH_NO_UNDEF b target_exc_handler/* * SWI 毋嘲ハンドラ */ .text .align 2 .global swi_handlerswi_handler: /* * タスクの瓢侯箕モ〖ド(ス〖パ〖バイザ〖モ〖ド)へ * 傅」ス〖パ〖バイザ〖モ〖ドだが·CPUロック觉轮とする */ msr cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミ〖 */ mov r0, lr mrs r1, spsr mov r2, #EXCH_NO_SWI b target_exc_handler/* * プリフェッチアボ〖ド 毋嘲ハンドラ */ .text .align 2 .global prefetch_handlerprefetch_handler: /* * タスクの瓢侯箕モ〖ド(ス〖パ〖バイザ〖モ〖ド)へ */ msr cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミ〖 */ /* * spsrと提り戎孟を艰评するためにアボ〖トモ〖ドへ */ msr cpsr, #(CPSR_ABT|CPSR_CPULOCK|CPSR_ALWAYS_SET) mov r0, lr mrs r1, spsr mov r2, #EXCH_NO_PABORT b target_exc_handler/* * デ〖タアボ〖ド 毋嘲ハンドラ */ .text .align 2 .global data_abort_handlerdata_abort_handler: /* * タスクの瓢侯箕モ〖ド(ス〖パ〖バイザ〖モ〖ド)へ */ msr cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミ〖 */ /* * spsrと提り戎孟を艰评するためにアボ〖トモ〖ドへ */ msr cpsr, #(CPSR_ABT|CPSR_CPULOCK|CPSR_ALWAYS_SET) mov r0, lr mrs r1, spsr mov r2, #EXCH_NO_DABORT b target_exc_handler#ifndef TARGET_FIQ_HANDLER/* * FIQ 毋嘲ハンドラ */ .text .align 2 .global fiq_handlerfiq_handler: /* * タスクの瓢侯箕モ〖ド(ス〖パ〖バイザ〖モ〖ド)へ */ msr cpsr, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_CPULOCK|CPSR_ALWAYS_SET) stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミ〖 */ /* * spsrと提り戎孟を艰评するためにFIQモ〖ドへ */ msr cpsr, #(CPSR_FIQ|CPSR_FIQ_BIT|CPSR_CPULOCK|CPSR_ALWAYS_SET) mov r0, lr mrs r1, spsr mov r2, #EXCH_NO_FIQ b target_exc_handler#endif /* TARGET_FIQ_HANDLER *//* * 腮警箕粗略ち */ .globl _sil_dly_nse_sil_dly_nse: sub r0, r0, #SIL_DLY_TIM1 cmp r0, #0 bgt _sil_dly_nse1 movle pc, lr_sil_dly_nse1: sub r0, r0, #SIL_DLY_TIM2 cmp r0, #0 bgt _sil_dly_nse1 movle pc, lr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -