📄 cpu_support.s
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_support.S,v 1.9 2003/12/15 05:50:05 takayuki Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M32R脱∷ */#define _MACRO_ONLY#include <cpu_rename.h>#include <m32rasm.inc>#include <s_services.h>#include "offset.h"/**************************************************************************//***************************//* EITベクタエントリの年盗 *//***************************//* .vectorセクションはROM鄂粗の黎片に芹弥される */ .section ".vector","ax" .extern _start .balign 0x10Label _reset //リセット毋嘲 bra _start .balign 0x10Label vector_entry_SBI stmdb "r0,r1,r2,r14" ldi r1, #(EXC_SBI*4-4) bra _exception_handler .balign 0x10Label vector_entry_RIE stmdb "r0,r1,r2,r14" ldi r1, #(EXC_RIE*4-4) bra _exception_handler .balign 0x10Label vector_entry_AE stmdb "r0,r1,r2,r14" ldi r1, #(EXC_AE*4-4) bra _exception_handler/* * トラップベクタエントリ * 妥傍戎规を艰りたいので、办枚リンクレジスタを锣闰してサブル〖チンコ〖ル */ .balign 0x10Label vector_entry_trap bra _trap_handler_0 bra _trap_handler_1 bra _trap_handler_2 bra _trap_handler_3 bra _trap_handler_4 bra _trap_handler_5 bra _trap_handler_6 bra _trap_handler_7 bra _trap_handler_8 bra _trap_handler_9 bra _trap_handler_10 bra _trap_handler_11 bra _trap_handler_12 bra _trap_handler_13 bra _trap_handler_14 bra _trap_handler_15/**************************************************************************Q: なぜ办刨充哈みスタックに姥んだ攫鼠をタスクスタックに姥みなおすのかA: 呵碍充哈みタ〖ンアラウンド箕粗を你く娃えるため附哼のM32R巴赂婶の充哈み叫掐り庚借妄の呵碍ケ〖ス(クリティカルパス)は、タスクコンテキストで充哈みがかかり、かつハンドラ柒でより惧疤の庭黎刨を积つタスクが弹瓢された眷圭である。この眷圭、附哼悸乖しているタスクの链コンテキスト柒推が锣闰され、糠しいタスクのコンテキスト柒推を牲耽する。このとき、カ〖ネル瓢侯の办从拉を瘦俱するために、システムスタックは充り哈みがかかる涟の觉轮まで提さなければならない。ここで、コンテキストの柒推をシステムスタックに姥んでいた眷圭、呵碍ケ〖スの狠には染眶夺いレジスタの姥み木し(システムスタックからタスクスタックへの姥み木し)が券栏し、RAMアクセスの庐刨に孺毋したオ〖バヘッドが栏ずる。塑OSはリアルタイムOSであるため、士堆拉墙の羹惧よりも、呵碍悸乖箕粗の没教に肩淬を弥き、このような悸刘缄恕を联买した。[纳淡 20020810] なんか柒垄RAMからSDRAMのDMA啪流が庐いらしいので、これで呵碍ケ〖スに滦借するのも缄かなと蛔う。***************************************************************************//* * 充哈みベクタエントリ と 充哈みハンドラ弹瓢/牲耽借妄婶 *//* * レジスタの姥み数 * R0,R1,R14,ICUISTS,R2-R7,ACC(HI/LO),BPC,[ICUIMASK|PSW],R8-R13 */ .balign 0x10 .extern InterruptHandlerEntry .extern _unhandled_interrupt_handlerLabel interrupt_handler /* 侯度挝拌の侯喇 */ stmdb "r0,r1" /* タスクコンテキストからの充哈みかな々 */ mvfc r0, psw and3 r1, r0, 0x8000 beqz r1, L1 /* タスクからならタスクスタックへ磊仑 & R1に充哈みスタック疤弥をコピ〖 */ or3 r0, r0, 0x80 mv r1, r15 mvtc r0, psw /* 充哈みスタックに锣闰したものをタスクスタックにコピ〖 */ ld r0, @(4,r1) st r0, @-r15 ld r0, @r1 st r0, @-r15 addi r1, 8 mvtc r1, spi mvfc r0, pswL1: stmdb "r14" ldidx r14 /* 充哈み妥傍戎规の艰叫し */ ld24 r1, ICUISTS ld r0, @r1 st r0, @-r15 /* ハンドラ弹瓢戎孟艰叫し */ lds r1, r14, InterruptHandlerEntry srli r0, 20 add r1, r0 addi r1, -4 ld r1, @r1 srli r0, 2 /* ハンドラの判峡澄千 */ bnez r1, L2 /* ハンドラ踏判峡の充哈み */ lds r1, r14, _unhandled_interrupt_handler beqz r1, exit_interrupt_handlerL2: /* スクラッチ+BPCを锣闰してハンドラ弹瓢 */ stmdb "r2,r3,r4,r5,r6,r7" mvfachi r2 st r2, @-r15 mvfaclo r2 st r2, @-r15 mvfc r2, bpc st r2, @-r15 /* 充哈みスタックモ〖ド, 充哈み钓材, PSW瘦赂 */ mvfc r2, psw or3 r3, r2, 0x40 and3 r3, r3, 0xff7f mvtc r3, psw st r2, @-r15 /* ハンドラ弹瓢 */ lds r14, r14, interrupt_handler_r jmp r1 /* * 充哈みハンドラ 牲耽ポイント */ .text .align 4interrupt_handler_r: /* 充哈み敦贿, スタックモ〖ド牲耽 */ ld r0, @r15+ mvtc r0, psw /* 提り黎のチェック (BSMがユ〖ザスタック -> タスクへ)*/ and3 r0, r0, 0x8000 beqz r0, recover_int /* タスクコンテキストからの充哈み - 牲耽ル〖チン */ ldidx r14 /* reqflgのチェック */ lds r0, r14, _kernel_reqflg ld r1, @r0 beqz r1, recover_task /* ハンドラ柒でのディスパッチ券栏痰し */ /* reqflg = 0 */ ldi r1, #0 st r1, @r0 /* タスクディスパッチの券栏 */ stmdb "r8,r9,r10,r11,r12,r13" lds r0, r14, _kernel_runtsk ld r0, @r0 lds r1, r14, recover_task_r st r1, @(TCB_pc, r0) ld24 r1, ICUIMASK ld r2, @r1 mvfc r1, psw or r1, r2 st r1, @(TCB_psw, r0) st r15, @(TCB_sp, r0) bra _kernel_exit_and_dispatchrecover_task_r: ldmia "r13,r12,r11,r10,r9,r8" /* タスク毋嘲弹瓢 */recover_task: bl _kernel_calltex /* 鼎奶牲耽借妄 */recover_int: ld r0, @r15+ mvtc r0, bpc ld r0, @r15+ mvtaclo r0 ld r0, @r15+ mvtachi r0 ldmia "r7,r6,r5,r4,r3,r2"exit_interrupt_handler: /* 充哈みマスク牲耽 */ ld r0, @r15+ srli r0, 16 ld24 r1, ICUIMASK+1 stb r0, @r1 ldmia "r14,r1,r0" rte/**************************************************************************/ .section ".vector","ax"/* * トラップのエントリ婶 : トラップ戎规の呈羌 */ .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .align 4 _kernel__trap_handler_\num: stmdb "r0,r1,r2,r14" ldi r1, #((\num + EXC_TRAP00 -1) * 4) bra _exception_handler .endr/* * 毋嘲/トラップハンドラ *//* * レジスタの姥み数 * R0-R7,R14,ACC(HI/LO),BPC,[ICUIMASK|PSW],R8-R13 */ .extern ExceptionHandlerEntry_exception_handler: ldidx r14 /* ハンドラ粕み叫し */ lds r0, r14, ExceptionHandlerEntry add r0, r1 ld r0, @r0 bnez r0, L3 /* ハンドラ踏判峡の充哈み */ lds r1, r14, _unhandled_interrupt_handler beqz r1, exit_exception_handler //ハンドラ踏判峡なら篓姜位 /* ハンドラ弹瓢 & スタック磊仑 */L3: stmdb "r3,r4,r5,r6,r7" mvfachi r1 st r1, @-r15 mvfaclo r1 st r1, @-r15 mvfc r1, bpc st r1, @-r15 mvfc r2, psw and3 r2, r2, 0xff7f mvtc r2, psw lds r14, r14, exception_handler_r jmp r0 .text .align 4exception_handler_r: ldidx r14 /* 提り黎はどこ々 (BSM=1->タスク)*/ mvfc r0, psw and3 r1, r0, 0x8000 beqz r1, L5 /* タスクスタックへ磊り仑える */ or3 r1, r0, 0x80 mvtc r1, psw /* CPU毋嘲面にディスパッチがあるか? */ lds r0, r14, _kernel_reqflg ld r1, @r0 beqz r1, L4 /* ディスパッチの券栏 */ stmdb "r8,r9,r10,r11,r12,r13" ld24 r0, ICUIMASK ld r0, @r0 mvfc r1, psw srli r1, 8 //IE,SM,C <= BIE,BSM,BC or r0, r1 lds r2, r14, _kernel_runtsk ld r2, @r2 st r0, @(TCB_psw, r2) lds r3, r14, recover_exception_exc_task_r st r0, @(TCB_pc, r2) st r15, @(TCB_sp, r2) /* ディスパッチル〖チンへ若ばす */ lds r0, r14, _kernel_exit_and_dispatch mvtc r0, bpc xor r0, r0 mvtc r0, psw rte .align 4recover_exception_exc_task_r: ldmia "r13,r12,r11,r10,r9,r8" /* タスク毋嘲の弹瓢 */L4: bl _kernel_calltex /* スクラッチ牲耽 */L5: ld r0, @r15+ mvtc r0, bpc ld r0, @r15+ mvtachi r0 ld r0, @r15+ mvtaclo r0 ldmia "r7,r6,r5,r4,r3"exit_exception_handler: ldmia "r14,r2,r1,r0" rte/**************************************************************************//* * タスクディスパッチャ * extern void dispatch(void); * extern void exit_and_dispatch(void); */Function _kernel_dispatch /* * レジスタ锣闰 */ stmdb "r8,r9,r10,r11,r12,r13,r14" ldidx r14 /* * TCBにスタックと浩弹瓢戎孟を瘦赂 */ lds r0, r14, _kernel_runtsk lds r1, r14, dispatch_r ld r0, @r0 st r1, @(TCB_pc, r0) // runtsk->tskctxb->pc = dispatch_r; st r15,@(TCB_sp, r0) // runtsk->tskctxb->sp = r15; /* * PSW[12:15]に充哈みマスクビットを仆っ哈んでTCBに瘦赂 */ ld24 r2, ICUIMASK mvfc r1, psw ld r3, @r2 or r1, r3 st r1, @(TCB_psw, r0) //runtsk->tskctxb->psw = PSW|*(ICUIMASK); /* * 庙罢 : この眷疥は.alignを蝗わずに32ビット董肠であることを * 瘦俱すること。そうでないとexit_and_dispatchへの尸呆 * で木涟の16ビット炭吾が悸乖されてしまう。 */Label _kernel_exit_and_dispatch ldidx r14 /* スタックモ〖ド磊仑 */ xor r0, r0 mvtc r0, psw /* runtsk = NULL */ lds r1, r14, _kernel_runtsk ldi r0, #0 st r0, @r1 /* 肌に弹瓢すべきタスクを玫す */ lds r1, r14, _kernel_schedtskL6: ld r0, @r1 bnez r0, L7 /* 弹瓢すべきタスクがないので、充哈み钓材して略怠 */ ld24 r2, (ICUIMASK+1) ldi r3, #7 stb r3, @r2 //IMASK = 链钓材 ldi r0, 0x40 mvtc r0, psw //ei/* ldi r0, #1 ld24 r2, CLKMOD+3 stb r0, @r2 ldb r0, @r2 .rept 8 nop .endr*/ xor r0, r0 mvtc r0, psw //di bra L6L7: /* R0 = schedtsk, R1 = &schedtsk */ /* runtsk = schedtsk; */ lds r2, r14, _kernel_runtsk st r0, @r2 /* PSWと充哈みマスクを牲耽 (スタックモ〖ドも磊仑) */ ld r1, @(TCB_psw, r0) and3 r2, r1, 0xffff mvtc r2, psw srli r1, 16 ld24 r2, ICUIMASK+1 stb r1, @r2 /* スタックポインタとプログラムカウンタを牲耽 */ ld r15, @(TCB_sp, r0) ld r0, @(TCB_pc, r0) jmp r0 /* * 庙罢 : この眷疥は.alignを蝗わずに32ビット董肠であることを * 瘦俱すること。 */ /* ディスパッチ牲耽婶 */dispatch_r: /* タスク毋嘲の钙叫 */ bl _kernel_calltex ldmia "r14,r13,r12,r11,r10,r9,r8" rts/**************************************************************************/ /* * タスクの弹瓢倡幌(タスクスタ〖トアップル〖チン) * extern void activate_r(void); */ .extern _kernel_runtsk .extern ext_tskFunction _kernel_activate_r ldidx r14 /* タスク弹瓢洁洒 */ lds r2, r14, _kernel_runtsk ld r2, @r2 ld r2, @(TCB_tinib, r2) // r2 = runtsk->tinib ld r0, @(TINIB_exinf, r2) ld r1, @(TINIB_task, r2) /* タスクから提ろうとしたらext_tskへ */ lds r14, r14, ext_tsk jmp r1/**************************************************************************/ /* * 称硷 花驴なモジュ〖ル * extern ER get_ipm(IPM * ipm); * extern ER chg_ipm(IPM ipm); */Function get_ipm ld24 r1, ICUIMASK+1 ldub r2, @r1 st r2, @r0 xor r0, r0 rtsFunction chg_ipm ld24 r1, ICUIMASK+1 and3 r0, r0, 0xf st r0, @r1 xor r0, r0 rts /* * 32ビットシンボル猛徊救脱テ〖ブル */begin_table entry InterruptHandlerEntry entry _unhandled_interrupt_handler entry interrupt_handler_r entry _kernel_reqflg entry _kernel_runtsk entry _kernel_schedtsk entry recover_task_r entry ExceptionHandlerEntry entry exception_handler_r entry recover_exception_exc_task_r entry _kernel_exit_and_dispatch entry dispatch_r entry ext_tskend_table
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -