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

📄 system.c

📁 samsung 9908DVD源代码,
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************************
 * system.c                                                                         
 * coded by hspark@ce.cnu.ac.kr
 * modified by hjahn@ce.cnu.ac.kr
 * 
 **********************************************************************************/

#include "kernel\\mk_sys.h"
#include "kernel\\mk_task.h"
#include "kernel\\mk_ddi.h"
#include "kernel\\mk_sem.h"
#include "util\\mk_lib.h"
#include "CalmRISC16\\CalmRISC16.h"

#if (MK_DEBUG_PRINT | MK_KERNEL_PRINT)
#include <stdarg.h>
#include <stdio.h>
#endif

extern void UART_SendString( signed char *string );

extern void MK_Puts(const char *s);
extern void MK_InterruptInitialize(void);
//extern void UART_Initialize(void);

extern void MK_MemoryInitialize(void);
extern void MK_TaskInitialize(void);
extern void MK_HISRInitialize(void);
extern void MK_MsgQueueInitialze(void);
extern void MK_SemaphoreInitialize(void);
extern void MK_SystemTimerInitialize(void);
extern void MK_EventInitialize(void);
extern void MK_MsgMailBoxInitialze(void);
extern void MK_MsgPortInitialze(void);
extern void MK_TaskPortInitialize(void);
extern void MK_PipeInitialize(void);
//extern int MK_DDIInitialize(void);
extern int MK_ShellInitalize(void);

void
MK_EndFunction(void)
{
#if MK_DEBUG_PRINT
	MK_InfoPrintf(MK_TASK_WARNING, "End of Task\n");
#endif
	
	for(;;);
}

MK_TASK *
MK_CreateTask(MK_TASK *pTask, MK_TASK_FUNC_T Function, int Priority,
			  char *pTaskName, long TimeSlice, char *pStackArea, LONG StackLength,
			  ULONG Arg1, VOID *Arg2)
{
	int Flags;					/* for Interrupt Disable, Restore */
	char *pStack;				/* for Stack */
	ULONG Temp;					/* for Stack */


	if(pTask->t_Magic == MK_TASK_MAGIC)
	{
#if MK_DEBUG_PRINT
		MK_Panic("MK_CreateTask() - Magic error!\n");
#endif
		return (MK_TASK *)MK_ERROR;	
	}
	
	if(Priority<0 || Priority>MK_TASK_MAX_PRIORITY)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_ERROR, "MK_TaskCreate() - illegal Priority(0x%x)\n", Priority);
#endif
		return (MK_TASK *)MK_ERROR;	
	}

	if(TimeSlice <= 0)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_ERROR, "MK_TaskCreate() - illegal TimeSlice(0x%x)\n", TimeSlice);
#endif
		return (MK_TASK *)MK_ERROR;
	}

	if(StackLength <= 0)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_ERROR, "MK_TaskCreate() - StackLength(0x%x)\n",StackLength);
#endif
		return (MK_TASK *)MK_ERROR;	/* return -1, 0xFFFFFFFFL */
	}

	pTask->t_Priority = Priority;
	pTask->t_Function = Function;
	pTask->t_Arg1 = Arg1;
	pTask->t_Arg2 = Arg2;

	pTask->t_RemainedTimeSlice = TimeSlice;
	pTask->t_TimeSlice = TimeSlice;
	pTask->t_UsedTimeSlice = 0;

	pTask->t_PendingList = 0;
	pTask->t_pendingMemSize = 0;		/* It is used Temporary in Heap */

#ifdef	_MK_TPORT
	pTask->t_PortPending = 0;
	pTask->t_PortValueAvailable = 0;
	pTask->t_PortValue = 0;
#endif	
#ifdef	_MK_SIGNAL
	pTask->t_Signal = 0;
	pTask->t_SigMask = 0;
	pTask->t_pSigFunction = 0;
#endif
#ifdef	_MK_EVENT
	pTask->t_EventRequested = 0;
	pTask->t_EventOperation = 0;
	pTask->t_EventActualEvents = 0;
