📄 core_support.s
字号:
/* * 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 + -