⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core_support.s

📁 μITRON4.0 source code for ARM
💻 S
📖 第 1 页 / 共 2 页
字号:
 *  タスク倡幌箕借妄 * *  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 + -