#endif

	pTask->t_pName = pTaskName;

	pTask->t_TopOfStack = (ULONG)pStackArea;
	pTask->t_LengthofStackArea = StackLength;
	Temp = (ULONG) pStackArea + StackLength;	/* Bottom of Stack */
	Temp &= 0xFFFFFFFCL ;						/* Truncate for Word Align */
	Temp -= 4;									/* Elbow Room */
	pTask->t_BottomOfStack = Temp;
	pStack = (char *)Temp;


/*------------------------------------------------------------------------
    
	(lower address) Stack top -->	SR
									r0		saved r0
									r1		saved r1
									r2		saved r2
									r3		saved r3
									r4		saved r4
									r5		saved r5
									r6		saved r6
									r7		saved r7
									r8		saved r10
									r9		saved r11
									r10		saved r12
									r11		saved r13
									r12		saved r14
									r14		saved lr
					

 *------------------------------------------------------------------------*/

	
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = (ULONG)MK_TaskShell;	/* LR(A14) */	
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A13 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A12 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A11 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A10 */

	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A9 */	
	pStack -= sizeof(ULONG);
    *(ULONG *)pStack = 0;			/* A8 */

	pStack -= sizeof(UINT);
	*(UINT *)pStack = 0;			/* R7 */	
	pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R6 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R5 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R4 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R3 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R2 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R1 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R0 */    
    pStack -= sizeof(UINT);    
    *(UINT *)pStack = 0x0040;			/* SR */
    pStack -= sizeof(UINT);




	pTask->t_CurrentOfStack = (ULONG)pStack;
	
	pTask->t_Magic = MK_TASK_MAGIC;

	Flags = MK_InterruptDisable();		/* Start of Critical Region */
	pTask->t_pTaskNext = MK_NULL;
	pTask->t_pTaskPrev = MK_NULL;
	if(MK_pTaskListHead == MK_NULL)
	{
		MK_pTaskListHead = pTask;
		MK_pTaskListTail = pTask;
	}
	else
	{
		MK_pTaskListTail->t_pTaskNext = pTask;
		pTask->t_pTaskPrev = MK_pTaskListTail;
		MK_pTaskListTail = pTask;
	}

	pTask->t_pTaskReadyNext = MK_NULL;
	pTask->t_pTaskReadyPrev = MK_NULL;
	pTask->t_pDelayedNext = MK_NULL;
	pTask->t_pDelayedPrev = MK_NULL;
	pTask->t_pPendingNext = MK_NULL;
	pTask->t_pPendingPrev = MK_NULL;

	pTask->t_Status = MK_TASK_SUSPEND;		/* SUSPENDED State */
	/* Don't insert Ready List because Task's Status is SUSPEND */
	MK_AddTotalTasks();
	
	MK_InterruptRestore(Flags);	/* End of Critical Region */
	return pTask;
}

VOID
MK_TaskShell(VOID)
{
	MK_TASK *pTask;

	pTask = MK_pCurrentTask;	
	__asm("SETSR  IE");//MK_InterruptEnable();
	(*pTask->t_Function)(pTask->t_Arg1, pTask->t_Arg2);

	MK_DeleteTask(pTask);
}


STATUS
MK_ResetTask(MK_TASK *pTask, ULONG Arg1, VOID *Arg2)
{
	ULONG *pStack;			/* for Stack */
	ULONG Temp;				/* for Stack */
	INT	Flags;
	MK_PENDING_LIST 	*pPendingList;
	MK_SEMAPHORE	*pSem;

	if (pTask == MK_NULL)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_WARNING, "MK_ResetTask() - Task doesn't exist! Task(%s)\n", MK_pCurrentTask->t_pName);
#endif
		return MK_ERROR;
	}
	if(pTask->t_Magic != MK_TASK_MAGIC)
	{
#if MK_DEBUG_PRINT		
		MK_Panic("[%S] line %d : MK_ResetTask() - Magic error!\n", __FILE__, __LINE__);
#endif
		return MK_RESOURCE_ERROR;
	}

	Flags = MK_InterruptDisable();
	
	if(!(pTask->t_Status & MK_TASK_SUSPEND)) //Modified
	{
		if( pTask->t_Status & MK_TASK_READY )
			MK_DeleteTaskFromReadyList( pTask );

		if( pTask->t_Status & MK_TASK_DELAYED )
			MK_DeleteTaskFromDelayedList( pTask );

		if( pTask->t_Status & MK_TASK_PENDING ) {
			pPendingList = (MK_PENDING_LIST *)pTask->t_PendingList;
			pSem = (MK_SEMAPHORE *)pPendingList->p_Sem;
if(pSem->s_Magic == MK_SEMAPHORE_MAGIC) {
			pSem->s_Count++;
}
#if 0
else if(pSem->s_Magic == MK_EVENT_MAGIC) {
	MK_Printf("\nMK_EVENT_PENDING_LIST\n");
}
else if(pSem->s_Magic == MK_HEAP_MAGIC) {
	MK_Printf("\nMK_HEAP_PENDING_LIST\n");
}
else { }
#endif
			MK_DeleteTaskFromPendingList( (MK_PENDING_LIST *)pTask->t_PendingList, pTask );
		}
	}

	pTask->t_Status = MK_TASK_SUSPEND;

	pTask->t_Arg1 = Arg1;
	pTask->t_Arg2 = Arg2;

	pTask->t_RemainedTimeSlice = pTask->t_TimeSlice;
	pTask->t_UsedTimeSlice = 0;

	pTask->t_PendingList = 0;
	pTask->t_pendingMemSize = 0;		/* It is used Temporary in Heap */

#ifdef	_MK_TPORT
	pTask->t_PortPending = 0;
	pTask->t_PortValueAvailable = 0;
	pTask->t_PortValue = 0;
#endif	
#ifdef	_MK_SIGNAL
	pTask->t_Signal = 0;
	pTask->t_SigMask = 0;
	pTask->t_pSigFunction = 0;
#endif
#ifdef	_MK_EVENT
	pTask->t_EventRequested = 0;
	pTask->t_EventOperation = 0;
	pTask->t_EventActualEvents = 0;
#endif

	Temp = pTask->t_TopOfStack + pTask->t_LengthofStackArea;	/* Bottom of Stack */
	Temp &= 0xFFFFFFFC;						/* Truncate for Word Align */
	Temp -= 4;									/* Elbow Room */
	pTask->t_BottomOfStack = Temp;
	pStack = (ULONG *)Temp;

/*------------------------------------------------------------------------
    
	(lower address) Stack top -->	SR
									r0		saved r0
									r1		saved r1
									r2		saved r2
									r3		saved r3
									r4		saved r4
									r5		saved r5
									r6		saved r6
									r7		saved r7
									r8		saved r10
									r9		saved r11
									r10		saved r12
									r11		saved r13
									r12		saved r14
									r14		saved lr
					

 *------------------------------------------------------------------------*/

	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = (ULONG)MK_TaskShell;	/* LR(A14) */	
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A13 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A12 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A11 */
	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A10 */

	pStack -= sizeof(ULONG);
	*(ULONG *)pStack = 0;			/* A9 */	
	pStack -= sizeof(ULONG);
    *(ULONG *)pStack = 0;			/* A8 */
    	
	pStack -= sizeof(UINT);
	*(UINT *)pStack = 0;			/* R7 */	
	pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R6 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R5 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R4 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R3 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R2 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R1 */
    pStack -= sizeof(UINT);
    *(UINT *)pStack = 0;			/* R0 */ 
    pStack -= sizeof(UINT);    
    *(UINT *)pStack = 0x0040;			/* SR, SSR */
    pStack -= sizeof(UINT);

	pTask->t_CurrentOfStack = (ULONG)pStack;

	pTask->t_pTaskReadyNext = MK_NULL;
	pTask->t_pTaskReadyPrev = MK_NULL;
	pTask->t_pDelayedNext = MK_NULL;
	pTask->t_pDelayedPrev = MK_NULL;
	pTask->t_pPendingNext = MK_NULL;

⌨️ 快捷键说明

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