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

📄 cpu_support.a30

📁 toppers操作系统源码
💻 A30
字号:
;*;*  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;*  Copyright (C) 2003-2005 by Naoki Saito;*             Nagoya Municipal Industrial Research Institute, JAPAN;*  Copyright (C) 2003-2004 by Ryosuke Takeuchi;*              Platform Development Center RICOH COMPANY,LTD. JAPAN;*;*  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation ;*  によって给山されている GNU General Public License の Version 2 に淡;*  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア;*  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布·;*  网脱と钙ぶ∷することを痰浸で钓满するˉ;*  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯;*      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖;*      スコ〖ド面に崔まれていることˉ;*  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗;*      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱;*      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡;*      の痰瘦沮惮年を非很することˉ;*  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗;*      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ;*      とˉ;*    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟;*        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ;*    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに;*        鼠桂することˉ;*  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄;*      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ;*;*  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お;*  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も;*  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木;*  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ;* ;*  @(#) $Id: cpu_support.a30,v 1.5 2005/11/24 12:41:23 honda Exp $;;	プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M16C脱∷;;;  offset.incはmakeoffset.cとm16coffset.exeコマンドにより;  极瓢栏喇されるˉ;	.include	offset.inc	.glb	__kernel_runtsk	.glb	__kernel_schedtsk	.glb	__kernel_reqflg	.glb	__kernel_enadsp	.glb	__kernel_dispatch	.glb	__kernel_exit_and_dispatch	.glb	__kernel_activate_r	.glb	__kernel_call_texrtn	.glb	__kernel_interrupt	.glb	__kernel_intnest	.glb	_iana_tsk	.glb	__kernel_break_wait	.section	program, code, align;;	タスクディスパッチャ;;   dispatch は·タスクコンテキスト觉轮ˇ充哈み敦贿觉轮で钙び叫さなけ;   ればならないˉexit_and_dispatch も·タスクコンテキスト觉轮ˇ充哈;   み敦贿觉轮で钙び叫すのが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·;   充哈みモ〖ドで钙び叫した眷圭にも滦炳しているˉ;	钙び叫し掘凤: IPL=0, FLGレジスタIビット=0 (CPUロック觉轮),;			intnest = 0(タスクコンテキスト), タスクスタック;__kernel_dispatch:	pushm	sb, fb				; スタックへレジスタ瘦赂	mov.w	__kernel_runtsk, a0	stc	isp, TCB_sp[a0]			; スタックポインタをTCBに瘦赂	mov.w	#(dispatch_r>>16), TCB_pc+2[a0]	; 悸乖浩倡戎孟をTCBに瘦赂	mov.w	#(dispatch_r & 0ffffh), TCB_pc[a0]	jmp.b	dispatcher;;	钙び叫し掘凤: IPL=0, FLGレジスタIビット=0 (CPUロック觉轮),;			intnest = 0(タスクコンテキスト), タスクスタック;;	a0 にはruntsk のアドレスが呈羌されている;dispatch_r:	popm	sb,fb						; タスクスタックからレジスタ牲耽	mov.w	TCB_enatex[a0], r0	btst	TCB_enatex_bit, r0			; タスク毋嘲借妄钓材?	jz	dispatch_r_1					; 钓材でなければ dispatch_r_1 へ	mov.w	TCB_texptn[a0], r0				; 瘦伪毋嘲妥傍があるか々	jz	dispatch_r_1					; なければ dispatch_r_1 へ	jmp	__kernel_call_texrtn	; タスク毋嘲ハンドラへdispatch_r_1:				; タスク毋嘲を悸乖しない眷圭	rts				; dispatch 钙び叫し傅へ提る.;;	タスク弹瓢箕借妄;;	ここでは, CPUロック豺近觉轮にし, タスクを弹瓢する.;;	钙叫掘凤: FLGレジスタIビット=0 (CPUロック觉轮), タスクスタック;		IPL=0, タスクコンテキスト(intnest=0);__kernel_activate_r:	pop.w	a0		; タスクの弹瓢戎孟をA1A0に肋年	pop.w	a1	ldc	#0040h, flg	; 充哈み钓材, ISP, IPL=0	jmpi.a	a1a0;;	dispatch钙び叫し掘凤:;		ˇすべてのタスクのコンテキストは瘦赂されている.;		ˇFLGレジスタIビット=0 (CPUロック觉轮);		ˇコンテキストはタスクコンテキスト(intnest=0);		 芒し、exit_and_dispatchについてはモニタ〖弹瓢霹を雇胃;		 した惧淡笆嘲の钙び叫し掘凤の滦炳を乖う;	dispatcher 钙叫箕のスタック:;		__kernel_dispatch からきた眷圭: タスクスタック;		exit_and_dispatch からきた眷圭: ;			exit_task からきた眷圭はタスクスタック;			カ〖ネル弹瓢箕は充哈みスタック;		ret_int からきた眷圭: 充哈みスタック;		dispatcher_2 での充哈み略ちからきた眷圭: 充哈みスタック;__kernel_exit_and_dispatch:	fclr	i			; 充哈み敦贿	mov.b	#0, __kernel_intnest	; ネストカウンタクリアdispatcher:	mov.w	__kernel_schedtsk, a0	; 	mov.w 	a0, __kernel_runtsk	; schedtsk を runtsk に	.IF MON == 1;   タスクモニタ〖怠墙脱尸呆;   稍妥の眷圭は (MON = 0)	jsr.a  _iana_tsk			; タスク悸乖攫鼠の肋年	mov.w	__kernel_runtsk,a0	; a0を牲耽	.ENDIF	jz	dispatcher_1		; schedtsk がなければ充哈み略ち	ldc	TCB_sp[a0], isp		; タスクスタックポインタを牲耽	jmpi.a	TCB_pc[a0] 		; 悸乖浩倡戎孟へジャンプ;;	schdedtskが NULL の眷圭は、これより布には乖かない;dispatcher_1:	ldc	#RAMEND, isp		; 充哈み脱のスタックへ磊仑え	inc.b	__kernel_intnest	; 润タスクコンテキストdispatcher_2:	fset	i		; 充哈み略ち	wait 			; wait炭吾を蝗脱すると	nop			; 久锐排蜗を娃えることができる.	nop			; コメントをつけたまま(nopのみ)にすると	nop			; アイドルル〖プと票じような瓢侯になる.	nop			; ;;	ここで润タスクコンテキスト,充哈みスタックに磊り垂えたのは,;	ここで券栏する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯と,;	充哈みハンドラ柒でのディスパッチ松贿という2つの罢蹋があるˉ;	fclr	i			; 充哈み敦贿	mov.w	__kernel_reqflg, r0	; reqflg が FALSE なら	jz	dispatcher_2		; dispatcher_2 へ	mov.w	#0, __kernel_reqflg	; reqflgがTRUEならFALSEにする	dec.b	__kernel_intnest	; タスクコンテキストに提す	jmp.b	dispatcher		; dispatcher へ提る;;  充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄;;	钙叫し掘凤:;	ˇFLGレジスタのIビット=0, IPL=0, タスクコンテキスト(intnest=0);	ˇ蝗脱スタックはタスクスタック, reqflg = TRUE;ret_int:	mov.w	#0, __kernel_reqflg		; reqflg <--- FALSE	mov.w	__kernel_runtsk, a0		; A0 <--- runtsk	mov.w	__kernel_enadsp, r0		; enadsp が FALSE なら	jz	ret_int_r			; ret_int_r へ	mov.w	__kernel_schedtsk, r0		; schedtskと	cmp.w	a0, r0				; runtsk が票じなら	jeq	ret_int_r			; ret_int_r へ	tst.w	a0, a0				; runtsk = NULL なら	jz	dispatcher			; 瘦赂せずdispatherへ	stc	isp, TCB_sp[a0]			; タスクスタックを瘦赂	mov.w	#(ret_int_r&0ffffh), TCB_pc[a0]	; 悸乖浩倡戎孟を瘦赂	mov.w	#(ret_int_r>>16), TCB_pc+2[a0]	jmp.b	dispatcher__kernel_break_wait:ret_int_r:	mov.w	TCB_enatex[a0],r0	; enatex が FALSE ならリタ〖ン	btst	TCB_enatex_bit,r0	jz	ret_int_r_1	mov.w	TCB_texptn[a0],r0	; texptn が 0 ならばリタ〖ン	jz	ret_int_r_1	jsr.a	__kernel_call_texrtn	; タスク毋嘲借妄ル〖チンの钙叫しret_int_r_1:	popm	r0,r1,r2,r3,a0,a1,sb,fb	; スタックからレジスタを牲耽	reit				; タスクへ提る;;	充哈み/CPU毋嘲の叫掐庚借妄(アセンブリ咐胳淡揭婶尸);;	钙叫し掘凤:;	ˇFLGレジスタのIビット=0, IPLは减烧けた充哈みのIPL.;	ˇスタックは驴脚充り哈みなら充哈みスタック, そうでなければ;	  タスクスタック;	ˇa1とa0 には充哈み/CPU毋嘲ハンドラのアドレスが呈羌されている.;	ˇr1 には(タスクor充哈み)スタックポインタの猛が呈羌されている.;	これはそのままCPU毋嘲ハンドラに畔すVP房の恃眶 p_excinf となる.;;	レジスタがスタック惧にどのように瘦赂されているかを笆布に绩す.;	この哭では惧が你疤, 布が光疤のアドレスで, スタックは布から;	惧数羹に羹かって姥み惧げられるものとする.;;	--------------------------------------;	|              R0(2byte)             | <--- p_excinf;	|                                    |;	--------------------------------------;	|              R1(2byte)             |;	|                                    |;	--------------------------------------;	|              R2(2byte)             |;	|                                    |;	--------------------------------------;	|              R3(2byte)             |;	|                                    |;	--------------------------------------;	|              A0(2byte)             |;	|                                    |;	--------------------------------------;	|              A1(2byte)             |;	|                                    |;	--------------------------------------;	|              SB(2byte)             |;	|                                    |;	--------------------------------------;	|              FB(2byte)             |;	|                                    |;	--------------------------------------;	|           PCの布疤2バイト          |;	|                                    |;	--------------------------------------;	|          FLGの布疤1バイト          |;	--------------------------------------;	|  FLGの惧疤4ビット/PCの惧疤4ビット  |;	--------------------------------------;;	ハンドラからリタ〖ンした稿は, 驴脚充哈みでなく, かつ reqflg が;	TRUE になった箕に·ret_int へ尸呆するˉ;;	驴脚充哈みかどうかは充哈みネストカウンタの猛で冉年する.;	intnest != 0 ならば驴脚充哈みであると冉年する.;;	reqflg はCPUロック觉轮でチェックする. そうでないと·;	reqflg チェック稿に弹瓢された充哈みハンドラ柒で;	ディスパッチが妥滇された眷圭に·ディスパッチされない.;__kernel_interrupt:	cmp.b	#0, __kernel_intnest	; 驴脚充り哈みかどうか	jnz	int_from_int		; 0でなければ驴脚充哈みint_from_task:				; 介檬の充哈み	ldc	#RAMEND, isp		; 充哈み脱のスタックへ磊仑える	push.w	r1		; スタックポインタを充哈みスタックへ瘦赂int_from_int:				; 驴脚充哈み	inc.b	__kernel_intnest	; ネスト搀眶をインクリメント	fset	i			; 充哈み敦贿豺近	jsri.a	a1a0			; Cル〖チン钙び叫し	fclr	i			; 充哈み敦贿	dec.b	__kernel_intnest	; ネスト搀眶をデクリメント	jnz	int_return		; 驴脚充り哈みならリタ〖ンint_from_task2:				; 介檬の充哈み	pop.w	r1			; タスクスタックポインタを提す	ldc	r1, isp	ldipl	#0			; タスクのIPL猛をセット(IPL=0)	mov.w	__kernel_reqflg, r1	; ディスパッチ妥滇がないか?	jz	int_return		; なければ充哈み券栏傅のタスクに提る	jmp.b	ret_int			; あれば ret_int へジャンプint_return:	popm	r0,r1,r2,r3,a0,a1,sb,fb	; レジスタ牲耽	reit				; 充哈み涟の借妄に提る;;  腮警箕粗略ち;SIL_DLY_TIM1	.equ	625	; 呵井箕粗(ル〖プ0搀)[ns]SIL_DLY_TIM2	.equ	250	; ル〖プ1搀あたりの箕粗[ns]	.glb	$sil_dly_nse$sil_dly_nse:	sub.w #SIL_DLY_TIM1, r1	jgtu L0	rtsL0:	sub.w #SIL_DLY_TIM2, r1	jgtu L0	rts	; 踏蝗脱充哈みの借妄	.glb _unused_interrupt_unused_interrupt:	reit	.end

⌨️ 快捷键说明

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