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

📄 cpu_task.h

📁 日本著名的的嵌入式实时操作系统T-Kernel的源码及用户手册。
💻 H
字号:
/* *---------------------------------------------------------------------- *    T-Kernel * *    Copyright (C) 2004 by Ken Sakamura. All rights reserved. *    T-Kernel is distributed under the T-License. *---------------------------------------------------------------------- * *    Version:   1.01.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2004/6/28. * *---------------------------------------------------------------------- *//* *	cpu_task.h (SH7727) *	CPU-Dependant Task Start Processing */#ifndef _CPU_TASK_#define _CPU_TASK_IMPORT TCB	*dsp_ctxtsk;		/* Task including DSP context */IMPORT TCB	*fpu_ctxtsk;		/* Task including FPU context *//* * System stack configuration at task startup */typedef struct {	struct _rng0_3 {		/* RNG 0-3 common */		VW	mach;		VW	macl;		VP	pr;		VP	gbr;		VW	r[15];		/* bank0 R0-R7, R8-R14 */		VW	bank1_r1;		VW	bank1_r0;		VP	spc;		UW	ssr;		UW	mdr;		/* bank1 R2 */	} rng0_3;	struct _rng1_3 {	/* Only RNG 1-3 */		VP	usp;	} rng1_3;} SStackFrame;#define	SizeofSS0	( sizeof(SStackFrame) - sizeof(VP) )	/* RNG 0 */#define	SizeofSS1_3	( sizeof(SStackFrame) )			/* RNG 1-3 *//* * User stack configuration at task startup (only RNG 1-3) */typedef struct {	/* Empty */} UStackFrame;/* * Size of system stack area destroyed by 'make_dormant()' * In other words, the size of area required to write by 'setup_context().' */#define	DORMANT_STACK_SIZE	( sizeof(VW) * 4 )	/* To 'spc' *//* * Size of area kept for special use from system stack */#if USE_SH3_DSP#define	RESERVE_SSTACK(tskatr)	\		( ( ((tskatr) & TA_COP0) != 0 )? sizeof(T_COP0REGS): 0 )#elif TA_FPU#define	RESERVE_SSTACK(tskatr)	\		( ( ((tskatr) & TA_FPU) != 0 )? sizeof(T_COP0REGS): 0 )#else#define	RESERVE_SSTACK(tskatr)	0#endif/* * Initial value for task startup */#if USE_MMU#define	INIT_SR(rng)	( ( (rng) == 3 )? 0: SR_MD )#else#define	INIT_SR(rng)	( SR_MD )#endif#define	INIT_MDR(rng)	( MDR_PPL(rng) | MDR_CPL(rng) )#define	INIT_DSP_DSR	0		/* DSP register initial value */#define	INIT_FPSCR	0x000c0000	/* FPU register initial value *//* * Switch task eigenspace */Inline void change_space( VP uatb, INT lsid ){	*(_UW*)TTB  = (UW)uatb;	*(_UW*)PTEH = (UW)lsid;}/* * Create stack frame for task startup *	Call from 'make_dormant()' */Inline void setup_context( TCB *tcb ){	SStackFrame	*ssp;	T_COP0REGS	*cp0;	/* SH3:DSP */	W		rng;	UW		sr;	rng = (tcb->tskatr & TA_RNG3) >> 8;	cp0 = tcb->isstack;	ssp = tcb->isstack;	(UB*)ssp -= ( rng == 0 )? SizeofSS0: SizeofSS1_3;	sr = INIT_SR(rng);	if ( (tcb->tskatr & TA_COP0) != 0 ) {#if USE_SH3_DSP		/* DSP context initialization */		cp0->dsr = INIT_DSP_DSR;		sr |= SR_DSP;#endif#if TA_FPU		/* FPU context initialization */		cp0->fpscr = INIT_FPSCR;#endif	}	/* CPU context initialization */	ssp->rng0_3.mdr = INIT_MDR(rng);	/* Initial MDR */	ssp->rng0_3.ssr = sr;			/* Initial SR */	ssp->rng0_3.spc = tcb->task;		/* Task startup address */	tcb->tskctxb.ssp = ssp;			/* System stack */	if ( rng > 0 ) {		ssp->rng1_3.usp = tcb->istack;	/* User stack */	}}/* * Set task startup code *	Called by 'tk_sta_tsk()' processing. */Inline void setup_stacd( TCB *tcb, INT stacd ){	SStackFrame	*ssp = tcb->tskctxb.ssp;	ssp->rng0_3.r[4] = stacd;	ssp->rng0_3.r[5] = (VW)tcb->exinf;}/* * Delete task contexts */Inline void cleanup_context( TCB *tcb ){#if USE_SH3_DSP	/* If the current DSP context belongs to 'tcb,'	   Disable the DSP context */	if ( dsp_ctxtsk == tcb ) dsp_ctxtsk = NULL;#endif#if TA_FPU	/* If the current FPU context belongs to 'tcb,'	   Disable the FPU context */	if ( fpu_ctxtsk == tcb ) fpu_ctxtsk = NULL;#endif}#endif /* _CPU_TASK_ */

⌨️ 快捷键说明

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