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

📄 cpu_support.s

📁 嵌入式系统开发 TOPPERS and JSP Kernel Release 1.3 TOPPERS = Toyohashi Open Platform for Embedded Real-Tim
💻 S
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  *  惧淡螟侯涪荚は·Free Software Foundation によって给山されている  *  GNU General Public License の Version 2 に淡揭されている掘凤か·笆 *  布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ *  アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ *      ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 *      に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· *      この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 *      み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ *    (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 *        涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する *        ことˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚を倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· *  塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ *  ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい *  かなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: cpu_support.S,v 1.2 2002/04/05 09:01:40 takayuki Exp $ *//* *	プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M32R脱∷ */#define	_MACRO_ONLY#include "m32rasm.inc"#include "sys_defs.h"#include "cpu_defs.h"#include "sys_config.h"#include "offset.h"/**************************************************************************悸刘メモˇ32ビットの篓猛ロ〖ドM3A-2131G50は0x01000000から16MBのSDRAMがマップされているˉここにカ〖ネルデ〖タを充り烧けた眷圭·ld24炭吾でアドレスを艰ると惧8ビットが艰れないˉ办数·ldi炭吾では≈踏豺疯シンボル∽でエラ〖になるため·シフトで粕み哈むこともできないˉそこで·プログラム面に篓猛を虽めてblで若び臂え·R14を蝗った粗儡アドレッシングでアクセスすることにしたˉプログラム面に叫てくる"bl 1f" ".long xxxx" "1:" という寥は·この搀闰ル〖チンであるˉV850のgasには·hi()とlo()という导击マクロがあるのだが... #そのうちV850のgasから败竣しよう **************************************************************************//***************************//* 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/**************************************************************************//* * 充哈みベクタエントリ と 充哈みハンドラ弹瓢/牲耽借妄婶 *//* * レジスタの姥み数 *   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, 1f		/* タスクからならタスクスタックへ磊仑 & 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, psw1:	stmdb	"r14"	bl		1f		.long	InterruptHandlerEntry		.long	_unhandled_interrupt_handler		.long	interrupt_handler_r1:		/* 充哈み妥傍戎规の艰叫し */	ld24	r1, ICUISTS	ld		r0, @r1	st		r0, @-r15		/* ハンドラ弹瓢戎孟艰叫し */	ld		r1, @r14+		//InterruptHandlerEntry	srli	r0, 20	add		r1, r0	addi	r1, -4	ld		r1, @r1	srli	r0, 2		/* ハンドラの判峡澄千 */	bnez	r1, 1f		/* ハンドラ踏判峡の充哈み */		ld		r1, @r14		//_unhandled_interrupt_handler	beqz	r1, exit_interrupt_handler1:		/* スクラッチ+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	ld		r14, @(r14,4)	//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		/* タスクコンテキストからの充哈み - 牲耽ル〖チン */	bl		1f		.long	_kernel_reqflg		.long	_kernel_runtsk		.long	recover_task_r1:		/* reqflgのチェック */	ld		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"	ld		r0, @r14+		//_kernel_runtsk	ld		r0, @r0	ld		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	_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:	bl		1f		.long	ExceptionHandlerEntry		.long	_unhandled_interrupt_handler1:		/* ハンドラ粕み叫し */	ld		r0, @r14+		//ExceptionHandlerEntry	add		r0, r1	ld		r0, @r0	bnez	r0, 1f		/* ハンドラ踏判峡の充哈み */		ld		r1, @r14+		//_unhandled_interrupt_handler	beqz	r1, exit_exception_handler		//ハンドラ踏判峡なら篓姜位		/* ハンドラ弹瓢 & スタック磊仑 */1:	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	ld24	r14, exception_handler_r	jmp		r0	.text	.align 4exception_handler_r:	bl		1f		.long	_kernel_reqflg		.long	_kernel_runtsk		.long	recover_exception_exc_task_r		.long	_kernel_exit_and_dispatch1:		/* 提り黎はどこ々 (BSM=1->タスク)*/	mvfc	r0, psw	and3	r1, r0, 0x8000	beqz	r1, 1f		/* タスクスタックへ磊り仑える */	or3		r1, r0, 0x80	mvtc	r1, psw		/* CPU毋嘲面にディスパッチがあるか? */	ld		r0, @r14+		//_kernel_reqflg	ld		r1, @r0	beqz	r1, 2f		/* ディスパッチの券栏 */	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	ld		r2, @r14+		//_kernel_runtsk	ld		r2, @r2	st		r0, @(TCB_psw, r2)	ld		r3, @r14+		//recover_exception_exc_task_r	st		r0, @(TCB_pc, r2)	st		r15, @(TCB_sp, r2)		/* ディスパッチル〖チンへ若ばす */	ld		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"		/* タスク毋嘲の弹瓢 */2:	bl		_kernel_calltex		/* スクラッチ牲耽 */1:	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"	bl		1f		.long	_kernel_runtsk		.long	dispatch_r1:		/*		 * TCBにスタックと浩弹瓢戎孟を瘦赂		 */	ld		r0, @r14+		//_kernel_runtsk	ld		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	bl		1f		.long	_kernel_schedtsk		.long	_kernel_runtsk1:		/* スタックモ〖ド磊仑 */	xor		r0, r0	mvtc	r0, psw		/* 肌に弹瓢すべきタスクを玫す */	ld		r1, @r14+	//_kernel_schedtsk1:	ld		r0, @r1	bnez	r0, 1f		/* 弹瓢すべきタスクがないので、充哈み钓材して略怠 */	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		1b1:	/* R0 = schedtsk, R1 = &schedtsk */		/* runtsk = schedtsk; */	ld		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	bl		1f		.long	_kernel_runtsk		.long	ext_tsk1:			/* タスク弹瓢洁洒 */	ld		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へ */	ld		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

⌨️ 快捷键说明

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