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

📄 core_support.s

📁 μITRON4.0 source code for ARM
💻 S
📖 第 1 页 / 共 2 页
字号:
/* *  TOPPERS/ASP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Advanced Standard Profile Kernel *  *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2006-2007 by Embedded and Real-Time Systems Laboratory *              Graduate School of Information Science, Nagoya Univ., JAPAN *  *  惧淡螟侯涪荚は·笆布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェ *  ア∈塑ソフトウェアを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖 *  恃ˇ浩芹邵∈笆布·网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *      また·塑ソフトウェアのユ〖ザまたはエンドユ〖ザからのいかなる妄 *      统に答づく懒滇からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを *      倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·泼年の蝗脱誊弄 *  に滦する努圭拉も崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェ *  アの网脱により木儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·そ *  の勒扦を砷わないˉ *  *  @(#) $Id: core_support.S 948 2008-04-14 08:34:27Z ertl-honda $ *//* *        コア巴赂モジュ〖ル アセンブリ咐胳婶∈ARM脱∷ */#define TOPPERS_MACRO_ONLY#define TOPPERS_ASM_MACRO#define UINT_C(val)		(val)		/* uint_t房の年眶を侯るマクロ */#define ULONG_C(val)	(val)		/* ulong_t房の年眶を侯るマクロ */#include "kernel_impl.h"#include "offset.h"#ifdef VECTOR_KERNEL/* * 毋嘲ベクタ */    .section .vector,"a"    .global vector_tablevector_table:    ldr pc, reset_vector       /* リセット             */    ldr pc, undef_vector       /* 踏年盗炭吾           */    ldr pc, swi_vector         /* ソフトウェア充哈み   */    ldr pc, prefech_vector     /* プリフェッチアボ〖ド */    ldr pc, data_abort_vector  /* デ〖タアボ〖ド       */    ldr pc, reset_vector    ldr pc, irq_vector         /* IRQ                  */    ldr pc, fiq_vector         /* FIQ                  *//* *  毋嘲ベクタの炭吾から徊救される *  ジャンプ黎アドレス */    .global vector_ref_tblvector_ref_tbl:reset_vector:    .long   startundef_vector:    .long   undef_handlerswi_vector:    .long   swi_handlerprefech_vector:    .long   prefetch_handlerdata_abort_vector:    .long   data_abort_handlerirq_vector:    .long   irq_handlerfiq_vector:    .long   fiq_handler#endif/* *  タスクディスパッチャ * */    .text    .align 2        .globl dispatchdispatch:    /*     *  このル〖チンは·タスクコンテキストˇCPUロック觉轮ˇディスパッチ     *  钓材觉轮ˇ∈モデル惧の∷充哈み庭黎刨マスク链豺近觉轮で钙び叫さ     *  れるˉ     */    stmfd sp!, {r4 - r11,lr}           /* レジスタの瘦赂 */    ldr   r0, =p_runtsk                /* p_runtskを粕み哈む */    ldr   r1, [r0]    str   sp, [r1,#TCB_sp]             /* タスクスタックを瘦赂 */    adr   r2, dispatch_r    str   r2, [r1,#TCB_pc]             /* 悸乖浩倡戎孟を瘦赂 */    b     dispatcherdispatch_r:    ldmfd sp!,{r4 - r11,lr}     /* レジスタの牲耽 */    /*     * タスク毋嘲借妄ル〖チンの弹瓢     * dispatcherから钙び叫されるため·TCBのアドレスはr1に掐っている     */    ldrb  r0,[r1,#TCB_enatex]    tst   r0,#TCB_enatex_mask    beq   dispatch_r_1          /* enatex が false ならリタ〖ン */    ldr   r0,[r1,#TCB_texptn]   /* texptn が0でなければ         */    tst   r0,r0                     bne   call_texrtn           /* タスク毋嘲ル〖チンの钙び叫し */dispatch_r_1:       mov   pc,lr        /* *  ディスパッチャの瓢侯倡幌∈cpu_support.S∷ */    .globl start_dispatchstart_dispatch:    /*     *  このル〖チンは·カ〖ネル弹瓢箕に·すべての充哈みを敦贿した觉轮     * ∈充哈みロック觉轮と票霹∷で钙び叫されるˉまた·充哈みモ〖ド∈润     *  タスクコンテキストと票霹∷で钙び叫されることを鳞年しているˉ     *     *  dispatcherは·CPUロック觉轮·∈モデル惧の∷充哈み庭黎刨マスク链     *  豺近觉轮·毋嘲∈充哈み/CPU毋嘲∷のネスト搀眶0で钙び叫すˉ          *  target_initializeでは·∈モデル惧の∷充哈み庭黎刨マスク链豺近     *  とし·カ〖ネル瓷妄嘲の充哈みであるFIQを钓材することで·     *  CPUロック觉轮ˇ∈モデル惧の∷充哈み庭黎刨マスク链豺近觉轮になるˉ     *  また·task_initializeでdisdspをfalseに介袋步しているため·ディ     *  スパッチ钓材觉轮になっているˉ     *       */        msr   cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) /* CPUロック觉轮へ */    ldr   r2, =excpt_nest_count            /* 毋嘲∈充哈み/CPU毋嘲∷のネスト搀眶 */    mov   r0, #0                           /* を0に                              */    str   r0, [r2]    b     dispatcher_0/* *  附哼のコンテキストを嘉ててディスパッチ */    .globl exit_and_dispatchexit_and_dispatch:    /* ディスパッチャ塑挛∈dispatcher∷へ */    /* *  ディスパッチャ塑挛 */dispatcher:    /*     *  このル〖チンは·タスクコンテキストˇCPUロック觉轮ˇディスパッチ     *  钓材觉轮ˇ∈モデル惧の∷充哈み庭黎刨マスク链豺近觉轮で钙び叫さ     *  れるˉ悸乖浩倡戎孟へもこの觉轮のまま尸呆するˉ     *     *  すなわち·ス〖パ〖バイザ〖モ〖ド·IRQ敦贿ˇdisdspがfalseˇdspflg     *  がtrueとなっているˉ悸乖浩倡戎孟へもこの觉轮のまま尸呆するˉ     */#ifdef LOG_DSP_ENTER    ldr   r1, =p_runtsk     /* p_runtskをパラメ〖タに */    ldr   r0, [r1]            bl    log_dsp_enter#endif /* LOG_DSP_ENTER */dispatcher_0:    ldr   r0, =p_schedtsk   /* p_schedtskをp_runtskに */    ldr   r1, [r0]    ldr   r2, =p_runtsk       str   r1, [r2]            cmp   r1, #0            /* p_runtskがNULLならdispatcher_1へ */    beq   dispatcher_1                 ldr   sp, [r1,#TCB_sp]  /* タスクスタックを牲耽 */#ifdef LOG_DSP_LEAVE    mov   r0, r1            /* p_runtskをパラメ〖タに */    mov   r4, r1            /* r1はスクラッチレジスタなので瘦赂 */    bl    log_dsp_leave    mov   r1, r4#endif /* LOG_DSP_LEAVE */    ldr   pc, [r1,#TCB_pc]  /* 悸乖浩倡戎孟を牲耽   */    dispatcher_1:    /*     * CPUロック觉轮の豺近と·润タスクコンテキスト悸乖觉轮への     * 洁洒をする     */    ldr   r0, =_kernel_istk            /* 润タスクコンテキストのスタックへ */    ldr   sp, [r0]        ldr   r1, =_kernel_istksz    ldr   r3, [r1]    add   sp, sp, r3    ldr   r2, =reqflg                  /* r2 <- reqflg */    ldr   r3, =excpt_nest_count        /* r3 <-excpt_nest_count */    mov   r0, #0    mov   r1, #1dispatcher_2:    /*     *  充哈みを钓材し·润タスクコンテキスト悸乖觉轮とし充哈みを略つˉ     *     *  ここで润タスクコンテキスト悸乖觉轮に磊り垂えるのは·ここで券栏     *  する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯と·充哈み     *  ハンドラ柒でのタスクディスパッチの松贿という2つの罢蹋があるˉ     *     *  プロセッサを充哈み略ちに败乖させる借妄と·充哈み钓材とは·稍材     *  尸に乖なう涩妥があるˉ     *  これを稍材尸に乖なわない眷圭·充哈みを钓材した木稿に充哈     *  みが掐り·その面でタスクが悸乖材墙觉轮になると·悸乖すべきタス     *  クがあるにもかかわらずプロセッサが充哈み略ちになってしまうˉ     *     *  充哈み略ちの粗は·p_runtskをNULL∈♂0∷に肋年しなければならな     *  いˉこのように肋年しないと·充哈みハンドラからiget_tidを钙び叫     *  した狠の瓢侯が慌屯に圭米しなくなるˉ     *     *  タ〖ゲットによっては·臼排蜗モ〖ド霹に败乖するため·筛洁の数恕と     *  佰なる缄界が涩妥な眷圭があるˉ     *  そのようなタ〖ゲットでは·タ〖ゲット巴赂において·TOPPERS_CUSTOM_IDLE     *  を年盗し·アセンブラマクロとして·toppers_asm_custom_idle を脱罢     *  すればよいˉtoppers_asm_custom_idle の淡揭にあたっては·肌のレジ     *  スタは蝗脱できないˉ     *     r0, r1, r2, r3, sp      *     */    str   r1, [r3]                          /* excpt_nest_count = 1 */#ifdef TOPPERS_CUSTOM_IDLE    toppers_asm_custom_idle#else    msr   cpsr, #(CPSR_SVC|CPSR_ALWAYS_SET) /* 充り哈み钓材(システムモ〖ド) */    nop    msr   cpsr, #(CPSR_SVC|CPSR_CPULOCK|CPSR_ALWAYS_SET) /* CPUロック(システムモ〖ド) */#endif /* TOPPERS_CUSTOM_IDLE */    ldr   r6, [r2]        /* reqflgがfalseならdispatcher_2へ */    cmp   r6, #0              beq   dispatcher_2                     str   r0, [r2]        /* reqflgをfalseに */    str   r0, [r3]        /* excpt_nest_count = 0 */    b     dispatcher_0/* *  カ〖ネルの姜位借妄の钙叫し * *  モ〖ドとスタックを润タスクコンテキスト脱に磊り仑えˉ */    .globl call_exit_kernelcall_exit_kernel:    msr   cpsr, #(CPSR_SVC|CPSR_ALWAYS_SET)     ldr  r0, =_kernel_istkpt       /* 润タスクコンテキストのスタックへ */    ldr  sp, [r0]    b     exit_kernel/*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -