?? system.c
字號(hào):
/**********************************************************************************
* 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;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -