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

📄 cpu_support.s

📁 toppers操作系统源码
💻 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 + -