88 lines
2.3 KiB
C
88 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2021 Nuclei Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "los_arch_context.h"
|
|
#include "los_arch_interrupt.h"
|
|
#include "los_task.h"
|
|
#include "los_memory.h"
|
|
#include "los_timer.h"
|
|
#include "los_sched.h"
|
|
#include "los_interrupt.h"
|
|
#include "los_debug.h"
|
|
#include "nuclei_sdk_soc.h"
|
|
|
|
#define INITIAL_MSTATUS ( MSTATUS_MPP | MSTATUS_MPIE | MSTATUS_FS_INITIAL)
|
|
#define ALIGN_DOWN(size, align) ((size) & ~((align) - 1))
|
|
|
|
LITE_OS_SEC_TEXT_INIT VOID ArchInit(VOID)
|
|
{
|
|
HalHwiInit();
|
|
}
|
|
|
|
LITE_OS_SEC_TEXT_MINOR VOID ArchSysExit(VOID)
|
|
{
|
|
ArchIntLock();
|
|
while (1) {
|
|
}
|
|
}
|
|
|
|
LITE_OS_SEC_TEXT_INIT VOID *ArchTskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack)
|
|
{
|
|
UINT32 index;
|
|
UINT8 *stk = 0;
|
|
TaskContext *context = NULL;
|
|
|
|
stk = ((UINT8 *)topStack) + stackSize + sizeof(STACK_TYPE);
|
|
stk = (UINT8 *)ALIGN_DOWN((uintptr_t)stk, REGBYTES);
|
|
context = (TaskContext *)(stk - sizeof(TaskContext));
|
|
|
|
for (index = 1; index < sizeof(TaskContext)/ sizeof(STACK_TYPE); index ++) {
|
|
((STACK_TYPE *)context)[index] = OS_TASK_STACK_INIT;
|
|
}
|
|
context->ra = (STACK_TYPE)ArchSysExit;
|
|
context->a0 = (STACK_TYPE)taskID;
|
|
context->epc = (STACK_TYPE)OsTaskEntry;
|
|
|
|
context->mstatus = INITIAL_MSTATUS;
|
|
|
|
return (VOID *)context;
|
|
}
|
|
|
|
extern LosTask g_losTask;
|
|
LITE_OS_SEC_TEXT_INIT UINT32 ArchStartSchedule(VOID)
|
|
{
|
|
(VOID)LOS_IntLock();
|
|
OsSchedStart();
|
|
HalStartToRun();
|
|
return LOS_OK; /* never return */
|
|
}
|
|
|
|
VOID ArchTaskSchedule(VOID)
|
|
{
|
|
SysTimer_SetSWIRQ();
|
|
}
|
|
|
|
VOID HalTaskSwitch(VOID)
|
|
{
|
|
SysTimer_ClearSWIRQ();
|
|
OsSchedTaskSwitch();
|
|
/* Set newTask to runTask */
|
|
g_losTask.runTask = g_losTask.newTask;
|
|
}
|
|
|