IssueNo:#I3IK07
Description:liteos_m scheduling optimization and low power design. Sig:kernel Feature or Bugfix:Feature Binary Source:No Change-Id: If913b673c9b69039b51ca416be0a77ebccf2773b
This commit is contained in:
parent
c6a520b7f8
commit
f685eeb97d
|
@ -242,25 +242,7 @@ int32_t osKernelRestoreLock(int32_t lock)
|
|||
|
||||
uint32_t osKernelGetTickCount(void)
|
||||
{
|
||||
uint64_t ticks;
|
||||
UINTPTR uvIntSave;
|
||||
|
||||
if (OS_INT_ACTIVE) {
|
||||
#ifndef LITEOS_WIFI_IOT_VERSION
|
||||
ticks = g_ullTickCount;
|
||||
#else
|
||||
ticks = g_tickCount;
|
||||
#endif
|
||||
} else {
|
||||
uvIntSave = LOS_IntLock();
|
||||
#ifndef LITEOS_WIFI_IOT_VERSION
|
||||
ticks = g_ullTickCount;
|
||||
#else
|
||||
ticks = g_tickCount;
|
||||
#endif
|
||||
LOS_IntRestore(uvIntSave);
|
||||
}
|
||||
|
||||
uint64_t ticks = LOS_TickCountGet();
|
||||
return (uint32_t)ticks;
|
||||
}
|
||||
|
||||
|
@ -316,11 +298,7 @@ osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr
|
|||
|
||||
(void)memset_s(&stTskInitParam, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
|
||||
stTskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)func;
|
||||
#ifndef LITEOS_WIFI_IOT_VERSION
|
||||
stTskInitParam.uwArg = (UINT32)argument;
|
||||
#else
|
||||
stTskInitParam.auwArgs[0] = (UINT32)argument;
|
||||
#endif
|
||||
stTskInitParam.uwStackSize = attr->stack_size;
|
||||
stTskInitParam.pcName = (CHAR *)attr->name;
|
||||
stTskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST - ((UINT16)(attr->priority) - LOS_PRIORITY_WIN); /* 0~31 */
|
||||
|
@ -370,11 +348,7 @@ void *osThreadGetArgument(void)
|
|||
if (taskCb == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
#ifndef LITEOS_WIFI_IOT_VERSION
|
||||
return (void *)(taskCb->arg);
|
||||
#else
|
||||
return (void *)(taskCb->args[0]);
|
||||
#endif
|
||||
}
|
||||
|
||||
osThreadState_t osThreadGetState(osThreadId_t thread_id)
|
||||
|
@ -395,7 +369,7 @@ osThreadState_t osThreadGetState(osThreadId_t thread_id)
|
|||
} else if (taskStatus & OS_TASK_STATUS_READY) {
|
||||
stState = osThreadReady;
|
||||
} else if (taskStatus &
|
||||
(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_PEND_QUEUE)) {
|
||||
(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND)) {
|
||||
stState = osThreadBlocked;
|
||||
} else if (taskStatus & OS_TASK_STATUS_UNUSED) {
|
||||
stState = osThreadInactive;
|
||||
|
|
|
@ -41,7 +41,7 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
typedef struct tagTskContext {
|
||||
typedef struct TagTskContext {
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
UINT32 S16;
|
||||
|
|
|
@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
|
|||
#define OS_EXC_EVENT 0x00000001
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* @ingroup los_exc
|
||||
* the struct of register files
|
||||
*
|
||||
* description: the register files that saved when exception triggered
|
||||
*
|
||||
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
|
||||
*/
|
||||
typedef struct tagExcContext {
|
||||
//handler save
|
||||
typedef struct TagExcContext {
|
||||
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||
UINT32 S16;
|
||||
|
@ -486,7 +485,7 @@ typedef struct tagExcContext {
|
|||
UINT32 uwR10;
|
||||
UINT32 uwR11;
|
||||
UINT32 uwPriMask;
|
||||
//auto save
|
||||
/* auto save */
|
||||
UINT32 uwSP;
|
||||
UINT32 uwR0;
|
||||
UINT32 uwR1;
|
||||
|
@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
|
|||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
*@param uwArraySize [IN] Memory size of exception.
|
||||
* @param uwArraySize [IN] Memory size of exception.
|
||||
*
|
||||
* @retval: None
|
||||
* @par Dependency:
|
||||
|
@ -551,155 +550,155 @@ VOID HalHwiInit();
|
|||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图切入ARM状态
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:NMI中断
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:任务处理函数退出
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:致命错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:调试事件导致的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:取向量时发生的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* 异常信息结构体
|
||||
* @ingroup los_exc
|
||||
* Exception information structure
|
||||
*
|
||||
* 描述:M4平台下的异常触发时保存的异常信息
|
||||
* Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
|
||||
*
|
||||
*/
|
||||
typedef struct tagExcInfo {
|
||||
/**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
|
||||
typedef struct TagExcInfo {
|
||||
/**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
|
||||
UINT16 phase;
|
||||
/**< 异常类型,出异常时对照上面列出的1-19号 */
|
||||
/**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
|
||||
UINT16 type;
|
||||
/**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
|
||||
/**< If the exact address access error indicates the wrong access address when the exception occurred */
|
||||
UINT32 faultAddr;
|
||||
/**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
|
||||
/**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
|
||||
UINT32 thrdPid;
|
||||
/**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
|
||||
/**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
|
||||
UINT16 nestCnt;
|
||||
/**< 保留 */
|
||||
/**< reserve */
|
||||
UINT16 reserved;
|
||||
/**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
|
||||
EXC_CONTEXT_S * context;
|
||||
/**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
|
||||
EXC_CONTEXT_S *context;
|
||||
} ExcInfo;
|
||||
|
||||
extern UINT32 g_curNestCount;
|
||||
|
|
|
@ -28,14 +28,18 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "los_config.h"
|
||||
#include "los_task.h"
|
||||
|
||||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "ARMCM3.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "ARMCM3.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
|
@ -56,7 +60,7 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
|
|||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysExit
|
||||
Description : exit function
|
||||
Description : Task exit function
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
|
@ -64,7 +68,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
|
|||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
|
||||
{
|
||||
LOS_IntLock();
|
||||
for(;;);
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
|
@ -151,11 +156,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
@ -165,5 +171,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
|
|
@ -37,9 +37,8 @@
|
|||
EXPORT HalStartToRun
|
||||
EXPORT HalTaskSchedule
|
||||
EXPORT HalPendSV
|
||||
|
||||
IMPORT OsSchedTaskSwitch
|
||||
IMPORT g_losTask
|
||||
IMPORT g_taskScheduled
|
||||
|
||||
OS_NVIC_INT_CTRL EQU 0xE000ED04
|
||||
OS_NVIC_SYSPRI2 EQU 0xE000ED20
|
||||
|
@ -56,26 +55,11 @@ HalStartToRun
|
|||
LDR R5, =OS_NVIC_PENDSV_PRI
|
||||
STR R5, [R4]
|
||||
|
||||
LDR R0, =g_taskScheduled
|
||||
MOV R1, #1
|
||||
STR R1, [R0]
|
||||
|
||||
MOV R0, #2
|
||||
MSR CONTROL, R0
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R2, [R0, #4]
|
||||
LDR R0, =g_losTask
|
||||
STR R2, [R0]
|
||||
|
||||
LDR R3, =g_losTask
|
||||
LDR R0, [R3]
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, =g_losTask
|
||||
LDR R0, [R1, #4]
|
||||
LDR R12, [R0]
|
||||
;ADD R12, R12, #100
|
||||
ADD R12, R12, #36
|
||||
|
@ -120,6 +104,17 @@ HalPendSV
|
|||
CPSID I
|
||||
|
||||
HalTaskSwitch
|
||||
PUSH {R12, LR}
|
||||
BL OsSchedTaskSwitch
|
||||
POP {R12, LR}
|
||||
CMP R0, #0
|
||||
MOV R0, LR
|
||||
BNE TaskContextSwitch
|
||||
MSR PRIMASK, R12
|
||||
BX LR
|
||||
|
||||
TaskContextSwitch
|
||||
MOV LR, R0
|
||||
MRS R0, PSP
|
||||
|
||||
STMFD R0!, {R4-R12}
|
||||
|
@ -129,23 +124,9 @@ HalTaskSwitch
|
|||
LDR R6, [R5]
|
||||
STR R0, [R6]
|
||||
|
||||
|
||||
LDRH R7, [R6 , #4]
|
||||
MOV R8,#OS_TASK_STATUS_RUNNING
|
||||
BIC R7, R7, R8
|
||||
STRH R7, [R6 , #4]
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R0, [R0, #4]
|
||||
LDR R0, [R5, #4]
|
||||
STR R0, [R5]
|
||||
|
||||
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, [R0]
|
||||
;VLDMIA R1!, {D8-D15}
|
||||
LDMFD R1!, {R4-R12}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -107,7 +108,7 @@ VOID OsSetVector(UINT32 num, HWI_PROC_FUNC vector)
|
|||
}
|
||||
#endif
|
||||
|
||||
__weak VOID SysTick_Handler(VOID)
|
||||
WEAK VOID SysTick_Handler(VOID)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -170,11 +171,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
#endif
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
g_intCount++;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
HalPreInterruptHandler(hwiIndex);
|
||||
|
|
|
@ -28,20 +28,22 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_timer.h"
|
||||
#include "los_config.h"
|
||||
#include "ARMCM3.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "ARMCM3.h"
|
||||
#include "los_timer.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalTickStart
|
||||
Description : Configure Tick Interrupt Start
|
||||
|
@ -69,7 +71,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -79,153 +80,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
VOID HalSysTickReload(UINT32 cyclesPerTick)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
}
|
||||
|
||||
WEAK VOID HalDelay(UINT32 ticks)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
WEAK UINT64 HalGetExpandTick(VOID)
|
||||
|
|
|
@ -41,7 +41,7 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
typedef struct tagTskContext {
|
||||
typedef struct TagTskContext {
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
UINT32 S16;
|
||||
|
|
|
@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
|
|||
#define OS_EXC_EVENT 0x00000001
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* @ingroup los_exc
|
||||
* the struct of register files
|
||||
*
|
||||
* description: the register files that saved when exception triggered
|
||||
*
|
||||
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
|
||||
*/
|
||||
typedef struct tagExcContext {
|
||||
//handler save
|
||||
typedef struct TagExcContext {
|
||||
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||
UINT32 S16;
|
||||
|
@ -486,7 +485,7 @@ typedef struct tagExcContext {
|
|||
UINT32 uwR10;
|
||||
UINT32 uwR11;
|
||||
UINT32 uwPriMask;
|
||||
//auto save
|
||||
/* auto save */
|
||||
UINT32 uwSP;
|
||||
UINT32 uwR0;
|
||||
UINT32 uwR1;
|
||||
|
@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
|
|||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
*@param uwArraySize [IN] Memory size of exception.
|
||||
* @param uwArraySize [IN] Memory size of exception.
|
||||
*
|
||||
* @retval: None
|
||||
* @par Dependency:
|
||||
|
@ -551,155 +550,155 @@ VOID HalHwiInit();
|
|||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图切入ARM状态
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:NMI中断
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:任务处理函数退出
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:致命错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:调试事件导致的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:取向量时发生的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* 异常信息结构体
|
||||
* @ingroup los_exc
|
||||
* Exception information structure
|
||||
*
|
||||
* 描述:M4平台下的异常触发时保存的异常信息
|
||||
* Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
|
||||
*
|
||||
*/
|
||||
typedef struct tagExcInfo {
|
||||
/**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
|
||||
typedef struct TagExcInfo {
|
||||
/**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
|
||||
UINT16 phase;
|
||||
/**< 异常类型,出异常时对照上面列出的1-19号 */
|
||||
/**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
|
||||
UINT16 type;
|
||||
/**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
|
||||
/**< If the exact address access error indicates the wrong access address when the exception occurred */
|
||||
UINT32 faultAddr;
|
||||
/**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
|
||||
/**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
|
||||
UINT32 thrdPid;
|
||||
/**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
|
||||
/**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
|
||||
UINT16 nestCnt;
|
||||
/**< 保留 */
|
||||
/**< reserve */
|
||||
UINT16 reserved;
|
||||
/**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
|
||||
EXC_CONTEXT_S * context;
|
||||
/**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
|
||||
EXC_CONTEXT_S *context;
|
||||
} ExcInfo;
|
||||
|
||||
extern UINT32 g_curNestCount;
|
||||
|
@ -716,4 +715,3 @@ extern ExcInfo g_excInfo;
|
|||
#endif /* __cpluscplus */
|
||||
|
||||
#endif /* _LOS_EXC_H */
|
||||
|
||||
|
|
|
@ -28,13 +28,16 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "los_config.h"
|
||||
#include "los_task.h"
|
||||
|
||||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
|
|||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
|
||||
{
|
||||
LOS_IntLock();
|
||||
for(;;);
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
|
@ -149,18 +153,14 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
return (VOID *)context;
|
||||
}
|
||||
|
||||
void HalBackTrace()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
@ -170,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
|
|
@ -56,26 +56,11 @@ HalStartToRun:
|
|||
ldr r5, =OS_NVIC_PENDSV_PRI
|
||||
str r5, [r4]
|
||||
|
||||
ldr r0, =g_taskScheduled
|
||||
mov r1, #1
|
||||
str r1, [r0]
|
||||
|
||||
mov r0, #2
|
||||
msr CONTROL, r0
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r2, [r0, #4]
|
||||
ldr r0, =g_losTask
|
||||
str r2, [r0]
|
||||
|
||||
ldr r3, =g_losTask
|
||||
ldr r0, [r3]
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, =g_losTask
|
||||
ldr r0, [r1, #4]
|
||||
ldr r12, [r0]
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
|
@ -160,7 +145,17 @@ HalPendSV:
|
|||
cpsid I
|
||||
|
||||
HalTaskSwitch:
|
||||
push {r12, lr}
|
||||
blx OsSchedTaskSwitch
|
||||
pop {r12, lr}
|
||||
cmp r0, #0
|
||||
mov r0, lr
|
||||
bne TaskContextSwitch
|
||||
msr PRIMASK, r12
|
||||
bx lr
|
||||
|
||||
TaskContextSwitch:
|
||||
mov lr, r0
|
||||
mrs r0, psp
|
||||
|
||||
stmfd r0!, {r4-r12}
|
||||
|
@ -173,23 +168,9 @@ HalTaskSwitch:
|
|||
ldr r6, [r5]
|
||||
str r0, [r6]
|
||||
|
||||
|
||||
ldrh r7, [r6 , #4]
|
||||
mov r8,#OS_TASK_STATUS_RUNNING
|
||||
bic r7, r7, r8
|
||||
strh r7, [r6 , #4]
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r0, [r0, #4]
|
||||
ldr r0, [r5, #4]
|
||||
str r0, [r5]
|
||||
|
||||
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, [r0]
|
||||
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -159,11 +160,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
#endif
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
g_intCount++;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
HalPreInterruptHandler(hwiIndex);
|
||||
|
|
|
@ -28,19 +28,21 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_timer.h"
|
||||
#include "los_config.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_timer.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalTickStart
|
||||
Description : Configure Tick Interrupt Start
|
||||
|
@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -78,144 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
}
|
||||
|
||||
WEAK VOID HalDelay(UINT32 ticks)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -128,3 +128,4 @@ extern VOID HalStartToRun(VOID);
|
|||
#endif /* __cpluscplus */
|
||||
|
||||
#endif /* _LOS_ARCH_CONTEXT_H */
|
||||
|
||||
|
|
|
@ -551,129 +551,129 @@ VOID HalHwiInit();
|
|||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the bus status register was being pushed.
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the bus status register was out of the stack.
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register imprecise data access violation.
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register exact data access violation.
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register access violation while pointing.
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the memory management status register was being pushed.
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the memory management status register was out of the stack.
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Memory management status register data access violation.
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Memory management status register access violation.
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Usage error, error caused by unaligned access.
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: NMI
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: hard fault
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: The task handler exits.
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: A fatal error.
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Hard Fault caused by a debug event.
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: A hard fault that occurs when a quantity is oriented.
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
|
|
|
@ -32,10 +32,12 @@
|
|||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_task.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -153,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
|
|
@ -54,26 +54,11 @@ HalStartToRun:
|
|||
ldr r5, =OS_NVIC_PENDSV_PRI
|
||||
str r5, [r4]
|
||||
|
||||
ldr r0, =g_taskScheduled
|
||||
mov r1, #1
|
||||
str r1, [r0]
|
||||
|
||||
mov r0, #2
|
||||
msr CONTROL, r0
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r2, [r0, #4]
|
||||
ldr r0, =g_losTask
|
||||
str r2, [r0]
|
||||
|
||||
ldr r3, =g_losTask
|
||||
ldr r0, [r3]
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, =g_losTask
|
||||
ldr r0, [r1, #4]
|
||||
ldr r12, [r0]
|
||||
|
||||
ldr.w r1, =OS_FPU_CPACR
|
||||
|
@ -100,6 +85,7 @@ __DisabledFPU:
|
|||
mov lr, r5
|
||||
cpsie I
|
||||
bx r6
|
||||
|
||||
.fnend
|
||||
|
||||
|
||||
|
@ -162,6 +148,17 @@ HalPendSV:
|
|||
cpsid I
|
||||
|
||||
HalTaskSwitch:
|
||||
push {r12, lr}
|
||||
blx OsSchedTaskSwitch
|
||||
pop {r12, lr}
|
||||
cmp r0, #0
|
||||
mov r0, lr
|
||||
bne TaskContextSwitch
|
||||
msr PRIMASK, r12
|
||||
bx lr
|
||||
|
||||
TaskContextSwitch:
|
||||
mov lr, r0
|
||||
mrs r0, psp
|
||||
|
||||
stmfd r0!, {r4-r12}
|
||||
|
@ -177,23 +174,9 @@ __DisabledFPU1:
|
|||
ldr r6, [r5]
|
||||
str r0, [r6]
|
||||
|
||||
|
||||
ldrh r7, [r6 , #4]
|
||||
mov r8,#OS_TASK_STATUS_RUNNING
|
||||
bic r7, r7, r8
|
||||
strh r7, [r6 , #4]
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r0, [r0, #4]
|
||||
ldr r0, [r5, #4]
|
||||
str r0, [r5]
|
||||
|
||||
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, [r0]
|
||||
and r3, r3, #OS_FPU_CPACR_ENABLE
|
||||
cmp r3, #OS_FPU_CPACR_ENABLE
|
||||
|
@ -205,5 +188,6 @@ __DisabledFPU2:
|
|||
msr psp, r1
|
||||
|
||||
msr PRIMASK, r12
|
||||
|
||||
bx lr
|
||||
.fnend
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -169,11 +170,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
#endif
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
g_intCount++;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
HalPreInterruptHandler(hwiIndex);
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -78,145 +79,56 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
VOID HalSysTickReload(UINT32 cyclesPerTick)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
|
|
@ -551,129 +551,129 @@ VOID HalHwiInit();
|
|||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the bus status register was being pushed.
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the bus status register was out of the stack.
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register imprecise data access violation.
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register exact data access violation.
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Bus status register access violation while pointing.
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the memory management status register was being pushed.
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: An error occurred while the memory management status register was out of the stack.
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Memory management status register data access violation.
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Memory management status register access violation.
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Usage error, error caused by unaligned access.
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: NMI
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: hard fault
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: The task handler exits.
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: A fatal error.
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: Hard Fault caused by a debug event.
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
* @ingroup los_exc
|
||||
* Cortex-M4 exception types: A hard fault that occurs when a quantity is oriented.
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
|
@ -715,4 +715,3 @@ extern ExcInfo g_excInfo;
|
|||
#endif /* __cpluscplus */
|
||||
|
||||
#endif /* _LOS_EXC_H */
|
||||
|
||||
|
|
|
@ -32,10 +32,12 @@
|
|||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_task.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -153,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
|
|
@ -29,17 +29,16 @@
|
|||
; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
;
|
||||
|
||||
PRESERVE8
|
||||
PRESERVE8
|
||||
|
||||
EXPORT HalIntLock
|
||||
EXPORT HalIntUnLock
|
||||
EXPORT HalIntRestore
|
||||
EXPORT HalStartToRun
|
||||
EXPORT HalTaskSchedule
|
||||
EXPORT HalPendSV
|
||||
|
||||
IMPORT g_losTask
|
||||
IMPORT g_taskScheduled
|
||||
EXPORT HalIntLock
|
||||
EXPORT HalIntUnLock
|
||||
EXPORT HalIntRestore
|
||||
EXPORT HalStartToRun
|
||||
EXPORT HalTaskSchedule
|
||||
EXPORT HalPendSV
|
||||
IMPORT OsSchedTaskSwitch
|
||||
IMPORT g_losTask
|
||||
|
||||
OS_FPU_CPACR EQU 0xE000ED88
|
||||
OS_FPU_CPACR_ENABLE EQU 0x00F00000
|
||||
|
@ -58,26 +57,11 @@ HalStartToRun
|
|||
LDR R5, =OS_NVIC_PENDSV_PRI
|
||||
STR R5, [R4]
|
||||
|
||||
LDR R0, =g_taskScheduled
|
||||
MOV R1, #1
|
||||
STR R1, [R0]
|
||||
|
||||
MOV R0, #2
|
||||
MSR CONTROL, R0
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R2, [R0, #4]
|
||||
LDR R0, =g_losTask
|
||||
STR R2, [R0]
|
||||
|
||||
LDR R3, =g_losTask
|
||||
LDR R0, [R3]
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, =g_losTask
|
||||
LDR R0, [R1, #4]
|
||||
LDR R12, [R0]
|
||||
|
||||
LDR.W R1, =OS_FPU_CPACR
|
||||
|
@ -133,6 +117,17 @@ HalPendSV
|
|||
CPSID I
|
||||
|
||||
HalTaskSwitch
|
||||
PUSH {R12, LR}
|
||||
BLX OsSchedTaskSwitch
|
||||
POP {R12, LR}
|
||||
CMP R0, #0
|
||||
MOV R0, LR
|
||||
BNE TaskContextSwitch
|
||||
MSR PRIMASK, R12
|
||||
BX LR
|
||||
|
||||
TaskContextSwitch
|
||||
MOV LR, R0
|
||||
MRS R0, PSP
|
||||
|
||||
STMFD R0!, {R4-R12}
|
||||
|
@ -148,24 +143,10 @@ __DisabledFPU1
|
|||
LDR R6, [R5]
|
||||
STR R0, [R6]
|
||||
|
||||
|
||||
LDRH R7, [R6 , #4]
|
||||
MOV R8,#OS_TASK_STATUS_RUNNING
|
||||
BIC R7, R7, R8
|
||||
STRH R7, [R6 , #4]
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R0, [R0, #4]
|
||||
LDR R0, [R5, #4]
|
||||
STR R0, [R5]
|
||||
|
||||
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, [R0]
|
||||
LDR R1, [R0]
|
||||
AND R3, R3, #OS_FPU_CPACR_ENABLE
|
||||
CMP R3, #OS_FPU_CPACR_ENABLE
|
||||
BNE __DisabledFPU2
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "los_debug.h"
|
||||
#include "los_hook.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -176,6 +177,10 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -78,145 +79,56 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
VOID HalSysTickReload(UINT32 cyclesPerTick)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
|
|
@ -41,7 +41,7 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
typedef struct tagTskContext {
|
||||
typedef struct TagTskContext {
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
UINT32 S16;
|
||||
|
|
|
@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
|
|||
#define OS_EXC_EVENT 0x00000001
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* @ingroup los_exc
|
||||
* the struct of register files
|
||||
*
|
||||
* description: the register files that saved when exception triggered
|
||||
*
|
||||
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
|
||||
*/
|
||||
typedef struct tagExcContext {
|
||||
//handler save
|
||||
typedef struct TagExcContext {
|
||||
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||
UINT32 S16;
|
||||
|
@ -486,7 +485,7 @@ typedef struct tagExcContext {
|
|||
UINT32 uwR10;
|
||||
UINT32 uwR11;
|
||||
UINT32 uwPriMask;
|
||||
//auto save
|
||||
/* auto save */
|
||||
UINT32 uwSP;
|
||||
UINT32 uwR0;
|
||||
UINT32 uwR1;
|
||||
|
@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
|
|||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
*@param uwArraySize [IN] Memory size of exception.
|
||||
* @param uwArraySize [IN] Memory size of exception.
|
||||
*
|
||||
* @retval: None
|
||||
* @par Dependency:
|
||||
|
@ -551,155 +550,155 @@ VOID HalHwiInit();
|
|||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图切入ARM状态
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:NMI中断
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:任务处理函数退出
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:致命错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:调试事件导致的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:取向量时发生的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* 异常信息结构体
|
||||
* @ingroup los_exc
|
||||
* Exception information structure
|
||||
*
|
||||
* 描述:M4平台下的异常触发时保存的异常信息
|
||||
* Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
|
||||
*
|
||||
*/
|
||||
typedef struct tagExcInfo {
|
||||
/**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
|
||||
typedef struct TagExcInfo {
|
||||
/**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
|
||||
UINT16 phase;
|
||||
/**< 异常类型,出异常时对照上面列出的1-19号 */
|
||||
/**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
|
||||
UINT16 type;
|
||||
/**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
|
||||
/**< If the exact address access error indicates the wrong access address when the exception occurred */
|
||||
UINT32 faultAddr;
|
||||
/**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
|
||||
/**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
|
||||
UINT32 thrdPid;
|
||||
/**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
|
||||
/**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
|
||||
UINT16 nestCnt;
|
||||
/**< 保留 */
|
||||
/**< reserve */
|
||||
UINT16 reserved;
|
||||
/**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
|
||||
EXC_CONTEXT_S * context;
|
||||
/**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
|
||||
EXC_CONTEXT_S *context;
|
||||
} ExcInfo;
|
||||
|
||||
extern UINT32 g_curNestCount;
|
||||
|
|
|
@ -28,13 +28,16 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "los_config.h"
|
||||
#include "los_task.h"
|
||||
|
||||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
|
|||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
|
||||
{
|
||||
LOS_IntLock();
|
||||
for(;;);
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
|
@ -151,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
@ -165,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
|
|
@ -56,26 +56,11 @@ HalStartToRun:
|
|||
ldr r5, =OS_NVIC_PENDSV_PRI
|
||||
str r5, [r4]
|
||||
|
||||
ldr r0, =g_taskScheduled
|
||||
mov r1, #1
|
||||
str r1, [r0]
|
||||
|
||||
mov r0, #2
|
||||
msr CONTROL, r0
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r2, [r0, #4]
|
||||
ldr r0, =g_losTask
|
||||
str r2, [r0]
|
||||
|
||||
ldr r3, =g_losTask
|
||||
ldr r0, [r3]
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, =g_losTask
|
||||
ldr r0, [r1, #4]
|
||||
ldr r12, [r0]
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
|
@ -147,9 +132,6 @@ HalTaskSchedule:
|
|||
bx lr
|
||||
.fnend
|
||||
|
||||
|
||||
|
||||
|
||||
.type HalPendSV, %function
|
||||
.global HalPendSV
|
||||
HalPendSV:
|
||||
|
@ -160,7 +142,17 @@ HalPendSV:
|
|||
cpsid I
|
||||
|
||||
HalTaskSwitch:
|
||||
push {r12, lr}
|
||||
blx OsSchedTaskSwitch
|
||||
pop {r12, lr}
|
||||
cmp r0, #0
|
||||
mov r0, lr
|
||||
bne TaskContextSwitch
|
||||
msr PRIMASK, r12
|
||||
bx lr
|
||||
|
||||
TaskContextSwitch:
|
||||
mov lr, r0
|
||||
mrs r0, psp
|
||||
|
||||
stmfd r0!, {r4-r12}
|
||||
|
@ -173,24 +165,10 @@ HalTaskSwitch:
|
|||
ldr r6, [r5]
|
||||
str r0, [r6]
|
||||
|
||||
|
||||
ldrh r7, [r6 , #4]
|
||||
mov r8,#OS_TASK_STATUS_RUNNING
|
||||
bic r7, r7, r8
|
||||
strh r7, [r6 , #4]
|
||||
|
||||
|
||||
ldr r0, =g_losTask
|
||||
ldr r0, [r0, #4]
|
||||
ldr r0, [r5, #4]
|
||||
str r0, [r5]
|
||||
|
||||
|
||||
ldrh r7, [r0 , #4]
|
||||
mov r8, #OS_TASK_STATUS_RUNNING
|
||||
orr r7, r7, r8
|
||||
strh r7, [r0 , #4]
|
||||
|
||||
ldr r1, [r0]
|
||||
ldr r1, [r0]
|
||||
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
|
@ -201,6 +179,5 @@ HalTaskSwitch:
|
|||
|
||||
msr PRIMASK, r12
|
||||
|
||||
|
||||
bx lr
|
||||
.fnend
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -159,11 +160,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
#endif
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
g_intCount++;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
HalPreInterruptHandler(hwiIndex);
|
||||
|
|
|
@ -28,19 +28,21 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_timer.h"
|
||||
#include "los_config.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_timer.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalTickStart
|
||||
Description : Configure Tick Interrupt Start
|
||||
|
@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -78,153 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
VOID HalSysTickReload(UINT32 cyclesPerTick)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
}
|
||||
|
||||
WEAK VOID HalDelay(UINT32 ticks)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
WEAK UINT64 HalGetExpandTick(VOID)
|
||||
|
|
|
@ -41,7 +41,7 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
typedef struct tagTskContext {
|
||||
typedef struct TagTskContext {
|
||||
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined(__FPU_USED) && (__FPU_USED == 1U)))
|
||||
UINT32 S16;
|
||||
|
|
|
@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
|
|||
#define OS_EXC_EVENT 0x00000001
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* @ingroup los_exc
|
||||
* the struct of register files
|
||||
*
|
||||
* description: the register files that saved when exception triggered
|
||||
*
|
||||
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
|
||||
*/
|
||||
typedef struct tagExcContext {
|
||||
//handler save
|
||||
typedef struct TagExcContext {
|
||||
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||
UINT32 S16;
|
||||
|
@ -486,7 +485,7 @@ typedef struct tagExcContext {
|
|||
UINT32 uwR10;
|
||||
UINT32 uwR11;
|
||||
UINT32 uwPriMask;
|
||||
//auto save
|
||||
/* auto save */
|
||||
UINT32 uwSP;
|
||||
UINT32 uwR0;
|
||||
UINT32 uwR1;
|
||||
|
@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
|
|||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
*@param uwArraySize [IN] Memory size of exception.
|
||||
* @param uwArraySize [IN] Memory size of exception.
|
||||
*
|
||||
* @retval: None
|
||||
* @par Dependency:
|
||||
|
@ -551,155 +550,155 @@ VOID HalHwiInit();
|
|||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_BF_STKERR 1
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the bus status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_BF_UNSTKERR 2
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register imprecise data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_IMPRECISERR 3
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register exact data access violation.
|
||||
*/
|
||||
#define OS_EXC_BF_PRECISERR 4
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Bus status register access violation while pointing.
|
||||
*/
|
||||
#define OS_EXC_BF_IBUSERR 5
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was being pushed.
|
||||
*/
|
||||
#define OS_EXC_MF_MSTKERR 6
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
|
||||
*/
|
||||
#define OS_EXC_MF_MUNSTKERR 7
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register data access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_DACCVIOL 8
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Memory management status register access violation.
|
||||
*/
|
||||
#define OS_EXC_MF_IACCVIOL 9
|
||||
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
|
||||
*/
|
||||
#define OS_EXC_UF_DIVBYZERO 10
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error, error caused by unaligned access.
|
||||
*/
|
||||
#define OS_EXC_UF_UNALIGNED 11
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
|
||||
*/
|
||||
#define OS_EXC_UF_NOCP 12
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
|
||||
*/
|
||||
#define OS_EXC_UF_INVPC 13
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,试图切入ARM状态
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
|
||||
*/
|
||||
#define OS_EXC_UF_INVSTATE 14
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
|
||||
*/
|
||||
#define OS_EXC_UF_UNDEFINSTR 15
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:NMI中断
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: NMI
|
||||
*/
|
||||
|
||||
#define OS_EXC_CAUSE_NMI 16
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: hard fault
|
||||
*/
|
||||
#define OS_EXC_CAUSE_HARDFAULT 17
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:任务处理函数退出
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: The task handler exits.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_TASK_EXIT 18
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:致命错误
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A fatal error.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_FATAL_ERR 19
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:调试事件导致的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: Hard Fault caused by a debug event.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_DEBUGEVT 20
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
*Cortex-M3异常具体类型:取向量时发生的硬fault
|
||||
* @ingroup los_exc
|
||||
* Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
|
||||
*/
|
||||
#define OS_EXC_CAUSE_VECTBL 21
|
||||
|
||||
/**
|
||||
*@ingroup los_exc
|
||||
* 异常信息结构体
|
||||
* @ingroup los_exc
|
||||
* Exception information structure
|
||||
*
|
||||
* 描述:M4平台下的异常触发时保存的异常信息
|
||||
* Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
|
||||
*
|
||||
*/
|
||||
typedef struct tagExcInfo {
|
||||
/**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
|
||||
typedef struct TagExcInfo {
|
||||
/**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
|
||||
UINT16 phase;
|
||||
/**< 异常类型,出异常时对照上面列出的1-19号 */
|
||||
/**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
|
||||
UINT16 type;
|
||||
/**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
|
||||
/**< If the exact address access error indicates the wrong access address when the exception occurred */
|
||||
UINT32 faultAddr;
|
||||
/**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
|
||||
/**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
|
||||
UINT32 thrdPid;
|
||||
/**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
|
||||
/**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
|
||||
UINT16 nestCnt;
|
||||
/**< 保留 */
|
||||
/**< reserve */
|
||||
UINT16 reserved;
|
||||
/**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
|
||||
EXC_CONTEXT_S * context;
|
||||
/**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
|
||||
EXC_CONTEXT_S *context;
|
||||
} ExcInfo;
|
||||
|
||||
extern UINT32 g_curNestCount;
|
||||
|
@ -716,4 +715,3 @@ extern ExcInfo g_excInfo;
|
|||
#endif /* __cpluscplus */
|
||||
|
||||
#endif /* _LOS_EXC_H */
|
||||
|
||||
|
|
|
@ -28,13 +28,16 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "los_config.h"
|
||||
#include "los_task.h"
|
||||
|
||||
#include "los_context.h"
|
||||
#include "securec.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
|
|||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
|
||||
{
|
||||
LOS_IntLock();
|
||||
for(;;);
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
|
@ -151,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
@ -165,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
|
|
@ -29,17 +29,16 @@
|
|||
; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
;
|
||||
|
||||
PRESERVE8
|
||||
PRESERVE8
|
||||
|
||||
EXPORT HalIntLock
|
||||
EXPORT HalIntUnLock
|
||||
EXPORT HalIntRestore
|
||||
EXPORT HalStartToRun
|
||||
EXPORT HalTaskSchedule
|
||||
EXPORT HalPendSV
|
||||
|
||||
IMPORT g_losTask
|
||||
IMPORT g_taskScheduled
|
||||
EXPORT HalIntLock
|
||||
EXPORT HalIntUnLock
|
||||
EXPORT HalIntRestore
|
||||
EXPORT HalStartToRun
|
||||
EXPORT HalTaskSchedule
|
||||
EXPORT HalPendSV
|
||||
IMPORT OsSchedTaskSwitch
|
||||
IMPORT g_losTask
|
||||
|
||||
OS_FPU_CPACR EQU 0xE000ED88
|
||||
OS_FPU_CPACR_ENABLE EQU 0x00F00000
|
||||
|
@ -58,26 +57,11 @@ HalStartToRun
|
|||
LDR R5, =OS_NVIC_PENDSV_PRI
|
||||
STR R5, [R4]
|
||||
|
||||
LDR R0, =g_taskScheduled
|
||||
MOV R1, #1
|
||||
STR R1, [R0]
|
||||
|
||||
MOV R0, #2
|
||||
MSR CONTROL, R0
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R2, [R0, #4]
|
||||
LDR R0, =g_losTask
|
||||
STR R2, [R0]
|
||||
|
||||
LDR R3, =g_losTask
|
||||
LDR R0, [R3]
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, =g_losTask
|
||||
LDR R0, [R1, #4]
|
||||
LDR R12, [R0]
|
||||
|
||||
LDR.W R1, =OS_FPU_CPACR
|
||||
|
@ -133,6 +117,17 @@ HalPendSV
|
|||
CPSID I
|
||||
|
||||
HalTaskSwitch
|
||||
PUSH {R12, LR}
|
||||
BLX OsSchedTaskSwitch
|
||||
POP {R12, LR}
|
||||
CMP R0, #0
|
||||
MOV R0, LR
|
||||
BNE TaskContextSwitch
|
||||
MSR PRIMASK, R12
|
||||
BX LR
|
||||
|
||||
TaskContextSwitch
|
||||
MOV LR, R0
|
||||
MRS R0, PSP
|
||||
|
||||
STMFD R0!, {R4-R12}
|
||||
|
@ -148,24 +143,10 @@ __DisabledFPU1
|
|||
LDR R6, [R5]
|
||||
STR R0, [R6]
|
||||
|
||||
|
||||
LDRH R7, [R6 , #4]
|
||||
MOV R8,#OS_TASK_STATUS_RUNNING
|
||||
BIC R7, R7, R8
|
||||
STRH R7, [R6 , #4]
|
||||
|
||||
|
||||
LDR R0, =g_losTask
|
||||
LDR R0, [R0, #4]
|
||||
LDR R0, [R5, #4]
|
||||
STR R0, [R5]
|
||||
|
||||
|
||||
LDRH R7, [R0 , #4]
|
||||
MOV R8, #OS_TASK_STATUS_RUNNING
|
||||
ORR R7, R7, R8
|
||||
STRH R7, [R0 , #4]
|
||||
|
||||
LDR R1, [R0]
|
||||
LDR R1, [R0]
|
||||
AND R3, R3, #OS_FPU_CPACR_ENABLE
|
||||
CMP R3, #OS_FPU_CPACR_ENABLE
|
||||
BNE __DisabledFPU2
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "los_debug.h"
|
||||
#include "los_hook.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
@ -172,6 +173,10 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
|||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
|
|
@ -28,19 +28,21 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_timer.h"
|
||||
#include "los_config.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_timer.h"
|
||||
#include "los_context.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalTickStart
|
||||
Description : Configure Tick Interrupt Start
|
||||
|
@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
|
||||
g_sysClock = OS_SYS_CLOCK;
|
||||
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
|
||||
g_ullTickCount = 0;
|
||||
|
||||
ret = SysTick_Config(g_cyclesPerTick);
|
||||
if (ret == 1) {
|
||||
|
@ -78,153 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
|
|||
return LOS_OK;
|
||||
}
|
||||
|
||||
VOID HalSysTickReload(UINT32 cyclesPerTick)
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
|
||||
SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
|
||||
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||
NVIC_ClearPendingIRQ(SysTick_IRQn);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalSysTickCurrCycleGet
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : none
|
||||
return : hwCycle --- the system cycle count
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
hwCycle += g_cyclesPerTick;
|
||||
}
|
||||
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
*period = SysTick->LOAD;
|
||||
hwCycle = *period - SysTick->VAL;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return hwCycle;
|
||||
return (UINT64)hwCycle;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
hwCycle = SysTick->VAL;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = SysTick->VAL;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
|
||||
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : HalGetSystickCycle
|
||||
Description : Get Sys tick cycle count
|
||||
Input : none
|
||||
output : cntHi --- SysTick count High 4 byte
|
||||
cntLo --- SysTick count Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 swTick;
|
||||
UINT64 cycle;
|
||||
UINT32 hwCycle;
|
||||
UINTPTR intSave;
|
||||
UINT32 systickLoad;
|
||||
UINT32 systickCur;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
swTick = g_ullTickCount;
|
||||
|
||||
systickLoad = SysTick->LOAD;
|
||||
systickCur = SysTick->VAL;
|
||||
if (systickLoad < systickCur) {
|
||||
LOS_IntRestore(intSave);
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
hwCycle = systickLoad - systickCur;
|
||||
|
||||
/* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
|
||||
if ((SCB->ICSR & TICK_CHECK) != 0) {
|
||||
hwCycle = systickLoad - systickCur;
|
||||
swTick++;
|
||||
}
|
||||
|
||||
cycle = hwCycle + swTick * systickLoad;
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static BOOL g_sysSleepFlag = FALSE;
|
||||
|
||||
VOID HalTickLock(VOID)
|
||||
WEAK VOID HalTickLock(VOID)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalTickUnlock(VOID)
|
||||
WEAK VOID HalTickUnlock(VOID)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID)
|
||||
{
|
||||
return g_sysSleepFlag;
|
||||
}
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID)
|
||||
{
|
||||
g_sysSleepFlag = FALSE;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
}
|
||||
|
||||
WEAK VOID HalDelay(UINT32 ticks)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
WEAK UINT64 HalGetExpandTick(VOID)
|
||||
|
|
|
@ -81,25 +81,25 @@ INT32 HalSetRtcTimeZone(INT32 timeZone);
|
|||
|
||||
/**
|
||||
* @ingroup los_timer
|
||||
* @brief Configure Tick Interrupt Start.
|
||||
* @brief Get systick cycle.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to configure Tick Interrupt Start while macro LOSCFG_BASE_CORE_TICK_HW_TIME is No.
|
||||
* This API is used to get systick cycle and return current tick period.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param: None.
|
||||
* @param: period [OUT] current tick period.
|
||||
*
|
||||
* @retval #LOS_OK 0:configure Tick Interrupt success.
|
||||
* @retval #LOS_ERRNO_TICK_CFG_INVALID 0x02000400:configure Tick Interrupt failed.
|
||||
* @retval current tick count.
|
||||
*
|
||||
* @par Dependency:
|
||||
* <ul><li>los_config.h: the header file that contains the API declaration.</li></ul>
|
||||
* <ul><li>los_timer.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
UINT64 HalGetTickCycle(UINT32 *period);
|
||||
|
||||
/**
|
||||
* @ingroup los_hwi
|
||||
|
@ -114,37 +114,14 @@ INT32 HalSetRtcTimeZone(INT32 timeZone);
|
|||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param cyclesPerTick [IN] Cycles Per Tick
|
||||
* @param nextResponseTime [IN] tick period
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see None
|
||||
*/
|
||||
extern VOID HalSysTickReload(UINT32 cyclesPerTick);
|
||||
|
||||
/**
|
||||
* @ingroup los_hwi
|
||||
* @brief Get System cycle count.
|
||||
*
|
||||
* @par Description:
|
||||
* <ul>
|
||||
* <li>This API is used to Get System cycle count.</li>
|
||||
* </ul>
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval: The value of the system cycle count.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_IntRestore
|
||||
*/
|
||||
extern UINT32 HalSysTickCurrCycleGet(VOID);
|
||||
|
||||
extern VOID HalSysTickReload(UINT64 nextResponseTime);
|
||||
|
||||
/* *
|
||||
* @ingroup los_hwi
|
||||
|
@ -169,53 +146,10 @@ extern UINT32 HalSysTickCurrCycleGet(VOID);
|
|||
*/
|
||||
extern VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo);
|
||||
|
||||
|
||||
|
||||
extern VOID HalGetSystickCycle(UINT32 *puwCntHi, UINT32 *puwCntLo);
|
||||
|
||||
/**
|
||||
* @ingroup los_tickless
|
||||
* @brief enable the tickless mode.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to enable the tickless mode. System can change from periodic clock mode to dynamic clock mode.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_tickless.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_TicklessDisable
|
||||
*/
|
||||
extern VOID HalTicklessEnable(VOID);
|
||||
/**
|
||||
* @ingroup los_tickless
|
||||
* @brief disable the tickless mode.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to diable the tickless mode. System will not change from periodic clock mode to dynamic clock mode.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_tickless.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_TicklessEnable
|
||||
*/
|
||||
extern VOID HalTicklessDisable(VOID);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -131,6 +131,8 @@ STATIC INLINE UINTPTR GetFp(VOID)
|
|||
|
||||
extern VOID HalStartToRun(VOID);
|
||||
|
||||
extern VOID HalTaskContextSwitch(UINTPTR intSave);
|
||||
|
||||
/**
|
||||
* @ingroup los_hw
|
||||
* @brief Wait for interrupt.
|
||||
|
|
|
@ -42,6 +42,9 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
#define MTIMER_HI_OFFSET 4
|
||||
#define OS_COMBINED_64(hi, ho) (((UINT64)(hi) << 32) | (ho))
|
||||
|
||||
UINT32 HalTickStart(OS_TICK_HANDLER handler);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_timer.h"
|
||||
#include "soc.h"
|
||||
|
@ -43,11 +44,41 @@ extern "C" {
|
|||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
STATIC UINT32 g_sysNeedSched = FALSE;
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT VOID HalArchInit(VOID)
|
||||
{
|
||||
HalHwiInit();
|
||||
}
|
||||
|
||||
VOID HalIrqEndCheckNeedSched(VOID)
|
||||
{
|
||||
if (g_sysNeedSched) {
|
||||
LOS_Schedule();
|
||||
}
|
||||
}
|
||||
|
||||
VOID HalTaskSchedule(VOID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
|
||||
if (OS_INT_ACTIVE) {
|
||||
g_sysNeedSched = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
g_sysNeedSched = FALSE;
|
||||
BOOL isSwitch = OsSchedTaskSwitch();
|
||||
if (isSwitch) {
|
||||
HalTaskContextSwitch(intSave);
|
||||
return;
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
return;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
|
||||
{
|
||||
HalIntLock();
|
||||
|
@ -105,23 +136,17 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
|
|||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
|
||||
{
|
||||
UINT32 ret;
|
||||
ret = HalTickStart(handler);
|
||||
(VOID)LOS_IntLock();
|
||||
UINT32 ret = HalTickStart(handler);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
OsSchedStart();
|
||||
HalStartToRun();
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT VOID HalTaskScheduleCheck(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
|
||||
OsTaskSwitchCheck();
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT VOID wfi(VOID)
|
||||
{
|
||||
__asm__ __volatile__("wfi");
|
||||
|
@ -137,11 +162,6 @@ LITE_OS_SEC_TEXT VOID dsb(VOID)
|
|||
__asm__ __volatile__("fence":::"memory");
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
wfi();
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
|
|
@ -37,56 +37,19 @@
|
|||
.global HalIntUnLock
|
||||
.global HalIntRestore
|
||||
.global HalStartToRun
|
||||
.global HalTaskSchedule
|
||||
.global HalTaskSwitch
|
||||
.global HalTaskContextSwitch
|
||||
.extern __irq_stack_top
|
||||
.extern HalTaskScheduleCheck
|
||||
.extern printk
|
||||
.equ OS_TASK_STATUS_RUNNING, 0x0010
|
||||
.equ OS_TASK_STATUS_NOT_RUNNING, 0xFFEF
|
||||
.section .interrupt.text
|
||||
|
||||
.macro PUSH_CALLER_REG
|
||||
addi sp, sp, -(32 * REGBYTES)
|
||||
SREG t6, 2 * REGBYTES(sp)
|
||||
SREG t5, 3 * REGBYTES(sp)
|
||||
SREG t4, 4 * REGBYTES(sp)
|
||||
SREG t3, 5 * REGBYTES(sp)
|
||||
SREG t2, 6 * REGBYTES(sp)
|
||||
SREG t1, 7 * REGBYTES(sp)
|
||||
SREG t0, 8 * REGBYTES(sp)
|
||||
SREG a7, 18 * REGBYTES(sp)
|
||||
SREG a6, 19 * REGBYTES(sp)
|
||||
SREG a5, 20 * REGBYTES(sp)
|
||||
SREG a4, 21 * REGBYTES(sp)
|
||||
SREG a3, 22 * REGBYTES(sp)
|
||||
SREG a2, 23 * REGBYTES(sp)
|
||||
SREG a1, 24 * REGBYTES(sp)
|
||||
SREG a0, 25 * REGBYTES(sp)
|
||||
SREG ra, 31 * REGBYTES(sp)
|
||||
.endm
|
||||
|
||||
.macro POP_CALLER_REG
|
||||
LREG t6, 2 * REGBYTES(sp)
|
||||
LREG t5, 3 * REGBYTES(sp)
|
||||
LREG t4, 4 * REGBYTES(sp)
|
||||
LREG t3, 5 * REGBYTES(sp)
|
||||
LREG t2, 6 * REGBYTES(sp)
|
||||
LREG t1, 7 * REGBYTES(sp)
|
||||
LREG t0, 8 * REGBYTES(sp)
|
||||
LREG a7, 18 * REGBYTES(sp)
|
||||
LREG a6, 19 * REGBYTES(sp)
|
||||
LREG a5, 20 * REGBYTES(sp)
|
||||
LREG a4, 21 * REGBYTES(sp)
|
||||
LREG a3, 22 * REGBYTES(sp)
|
||||
LREG a2, 23 * REGBYTES(sp)
|
||||
LREG a1, 24 * REGBYTES(sp)
|
||||
LREG a0, 25 * REGBYTES(sp)
|
||||
LREG ra, 31 * REGBYTES(sp)
|
||||
addi sp, sp, 32 * REGBYTES
|
||||
.endm
|
||||
|
||||
.macro PUSH_CALLEE_REG
|
||||
.macro PUSH_ALL_REG
|
||||
addi sp, sp, -(32 * REGBYTES)
|
||||
SREG t6, 2 * REGBYTES(sp)
|
||||
SREG t5, 3 * REGBYTES(sp)
|
||||
SREG t4, 4 * REGBYTES(sp)
|
||||
SREG t3, 5 * REGBYTES(sp)
|
||||
SREG t2, 6 * REGBYTES(sp)
|
||||
SREG t1, 7 * REGBYTES(sp)
|
||||
SREG t0, 8 * REGBYTES(sp)
|
||||
SREG s11, 9 * REGBYTES(sp)
|
||||
SREG s10, 10 * REGBYTES(sp)
|
||||
SREG s9, 11 * REGBYTES(sp)
|
||||
|
@ -94,11 +57,20 @@
|
|||
SREG s7, 13 * REGBYTES(sp)
|
||||
SREG s6, 14 * REGBYTES(sp)
|
||||
SREG s5, 15 * REGBYTES(sp)
|
||||
SREG a7, 18 * REGBYTES(sp)
|
||||
SREG a6, 19 * REGBYTES(sp)
|
||||
SREG a5, 20 * REGBYTES(sp)
|
||||
SREG a4, 21 * REGBYTES(sp)
|
||||
SREG a3, 22 * REGBYTES(sp)
|
||||
SREG a2, 23 * REGBYTES(sp)
|
||||
SREG a1, 24 * REGBYTES(sp)
|
||||
SREG a0, 25 * REGBYTES(sp)
|
||||
SREG s4, 26 * REGBYTES(sp)
|
||||
SREG s3, 27 * REGBYTES(sp)
|
||||
SREG s2, 28 * REGBYTES(sp)
|
||||
SREG s1, 29 * REGBYTES(sp)
|
||||
SREG s0, 30 * REGBYTES(sp)
|
||||
SREG ra, 31 * REGBYTES(sp)
|
||||
.endm
|
||||
|
||||
.macro POP_ALL_REG
|
||||
|
@ -133,85 +105,32 @@
|
|||
addi sp, sp, 32 * REGBYTES
|
||||
.endm
|
||||
|
||||
HalTaskContextSwitch:
|
||||
PUSH_ALL_REG
|
||||
andi a1, a0, RISCV_MSTATUS_MIE
|
||||
|
||||
// must be in machine mode
|
||||
ori a1, a1, 0x180
|
||||
slli a1, a1, 0x4
|
||||
or a0, a0, a1
|
||||
li a1, ~RISCV_MSTATUS_MIE
|
||||
and a0, a0, a1
|
||||
SREG a0, 16 * REGBYTES(sp)
|
||||
SREG ra, 17 * REGBYTES(sp)
|
||||
|
||||
la a1, g_losTask
|
||||
lw a0, 0(a1)
|
||||
sw sp, TASK_CB_KERNEL_SP(a0)
|
||||
|
||||
lw a0, 4(a1)
|
||||
sw a0, 0(a1)
|
||||
|
||||
HalStartToRun:
|
||||
// disable interrupts
|
||||
csrci mstatus, RISCV_MSTATUS_MIE
|
||||
|
||||
// indicate that sheduler is ON by setting g_taskScheduled=1
|
||||
la t0, g_taskScheduled
|
||||
li t1, 0x1
|
||||
sw t1, 0x0(t0)
|
||||
|
||||
j SwitchNewTask
|
||||
|
||||
HalTaskSchedule:
|
||||
la t0, g_intCount
|
||||
lw t1, 0(t0)
|
||||
bne t1, zero, 1f
|
||||
|
||||
li t0, RISCV_MSTATUS_MIE | RISCV_MSTATUS_MPIE
|
||||
csrrc a1, mstatus, t0
|
||||
|
||||
la t0, g_losTask
|
||||
lw t1, 0(t0)
|
||||
lw t2, 4(t0)
|
||||
bne t1, t2, 2f
|
||||
|
||||
csrw mstatus, a1
|
||||
1:
|
||||
ret
|
||||
2:
|
||||
addi sp, sp, -(32 * REGBYTES)
|
||||
andi a1, a1, RISCV_MSTATUS_MIE
|
||||
ori a1, a1, 0x180
|
||||
slli a1, a1, 0x4
|
||||
csrs mstatus, a1
|
||||
csrw mepc, ra
|
||||
|
||||
j SaveContextAndSwitchTask
|
||||
|
||||
HalTaskSwitch:
|
||||
la t0, g_losTaskLock
|
||||
lw t1, 0(t0)
|
||||
bgtz t1, NotSwitch
|
||||
|
||||
la t0, g_losTask
|
||||
lw t1, 0(t0)
|
||||
lw t2, 4(t0)
|
||||
beq t1, t2, NotSwitch
|
||||
|
||||
// stack pointer was passed by entry.s in register a2. store it in runTask structure
|
||||
csrr sp, mscratch
|
||||
|
||||
SaveContextAndSwitchTask:
|
||||
csrr t0, mstatus
|
||||
SREG t0, 16 * REGBYTES(sp)
|
||||
csrr t0, mepc
|
||||
SREG t0, 17 * REGBYTES(sp)
|
||||
PUSH_CALLEE_REG
|
||||
|
||||
// Clear the task running bit of runTask.
|
||||
lh t2, TASK_CB_STATUS(t1)
|
||||
li t0, OS_TASK_STATUS_NOT_RUNNING
|
||||
and t2, t2, t0
|
||||
sh t2, TASK_CB_STATUS(t1)
|
||||
sw sp, TASK_CB_KERNEL_SP(t1)
|
||||
|
||||
call HalTaskScheduleCheck
|
||||
|
||||
SwitchNewTask:
|
||||
// copy newTask into runTask
|
||||
la t0, g_losTask
|
||||
lw t1, 0x4(t0)
|
||||
sw t1, 0x0(t0)
|
||||
|
||||
// set the task running bit=1
|
||||
lh t2, TASK_CB_STATUS(t1)
|
||||
ori t2, t2, OS_TASK_STATUS_RUNNING
|
||||
sh t2, TASK_CB_STATUS(t1)
|
||||
la a1, g_losTask
|
||||
lw a0, 4(a1)
|
||||
|
||||
// retireve stack pointer
|
||||
lw sp, TASK_CB_KERNEL_SP(t1)
|
||||
lw sp, TASK_CB_KERNEL_SP(a0)
|
||||
|
||||
// enable global interrupts
|
||||
lw t0, 16 * REGBYTES(sp)
|
||||
|
@ -226,12 +145,6 @@ SwitchNewTask:
|
|||
|
||||
mret
|
||||
|
||||
NotSwitch:
|
||||
csrr sp, mscratch
|
||||
// retrieve the registers
|
||||
POP_CALLER_REG
|
||||
mret
|
||||
|
||||
.section .text
|
||||
HalDisableIRQ:
|
||||
li t0, (RISCV_MSTATUS_MPIE | RISCV_MSTATUS_MIE) // mpie | mie
|
||||
|
|
|
@ -34,26 +34,34 @@
|
|||
#include "soc.h"
|
||||
|
||||
.macro PUSH_CALLER_REG
|
||||
addi sp, sp, -(32 * REGBYTES)
|
||||
SREG t6, 2 * REGBYTES(sp)
|
||||
SREG t5, 3 * REGBYTES(sp)
|
||||
SREG t4, 4 * REGBYTES(sp)
|
||||
SREG t3, 5 * REGBYTES(sp)
|
||||
SREG t2, 6 * REGBYTES(sp)
|
||||
SREG t1, 7 * REGBYTES(sp)
|
||||
SREG t0, 8 * REGBYTES(sp)
|
||||
SREG a7, 18 * REGBYTES(sp)
|
||||
SREG a6, 19 * REGBYTES(sp)
|
||||
SREG a5, 20 * REGBYTES(sp)
|
||||
SREG a4, 21 * REGBYTES(sp)
|
||||
SREG a3, 22 * REGBYTES(sp)
|
||||
SREG a2, 23 * REGBYTES(sp)
|
||||
SREG a1, 24 * REGBYTES(sp)
|
||||
SREG a0, 25 * REGBYTES(sp)
|
||||
SREG ra, 31 * REGBYTES(sp)
|
||||
addi sp, sp, -(32 * REGBYTES)
|
||||
SREG t6, 2 * REGBYTES(sp)
|
||||
SREG t5, 3 * REGBYTES(sp)
|
||||
SREG t4, 4 * REGBYTES(sp)
|
||||
SREG t3, 5 * REGBYTES(sp)
|
||||
SREG t2, 6 * REGBYTES(sp)
|
||||
SREG t1, 7 * REGBYTES(sp)
|
||||
SREG t0, 8 * REGBYTES(sp)
|
||||
SREG a7, 18 * REGBYTES(sp)
|
||||
SREG a6, 19 * REGBYTES(sp)
|
||||
SREG a5, 20 * REGBYTES(sp)
|
||||
SREG a4, 21 * REGBYTES(sp)
|
||||
SREG a3, 22 * REGBYTES(sp)
|
||||
SREG a2, 23 * REGBYTES(sp)
|
||||
SREG a1, 24 * REGBYTES(sp)
|
||||
SREG a0, 25 * REGBYTES(sp)
|
||||
SREG ra, 31 * REGBYTES(sp)
|
||||
csrr t0, mstatus
|
||||
SREG t0, 16 * REGBYTES(sp)
|
||||
csrr t0, mepc
|
||||
SREG t0, 17 * REGBYTES(sp)
|
||||
.endm
|
||||
|
||||
.macro POP_CALLER_REG
|
||||
LREG t0, 16 * REGBYTES(sp)
|
||||
csrw mstatus, t0
|
||||
LREG t0, 17 * REGBYTES(sp)
|
||||
csrw mepc, t0
|
||||
LREG t6, 2 * REGBYTES(sp)
|
||||
LREG t5, 3 * REGBYTES(sp)
|
||||
LREG t4, 4 * REGBYTES(sp)
|
||||
|
@ -127,14 +135,7 @@
|
|||
.align 4
|
||||
HalTrapEntry:
|
||||
PUSH_CALLEE_REG
|
||||
csrr t0, mstatus
|
||||
sw t0, 16 * REGBYTES(sp)
|
||||
csrr t0, mepc
|
||||
sw t0, 17 * REGBYTES(sp)
|
||||
sw tp, 1 * REGBYTES(sp)
|
||||
sw sp, 0 * REGBYTES(sp)
|
||||
addi sp, sp, -(4 * REGBYTES)
|
||||
csrr a0, mcause
|
||||
sw a0, 0 * REGBYTES(sp)
|
||||
csrr t0, mtval
|
||||
sw t0, 1 * REGBYTES(sp)
|
||||
|
@ -165,6 +166,7 @@ HalTrapEntry:
|
|||
|
||||
.section .interrupt.HalTrapVector.text
|
||||
.extern HalTrapEntry
|
||||
.extern HalIrqEndCheckNeedSched
|
||||
.global HalTrapVector
|
||||
.equ TRAP_INTERRUPT_MODE_MASK, 0x80000000
|
||||
.align 4
|
||||
|
@ -179,6 +181,9 @@ HalTrapVector:
|
|||
csrw mscratch, sp
|
||||
la sp, __start_and_irq_stack_top
|
||||
jal HalHwiInterruptDone
|
||||
j HalTaskSwitch
|
||||
csrr sp, mscratch
|
||||
call HalIrqEndCheckNeedSched
|
||||
|
||||
POP_CALLER_REG
|
||||
mret
|
||||
#endif /* _LOS_TRAP_S */
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_arch_interrupt.h"
|
||||
#include "los_arch_context.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
#include "riscv_hal.h"
|
||||
|
||||
|
|
|
@ -29,11 +29,14 @@
|
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_tick.h"
|
||||
#include "los_config.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "riscv_hal.h"
|
||||
#include "los_timer.h"
|
||||
#include "los_config.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_reg.h"
|
||||
#include "los_arch_interrupt.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_arch_timer.h"
|
||||
#include "riscv_hal.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -53,20 +56,58 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER handler)
|
|||
|
||||
return LOS_OK; /* never return */
|
||||
}
|
||||
/* ****************************************************************************
|
||||
Function : HalGetCpuCycle
|
||||
Description : Get System cycle count
|
||||
Input : none
|
||||
output : cntHi --- CpuTick High 4 byte
|
||||
cntLo --- CpuTick Low 4 byte
|
||||
return : none
|
||||
**************************************************************************** */
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
|
||||
WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
|
||||
{
|
||||
HalGetSysCpuCycle(cntHi, cntLo);
|
||||
UINT64 timer;
|
||||
UINT32 timerL, timerH;
|
||||
READ_UINT32(timerL, MTIMER);
|
||||
READ_UINT32(timerH, MTIMER + MTIMER_HI_OFFSET);
|
||||
timer = OS_COMBINED_64(timerH, timerL);
|
||||
timer += nextResponseTime;
|
||||
|
||||
HalIrqDisable(RISCV_MACH_TIMER_IRQ);
|
||||
WRITE_UINT32(0xffffffff, MTIMERCMP + MTIMER_HI_OFFSET);
|
||||
WRITE_UINT32((UINT32)timer, MTIMERCMP);
|
||||
WRITE_UINT32((UINT32)(timer >> SHIFT_32_BIT), MTIMERCMP + MTIMER_HI_OFFSET);
|
||||
HalIrqEnable(RISCV_MACH_TIMER_IRQ);
|
||||
}
|
||||
|
||||
WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
{
|
||||
(VOID)period;
|
||||
UINT32 timerL, timerH;
|
||||
|
||||
READ_UINT32(timerL, MTIMER);
|
||||
READ_UINT32(timerH, MTIMER + MTIMER_HI_OFFSET);
|
||||
return OS_COMBINED_64(timerH, timerL);
|
||||
}
|
||||
|
||||
WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
|
||||
{
|
||||
UINT64 cycle;
|
||||
|
||||
if ((cntHi == NULL) || (cntLo == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
cycle = OsGetCurrSchedTimeCycle();
|
||||
*cntHi = cycle >> SHIFT_32_BIT;
|
||||
*cntLo = cycle & CYCLE_CHECK;
|
||||
return;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
wfi();
|
||||
}
|
||||
|
||||
WEAK VOID HalDelay(UINT32 ticks)
|
||||
{
|
||||
|
||||
|
|
|
@ -103,6 +103,22 @@ extern "C" {
|
|||
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* System timer is a 64/128 bit timer
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_TICK_WTIMER
|
||||
#define LOSCFG_BASE_CORE_TICK_WTIMER 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* System timer count maximum
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_TICK_RESPONSE_MAX
|
||||
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX 0
|
||||
#endif
|
||||
|
||||
/* =============================================================================
|
||||
Hardware interrupt module configuration
|
||||
============================================================================= */
|
||||
|
@ -190,7 +206,7 @@ extern "C" {
|
|||
* Configuration item for task Robin tailoring
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_TIMESLICE
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE 1
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -198,7 +214,7 @@ extern "C" {
|
|||
* Longest execution time of tasks with the same priorities
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000 /* 20ms */
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -609,6 +625,14 @@ extern UINT8 *m_aucSysMem0;
|
|||
#define LOSCFG_BACKTRACE_DEPTH 15
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* When the tick timer is a non-64/128-bit timer, it has ultra-low power compensation.
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_SCHED_SLEEP
|
||||
#define LOSCFG_BASE_CORE_SCHED_SLEEP 0
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _LOS_SCHED_H
|
||||
#define _LOS_SCHED_H
|
||||
|
||||
#include "los_task.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_timer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
extern UINT32 g_taskScheduled;
|
||||
typedef BOOL (*SchedScan)(VOID);
|
||||
|
||||
VOID OsSchedUpdateTimeBase(VOID);
|
||||
|
||||
UINT64 OsGetCurrTimeCycle(VOID);
|
||||
|
||||
UINT64 OsGetCurrSchedTimeCycle(VOID);
|
||||
|
||||
VOID OsSchedSetIdleTaskSchedPartam(LosTaskCB *idleTask);
|
||||
|
||||
UINT32 OsSchedSwtmrScanRegister(SchedScan func);
|
||||
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime);
|
||||
|
||||
VOID OsSchedTaskDeQueue(LosTaskCB *taskCB);
|
||||
|
||||
VOID OsSchedTaskEnQueue(LosTaskCB *taskCB);
|
||||
|
||||
VOID OsSchedTaskWait(LOS_DL_LIST *list, UINT32 timeout);
|
||||
|
||||
VOID OsSchedTaskWake(LosTaskCB *resumedTask);
|
||||
|
||||
BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority);
|
||||
|
||||
VOID OsSchedDelay(LosTaskCB *runTask, UINT32 tick);
|
||||
|
||||
VOID OsSchedYield(VOID);
|
||||
|
||||
VOID OsSchedTaskExit(LosTaskCB *taskCB);
|
||||
|
||||
VOID OsSchedTick(VOID);
|
||||
|
||||
UINT32 OsSchedInit(VOID);
|
||||
|
||||
VOID OsSchedStart(VOID);
|
||||
|
||||
BOOL OsSchedTaskSwitch(VOID);
|
||||
|
||||
LosTaskCB *OsGetTopTask(VOID);
|
||||
|
||||
extern VOID LOS_SchedTickHandler(VOID);
|
||||
|
||||
extern VOID LOS_Schedule(VOID);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
VOID OsSchedUpdateSleepTime(VOID);
|
||||
|
||||
VOID OsSchedToSleep(VOID);
|
||||
|
||||
typedef UINT32 (*SchedSleepInit)(VOID);
|
||||
|
||||
typedef VOID (*SchedSleepStart)(UINT64);
|
||||
|
||||
typedef VOID (*SchedSleepStop)(VOID);
|
||||
|
||||
typedef UINT64 (*SchedSleepGetSleepTimeNs)(VOID);
|
||||
|
||||
extern UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
|
||||
SchedSleepStop stop, SchedSleepGetSleepTimeNs getTime);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _LOS_SCHED_H */
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _LOS_SORTLINK_H
|
||||
#define _LOS_SORTLINK_H
|
||||
|
||||
#include "los_compiler.h"
|
||||
#include "los_list.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef enum {
|
||||
OS_SORT_LINK_TASK = 1,
|
||||
OS_SORT_LINK_SWTMR = 2,
|
||||
} SortLinkType;
|
||||
|
||||
typedef struct {
|
||||
LOS_DL_LIST sortLinkNode;
|
||||
UINT64 responseTime;
|
||||
} SortLinkList;
|
||||
|
||||
typedef struct {
|
||||
LOS_DL_LIST sortLink;
|
||||
} SortLinkAttribute;
|
||||
|
||||
#define OS_SORT_LINK_INVALID_TIME ((UINT64)-1)
|
||||
#define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->responseTime = (value))
|
||||
|
||||
SortLinkAttribute *OsGetSortLinkAttribute(SortLinkType type);
|
||||
UINT64 OsGetNextExpireTime(UINT64 startTime);
|
||||
UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader);
|
||||
VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList);
|
||||
VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type);
|
||||
VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type);
|
||||
UINT32 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList);
|
||||
UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _LOS_SORTLINK_H */
|
|
@ -37,6 +37,7 @@
|
|||
#ifndef _LOS_SWTMR_H
|
||||
#define _LOS_SWTMR_H
|
||||
|
||||
#include "los_sortlink.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -279,6 +280,7 @@ typedef struct tagSwTmrCtrl {
|
|||
UINT32 uwArg; /* Parameter passed in when the callback function
|
||||
that handles software timer timeout is called */
|
||||
SWTMR_PROC_FUNC pfnHandler; /* Callback function that handles software timer timeout */
|
||||
SortLinkList stSortList;
|
||||
} SWTMR_CTRL_S;
|
||||
|
||||
|
||||
|
@ -451,29 +453,6 @@ extern SWTMR_CTRL_S *g_swtmrCBArray;
|
|||
|
||||
#define OS_SWT_FROM_SID(swtmrId) ((SWTMR_CTRL_S *)g_swtmrCBArray + ((swtmrId) % LOSCFG_BASE_CORE_SWTMR_LIMIT))
|
||||
|
||||
/**
|
||||
* @ingroup los_swtmr
|
||||
* @brief Scan a software timer.
|
||||
*
|
||||
* @par Description:
|
||||
* <ul>
|
||||
* <li>This API is used to scan a software timer when a Tick interrupt occurs and determine whether the software timer
|
||||
expires.</li>
|
||||
* </ul>
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_swtmr_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_SwtmrStop
|
||||
*/
|
||||
extern UINT32 OsSwtmrScan(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_swtmr
|
||||
* @brief Initialization software timer.
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include "los_context.h"
|
||||
#include "los_event.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_sortlink.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -368,6 +369,8 @@ extern "C" {
|
|||
*/
|
||||
#define LOS_ERRNO_TSK_OPERATE_SWTMR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x22)
|
||||
|
||||
#define LOS_ERRNO_TSK_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x23)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Define the type of the task switching hook function.
|
||||
|
@ -1105,10 +1108,6 @@ extern CHAR* LOS_TaskNameGet(UINT32 taskID);
|
|||
*/
|
||||
extern VOID LOS_Schedule(VOID);
|
||||
|
||||
extern UINT32 OsTaskNextSwitchTimeGet(VOID);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup los_cpup
|
||||
* CPU usage error code: The request for memory fails.
|
||||
|
@ -1442,33 +1441,9 @@ extern UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 ta
|
|||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* The task is waiting for an event to occur.
|
||||
* The task is blocked on a time.
|
||||
*/
|
||||
#define OS_TASK_STATUS_EVENT 0x0400
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* The task is reading an event.
|
||||
*/
|
||||
#define OS_TASK_STATUS_EVENT_READ 0x0800
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* A software timer is waiting for an event to occur.
|
||||
*/
|
||||
#define OS_TASK_STATUS_SWTMR_WAIT 0x1000
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* The task is blocked on a queue.
|
||||
*/
|
||||
#define OS_TASK_STATUS_PEND_QUEUE 0x2000
|
||||
#define OS_TASK_STATUS_PEND_TIME 0x0080
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
|
@ -1627,6 +1602,10 @@ typedef struct {
|
|||
VOID *stackPointer; /**< Task stack pointer */
|
||||
UINT16 taskStatus;
|
||||
UINT16 priority;
|
||||
INT32 timeSlice;
|
||||
UINT32 waitTimes;
|
||||
SortLinkList sortList;
|
||||
UINT64 startTime;
|
||||
UINT32 stackSize; /**< Task stack size */
|
||||
UINT32 topOfStack; /**< Task stack top */
|
||||
UINT32 taskID; /**< Task ID */
|
||||
|
@ -1637,7 +1616,6 @@ typedef struct {
|
|||
CHAR *taskName; /**< Task name */
|
||||
LOS_DL_LIST pendList;
|
||||
LOS_DL_LIST timerList;
|
||||
UINT32 idxRollNum;
|
||||
EVENT_CB_S event;
|
||||
UINT32 eventMask; /**< Event mask */
|
||||
UINT32 eventMode; /**< Event mode */
|
||||
|
@ -1700,8 +1678,7 @@ extern UINT16 g_losTaskLock;
|
|||
* @ingroup los_hw
|
||||
* Check task schedule.
|
||||
*/
|
||||
#define LOS_CHECK_SCHEDULE ((!g_losTaskLock))
|
||||
|
||||
#define LOS_CHECK_SCHEDULE (!g_losTaskLock)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
|
@ -1745,50 +1722,6 @@ extern LOS_DL_LIST g_losFreeTask;
|
|||
*/
|
||||
extern LOS_DL_LIST g_taskRecyleList;
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Modify the priority of task.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to modify the priority of task.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>The taskCB should be a correct pointer to task control block structure.</li>
|
||||
* <li>the priority should be in [0, OS_TASK_PRIORITY_LOWEST].</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
|
||||
* @param priority [IN] Type #UINT16 the priority of task.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
extern VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Scan a task.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to scan a task.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
extern VOID OsTaskScan(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Initialization a task.
|
||||
|
@ -1894,52 +1827,6 @@ extern VOID OsTaskMonInit(VOID);
|
|||
*/
|
||||
extern VOID OsTaskEntry(UINT32 taskID);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief pend running task to pendlist
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to pend task to pendlist and add to sorted delay list.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>The pstList should be a vaild pointer to pendlist.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param list [IN] Type #LOS_DL_LIST * pointer to list which running task will be pended.
|
||||
* @param taskStatus [IN] Type #UINT32 Task Status.
|
||||
* @param timeOut [IN] Type #UINT32 Expiry time. The value range is [0,LOS_WAIT_FOREVER].
|
||||
*
|
||||
* @retval LOS_OK wait success
|
||||
* @retval LOS_NOK pend out
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see OsTaskWake
|
||||
*/
|
||||
extern VOID OsTaskWait(LOS_DL_LIST *list, UINT32 taskStatus, UINT32 timeOut);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief delete task from pendlist.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to delete task from pendlist and also add to the priqueue.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>The pstList should be a vaild pointer to pend list.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param resumedTask [IN] Type #LosTaskCB * pointer to the task which will be add to priqueue.
|
||||
* @param taskStatus [IN] Type #UINT32 Task Status.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see OsTaskWait
|
||||
*/
|
||||
extern VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Get the task water line.
|
||||
|
@ -1982,49 +1869,6 @@ extern UINT32 OsGetTaskWaterLine(UINT32 taskID);
|
|||
*/
|
||||
extern UINT8 *OsConvertTskStatus(UINT16 taskStatus);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Add task to sorted delay list.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to add task to sorted delay list.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>The taskCB should be a correct pointer to task control block structure.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
|
||||
* @param timeout [IN] Type #UINT32 wait time, ticks.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see OsTimerListDelete
|
||||
*/
|
||||
extern VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief delete task from sorted delay list.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to delete task from sorted delay list.
|
||||
*
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>The taskCB should be a correct pointer to task control block structure.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see OsTaskAdd2TimerList
|
||||
*/
|
||||
extern VOID OsTimerListDelete(LosTaskCB *taskCB);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Get all task information.
|
||||
|
@ -2048,51 +1892,6 @@ extern UINT32 OsGetAllTskInfo(VOID);
|
|||
|
||||
extern VOID *OsTskUserStackInit(VOID* stackPtr, VOID* userSP, UINT32 userStackSize);
|
||||
|
||||
/**
|
||||
* @ingroup los_timeslice
|
||||
* @brief Initialize time slices.
|
||||
*
|
||||
* @par Description:
|
||||
* <ul>
|
||||
* <li>This API is used to initialize time slices that defines the cycle of time slices according to
|
||||
LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT.</li>
|
||||
* </ul>
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_timeslice_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see None.
|
||||
*/
|
||||
extern VOID OsTimesliceInit(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_timeslice
|
||||
* @brief Check time slices.
|
||||
*
|
||||
* @par Description:
|
||||
* <ul>
|
||||
* <li>This API is used to check time slices. If the number of Ticks equals to the time for task switch, tasks are switched. Otherwise, the Tick counting continues.</li>
|
||||
* </ul>
|
||||
* @attention
|
||||
* <ul>
|
||||
* <li>None.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_timeslice_pri.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see None.
|
||||
*/
|
||||
extern VOID OsTimesliceCheck(VOID);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
|
|
@ -112,6 +112,18 @@ extern UINT32 LOS_SysClockGet(VOID);
|
|||
*/
|
||||
#define OS_SYS_US_PER_SECOND 1000000
|
||||
|
||||
#define OS_SYS_NS_PER_SECOND 1000000000
|
||||
|
||||
#define OS_SYS_NS_PER_US 1000
|
||||
|
||||
#define OS_CYCLE_PER_TICK (OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND)
|
||||
|
||||
#define OS_NS_PER_CYCLE (OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK)
|
||||
|
||||
#define OS_US_PER_TICK (OS_SYS_US_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
|
||||
|
||||
#define OS_NS_PER_TICK (OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
|
||||
|
||||
/**
|
||||
* @ingroup los_sys
|
||||
* System time basic function error code: Null pointer.
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "los_hook.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -128,22 +129,21 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UIN
|
|||
runTsk = g_losTask.runTask;
|
||||
runTsk->eventMask = eventMask;
|
||||
runTsk->eventMode = mode;
|
||||
OsTaskWait(&eventCB->stEventList, OS_TASK_STATUS_PEND, timeOut);
|
||||
OsSchedTaskWait(&eventCB->stEventList, timeOut);
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
intSave = LOS_IntLock();
|
||||
runTsk->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
|
||||
runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_EVENT_READ_TIMEOUT;
|
||||
}
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
ret = LOS_EventPoll(&eventCB->uwEventID, eventMask, mode);
|
||||
LOS_IntRestore(intSave);
|
||||
} else {
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -175,7 +175,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
|
|||
((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {
|
||||
exitFlag = 1;
|
||||
|
||||
OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
}
|
||||
resumedTask = nextTask;
|
||||
}
|
||||
|
|
|
@ -175,10 +175,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
|
||||
OsTimesliceInit();
|
||||
#endif
|
||||
|
||||
ret = OsIdleTaskCreate();
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_hook.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -228,22 +229,23 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
|
|||
runningTask->taskMux = (VOID *)muxPended;
|
||||
|
||||
if (muxPended->owner->priority > runningTask->priority) {
|
||||
OsTaskPriModify(muxPended->owner, runningTask->priority);
|
||||
(VOID)OsSchedModifyTaskSchedParam(muxPended->owner, runningTask->priority);
|
||||
}
|
||||
|
||||
OsTaskWait(&muxPended->muxList, OS_TASK_STATUS_PEND, timeout);
|
||||
OsSchedTaskWait(&muxPended->muxList, timeout);
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
intSave = LOS_IntLock();
|
||||
runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
|
||||
retErr = LOS_ERRNO_MUX_TIMEOUT;
|
||||
goto ERROR_MUX_PEND;
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_OK;
|
||||
|
||||
HOOK:
|
||||
|
@ -290,7 +292,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
|
|||
}
|
||||
|
||||
if ((muxPosted->owner->priority) != muxPosted->priority) {
|
||||
OsTaskPriModify(muxPosted->owner, muxPosted->priority);
|
||||
(VOID)OsSchedModifyTaskSchedParam(muxPosted->owner, muxPosted->priority);
|
||||
}
|
||||
|
||||
if (!LOS_ListEmpty(&muxPosted->muxList)) {
|
||||
|
@ -301,7 +303,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
|
|||
muxPosted->priority = resumedTask->priority;
|
||||
resumedTask->taskMux = NULL;
|
||||
|
||||
OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted);
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "los_membox.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_task.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -281,7 +282,6 @@ static INLINE UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32
|
|||
UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeOut)
|
||||
{
|
||||
LosQueueCB *queueCB = NULL;
|
||||
LosTaskCB *runTsk = NULL;
|
||||
LosTaskCB *resumedTask = NULL;
|
||||
UINT32 ret;
|
||||
UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);
|
||||
|
@ -306,14 +306,14 @@ UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT
|
|||
goto QUEUE_END;
|
||||
}
|
||||
|
||||
runTsk = (LosTaskCB *)g_losTask.runTask;
|
||||
OsTaskWait(&queueCB->readWriteList[readWrite], OS_TASK_STATUS_PEND_QUEUE, timeOut);
|
||||
LosTaskCB *runTsk = (LosTaskCB *)g_losTask.runTask;
|
||||
OsSchedTaskWait(&queueCB->readWriteList[readWrite], timeOut);
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
runTsk->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
|
||||
runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
|
||||
ret = LOS_ERRNO_QUEUE_TIMEOUT;
|
||||
goto QUEUE_END;
|
||||
}
|
||||
|
@ -326,7 +326,7 @@ UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT
|
|||
|
||||
if (!LOS_ListEmpty(&queueCB->readWriteList[readWriteTmp])) {
|
||||
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[readWriteTmp]));
|
||||
OsTaskWake(resumedTask, OS_TASK_STATUS_PEND_QUEUE);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
return LOS_OK;
|
||||
|
@ -484,7 +484,7 @@ LITE_OS_SEC_TEXT VOID *OsQueueMailAlloc(UINT32 queueID, VOID *mailPool, UINT32 t
|
|||
}
|
||||
|
||||
runTsk = (LosTaskCB *)g_losTask.runTask;
|
||||
OsTaskWait(&queueCB->memList, OS_TASK_STATUS_PEND_QUEUE, timeOut);
|
||||
OsSchedTaskWait(&queueCB->memList, timeOut);
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
|
||||
|
@ -545,7 +545,7 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma
|
|||
|
||||
if (!LOS_ListEmpty(&queueCB->memList)) {
|
||||
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->memList));
|
||||
OsTaskWake(resumedTask, OS_TASK_STATUS_PEND_QUEUE);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
mem = LOS_MemboxAlloc(mailPool);
|
||||
if (mem == NULL) {
|
||||
LOS_IntRestore(intSave);
|
||||
|
|
|
@ -0,0 +1,638 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_sched.h"
|
||||
#include "los_task.h"
|
||||
#include "los_tick.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_hook.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define OS_64BIT_MAX 0xFFFFFFFFFFFFFFFFULL
|
||||
#define OS_PRIORITY_QUEUE_NUM 32
|
||||
#define PRIQUEUE_PRIOR0_BIT 0x80000000U
|
||||
#define OS_SCHED_TIME_SLICES ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE)
|
||||
#define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 50us */
|
||||
#define OS_SCHED_MAX_RESPONSE_TIME (UINT64)(OS_64BIT_MAX - 1U)
|
||||
#define OS_TICK_RESPONSE_TIME_MAX LOSCFG_BASE_CORE_TICK_RESPONSE_MAX
|
||||
#if (LOSCFG_BASE_CORE_TICK_RESPONSE_MAX == 0)
|
||||
#error "Must specify the maximum value that tick timer counter supports!"
|
||||
#endif
|
||||
|
||||
STATIC SchedScan g_swtmrScan = NULL;
|
||||
STATIC SortLinkAttribute *g_taskSortLinkList = NULL;
|
||||
STATIC LOS_DL_LIST g_priQueueList[OS_PRIORITY_QUEUE_NUM];
|
||||
STATIC UINT32 g_queueBitmap;
|
||||
|
||||
STATIC UINT32 g_schedResponseID = 0;
|
||||
STATIC UINT64 g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
STATIC UINT64 g_schedStartTime;
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
typedef struct {
|
||||
SchedSleepInit init;
|
||||
SchedSleepStart start;
|
||||
SchedSleepStop stop;
|
||||
SchedSleepGetSleepTimeNs getTimeNs;
|
||||
BOOL ready;
|
||||
} SchedSleep;
|
||||
|
||||
STATIC BOOL g_schedSleepFlags = FALSE;
|
||||
STATIC UINT64 g_schedSleepTime;
|
||||
STATIC UINT64 g_schedEntrySleepTime;
|
||||
STATIC SchedSleep g_schedSleepCB;
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||
STATIC UINT64 g_schedTimerBase;
|
||||
|
||||
VOID OsSchedUpdateTimeBase(VOID)
|
||||
{
|
||||
UINT32 period = 0;
|
||||
|
||||
(VOID)HalGetTickCycle(&period);
|
||||
g_schedTimerBase += period;
|
||||
}
|
||||
#endif
|
||||
|
||||
UINT64 OsGetCurrTimeCycle(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
|
||||
return HalGetTickCycle(NULL);
|
||||
#else
|
||||
STATIC UINT64 oldSchedTime = 0;
|
||||
UINT32 period = 0;
|
||||
UINT32 intSave = LOS_IntLock();
|
||||
UINT64 time = HalGetTickCycle(&period);
|
||||
UINT64 schedTime = g_schedTimerBase + time;
|
||||
if (schedTime < oldSchedTime) {
|
||||
/* Turn the timer count */
|
||||
g_schedTimerBase += period;
|
||||
schedTime = g_schedTimerBase + time;
|
||||
}
|
||||
|
||||
LOS_ASSERT(schedTime >= oldSchedTime);
|
||||
|
||||
oldSchedTime = schedTime;
|
||||
LOS_IntRestore(intSave);
|
||||
return schedTime;
|
||||
#endif
|
||||
}
|
||||
|
||||
UINT64 OsGetCurrSchedTimeCycle(VOID)
|
||||
{
|
||||
if (!g_taskScheduled) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return OsGetCurrTimeCycle() - g_schedStartTime;
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime)
|
||||
{
|
||||
LOS_ASSERT(currTime >= taskCB->startTime);
|
||||
|
||||
INT32 incTime = currTime - taskCB->startTime;
|
||||
if (taskCB->taskID != g_idleTaskID) {
|
||||
taskCB->timeSlice -= incTime;
|
||||
}
|
||||
taskCB->startTime = currTime;
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime)
|
||||
{
|
||||
UINT64 nextExpireTime = OsGetNextExpireTime(startTime);
|
||||
UINT64 nextResponseTime;
|
||||
BOOL isTimeSlice = FALSE;
|
||||
|
||||
/* The current thread's time slice has been consumed, but the current system lock task cannot
|
||||
* trigger the schedule to release the CPU
|
||||
*/
|
||||
if (taskEndTime < nextExpireTime) {
|
||||
nextExpireTime = taskEndTime;
|
||||
isTimeSlice = TRUE;
|
||||
}
|
||||
|
||||
if ((g_schedResponseTime > nextExpireTime) && ((g_schedResponseTime - nextExpireTime) >= OS_CYCLE_PER_TICK)) {
|
||||
nextResponseTime = nextExpireTime - startTime;
|
||||
if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) {
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
g_schedSleepTime = nextResponseTime - OS_CYCLE_PER_TICK;
|
||||
#endif
|
||||
nextResponseTime = OS_TICK_RESPONSE_TIME_MAX;
|
||||
nextExpireTime = startTime + nextResponseTime;
|
||||
} else if (nextResponseTime < OS_CYCLE_PER_TICK) {
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
g_schedSleepTime = 0;
|
||||
#endif
|
||||
nextResponseTime = OS_CYCLE_PER_TICK;
|
||||
nextExpireTime = startTime + nextResponseTime;
|
||||
if (nextExpireTime >= g_schedResponseTime) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* There is no point earlier than the current expiration date */
|
||||
return;
|
||||
}
|
||||
|
||||
if (isTimeSlice) {
|
||||
/* The expiration time of the current system is the thread's slice expiration time */
|
||||
g_schedResponseID = responseID;
|
||||
} else {
|
||||
g_schedResponseID = OS_INVALID;
|
||||
}
|
||||
|
||||
g_schedResponseTime = nextExpireTime;
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||
g_schedTimerBase = OsGetCurrTimeCycle();
|
||||
#endif
|
||||
HalSysTickReload(nextResponseTime);
|
||||
}
|
||||
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime)
|
||||
{
|
||||
UINT64 endTime;
|
||||
LosTaskCB *runTask = g_losTask.runTask;
|
||||
|
||||
if (runTask->taskID != g_idleTaskID) {
|
||||
INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice;
|
||||
endTime = startTime + timeSlice;
|
||||
} else {
|
||||
endTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
}
|
||||
OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime);
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedPriQueueEnHead(LOS_DL_LIST *priqueueItem, UINT32 priority)
|
||||
{
|
||||
/*
|
||||
* Task control blocks are inited as zero. And when task is deleted,
|
||||
* and at the same time would be deleted from priority queue or
|
||||
* other lists, task pend node will restored as zero.
|
||||
*/
|
||||
if (LOS_ListEmpty(&g_priQueueList[priority])) {
|
||||
g_queueBitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
|
||||
}
|
||||
|
||||
LOS_ListAdd(&g_priQueueList[priority], priqueueItem);
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedPriQueueEnTail(LOS_DL_LIST *priqueueItem, UINT32 priority)
|
||||
{
|
||||
if (LOS_ListEmpty(&g_priQueueList[priority])) {
|
||||
g_queueBitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
|
||||
}
|
||||
|
||||
LOS_ListTailInsert(&g_priQueueList[priority], priqueueItem);
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedPriQueueDelete(LOS_DL_LIST *priqueueItem, UINT32 priority)
|
||||
{
|
||||
LOS_ListDelete(priqueueItem);
|
||||
if (LOS_ListEmpty(&g_priQueueList[priority])) {
|
||||
g_queueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> priority);
|
||||
}
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedWakePendTimeTask(UINT64 currTime, LosTaskCB *taskCB, BOOL *needSchedule)
|
||||
{
|
||||
UINT16 tempStatus = taskCB->taskStatus;
|
||||
if (tempStatus & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_DELAY)) {
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY);
|
||||
if (tempStatus & OS_TASK_STATUS_PEND) {
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_TIMEOUT;
|
||||
LOS_ListDelete(&taskCB->pendList);
|
||||
taskCB->taskMux = NULL;
|
||||
taskCB->taskSem = NULL;
|
||||
}
|
||||
|
||||
if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
|
||||
OsSchedTaskEnQueue(taskCB);
|
||||
*needSchedule = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STATIC INLINE BOOL OsSchedScanTimerList(VOID)
|
||||
{
|
||||
BOOL needSchedule = FALSE;
|
||||
LOS_DL_LIST *listObject = &g_taskSortLinkList->sortLink;
|
||||
/*
|
||||
* When task is pended with timeout, the task block is on the timeout sortlink
|
||||
* (per cpu) and ipc(mutex,sem and etc.)'s block at the same time, it can be waken
|
||||
* up by either timeout or corresponding ipc it's waiting.
|
||||
*
|
||||
* Now synchronize sortlink preocedure is used, therefore the whole task scan needs
|
||||
* to be protected, preventing another core from doing sortlink deletion at same time.
|
||||
*/
|
||||
|
||||
if (LOS_ListEmpty(listObject)) {
|
||||
return needSchedule;
|
||||
}
|
||||
|
||||
SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
|
||||
UINT64 currTime = OsGetCurrSchedTimeCycle();
|
||||
while (sortList->responseTime <= currTime) {
|
||||
LosTaskCB *taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList);
|
||||
OsDeleteNodeSortLink(g_taskSortLinkList, &taskCB->sortList);
|
||||
|
||||
OsSchedWakePendTimeTask(currTime, taskCB, &needSchedule);
|
||||
|
||||
if (LOS_ListEmpty(listObject)) {
|
||||
break;
|
||||
}
|
||||
|
||||
sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
|
||||
}
|
||||
|
||||
return needSchedule;
|
||||
}
|
||||
|
||||
VOID OsSchedTaskEnQueue(LosTaskCB *taskCB)
|
||||
{
|
||||
LOS_ASSERT(!(taskCB->taskStatus & OS_TASK_STATUS_READY));
|
||||
|
||||
if (taskCB->taskID != g_idleTaskID) {
|
||||
if (taskCB->timeSlice > OS_TIME_SLICE_MIN) {
|
||||
OsSchedPriQueueEnHead(&taskCB->pendList, taskCB->priority);
|
||||
} else {
|
||||
taskCB->timeSlice = OS_SCHED_TIME_SLICES;
|
||||
OsSchedPriQueueEnTail(&taskCB->pendList, taskCB->priority);
|
||||
}
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
|
||||
}
|
||||
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND |
|
||||
OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME);
|
||||
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
}
|
||||
|
||||
VOID OsSchedTaskDeQueue(LosTaskCB *taskCB)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
|
||||
if (taskCB->taskID != g_idleTaskID) {
|
||||
OsSchedPriQueueDelete(&taskCB->pendList, taskCB->priority);
|
||||
}
|
||||
|
||||
taskCB->taskStatus &= ~OS_TASK_STATUS_READY;
|
||||
}
|
||||
}
|
||||
|
||||
VOID OsSchedTaskExit(LosTaskCB *taskCB)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
|
||||
OsSchedTaskDeQueue(taskCB);
|
||||
} else if (taskCB->taskStatus & OS_TASK_STATUS_PEND) {
|
||||
LOS_ListDelete(&taskCB->pendList);
|
||||
taskCB->taskStatus &= ~OS_TASK_STATUS_PEND;
|
||||
}
|
||||
|
||||
if (taskCB->taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME)) {
|
||||
OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK);
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
VOID OsSchedYield(VOID)
|
||||
{
|
||||
LosTaskCB *runTask = g_losTask.runTask;
|
||||
|
||||
runTask->timeSlice = 0;
|
||||
}
|
||||
|
||||
VOID OsSchedDelay(LosTaskCB *runTask, UINT32 tick)
|
||||
{
|
||||
runTask->taskStatus |= OS_TASK_STATUS_DELAY;
|
||||
runTask->waitTimes = tick;
|
||||
}
|
||||
|
||||
VOID OsSchedTaskWait(LOS_DL_LIST *list, UINT32 ticks)
|
||||
{
|
||||
LosTaskCB *runTask = g_losTask.runTask;
|
||||
|
||||
runTask->taskStatus |= OS_TASK_STATUS_PEND;
|
||||
LOS_ListTailInsert(list, &runTask->pendList);
|
||||
|
||||
if (ticks != LOS_WAIT_FOREVER) {
|
||||
runTask->taskStatus |= OS_TASK_STATUS_PEND_TIME;
|
||||
runTask->waitTimes = ticks;
|
||||
}
|
||||
}
|
||||
|
||||
VOID OsSchedTaskWake(LosTaskCB *resumedTask)
|
||||
{
|
||||
LOS_ListDelete(&resumedTask->pendList);
|
||||
resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND;
|
||||
|
||||
if (resumedTask->taskStatus & OS_TASK_STATUS_PEND_TIME) {
|
||||
OsDeleteSortLink(&resumedTask->sortList, OS_SORT_LINK_TASK);
|
||||
resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME;
|
||||
}
|
||||
|
||||
if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) {
|
||||
OsSchedTaskEnQueue(resumedTask);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
|
||||
OsSchedTaskDeQueue(taskCB);
|
||||
taskCB->priority = priority;
|
||||
OsSchedTaskEnQueue(taskCB);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
taskCB->priority = priority;
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority);
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID OsSchedSetIdleTaskSchedPartam(LosTaskCB *idleTask)
|
||||
{
|
||||
OsSchedTaskEnQueue(idleTask);
|
||||
}
|
||||
|
||||
UINT32 OsSchedSwtmrScanRegister(SchedScan func)
|
||||
{
|
||||
if (func == NULL) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
g_swtmrScan = func;
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
UINT32 OsTaskNextSwitchTimeGet(VOID)
|
||||
{
|
||||
UINT32 intSave = LOS_IntLock();
|
||||
UINT32 ticks = OsSortLinkGetNextExpireTime(g_taskSortLinkList);
|
||||
LOS_IntRestore(intSave);
|
||||
return ticks;
|
||||
}
|
||||
|
||||
UINT32 OsSchedInit(VOID)
|
||||
{
|
||||
UINT16 pri;
|
||||
for (pri = 0; pri < OS_PRIORITY_QUEUE_NUM; pri++) {
|
||||
LOS_ListInit(&g_priQueueList[pri]);
|
||||
}
|
||||
g_queueBitmap = 0;
|
||||
|
||||
g_taskSortLinkList = OsGetSortLinkAttribute(OS_SORT_LINK_TASK);
|
||||
if (g_taskSortLinkList == NULL) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
OsSortLinkInit(g_taskSortLinkList);
|
||||
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
LosTaskCB *OsGetTopTask(VOID)
|
||||
{
|
||||
UINT32 priority;
|
||||
LosTaskCB *newTask = NULL;
|
||||
if (g_queueBitmap) {
|
||||
priority = CLZ(g_queueBitmap);
|
||||
newTask = LOS_DL_LIST_ENTRY(((LOS_DL_LIST *)&g_priQueueList[priority])->pstNext, LosTaskCB, pendList);
|
||||
} else {
|
||||
newTask = OS_TCB_FROM_TID(g_idleTaskID);
|
||||
}
|
||||
|
||||
return newTask;
|
||||
}
|
||||
|
||||
VOID OsSchedStart(VOID)
|
||||
{
|
||||
(VOID)LOS_IntLock();
|
||||
LosTaskCB *newTask = OsGetTopTask();
|
||||
|
||||
newTask->taskStatus |= OS_TASK_STATUS_RUNNING;
|
||||
g_losTask.newTask = newTask;
|
||||
g_losTask.runTask = g_losTask.newTask;
|
||||
|
||||
newTask->startTime = OsGetCurrSchedTimeCycle();
|
||||
OsSchedTaskDeQueue(newTask);
|
||||
|
||||
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
g_schedResponseID = OS_INVALID;
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice);
|
||||
|
||||
PRINTK("Entering scheduler\n");
|
||||
g_schedStartTime = OsGetCurrTimeCycle();
|
||||
g_taskScheduled = 1;
|
||||
}
|
||||
|
||||
BOOL OsSchedTaskSwitch(VOID)
|
||||
{
|
||||
UINT64 endTime;
|
||||
BOOL isTaskSwitch = FALSE;
|
||||
LosTaskCB *runTask = g_losTask.runTask;
|
||||
OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle());
|
||||
|
||||
if (runTask->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) {
|
||||
OsAdd2SortLink(&runTask->sortList, runTask->startTime, runTask->waitTimes, OS_SORT_LINK_TASK);
|
||||
} else if (!(runTask->taskStatus & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_UNUSED))) {
|
||||
OsSchedTaskEnQueue(runTask);
|
||||
}
|
||||
|
||||
LosTaskCB *newTask = OsGetTopTask();
|
||||
g_losTask.newTask = newTask;
|
||||
|
||||
if (runTask != newTask) {
|
||||
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
|
||||
OsTaskSwitchCheck();
|
||||
#endif
|
||||
runTask->taskStatus &= ~OS_TASK_STATUS_RUNNING;
|
||||
newTask->taskStatus |= OS_TASK_STATUS_RUNNING;
|
||||
newTask->startTime = runTask->startTime;
|
||||
isTaskSwitch = TRUE;
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN);
|
||||
}
|
||||
|
||||
OsSchedTaskDeQueue(newTask);
|
||||
|
||||
if (newTask->taskID != g_idleTaskID) {
|
||||
endTime = newTask->startTime + newTask->timeSlice;
|
||||
} else {
|
||||
endTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
}
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime);
|
||||
|
||||
return isTaskSwitch;
|
||||
}
|
||||
|
||||
VOID LOS_SchedTickHandler(VOID)
|
||||
{
|
||||
UINT64 currTime;
|
||||
BOOL needSched = FALSE;
|
||||
|
||||
UINT32 intSave = LOS_IntLock();
|
||||
|
||||
if (g_taskScheduled) {
|
||||
if (g_schedResponseID == OS_INVALID) {
|
||||
if (g_swtmrScan != NULL) {
|
||||
needSched = g_swtmrScan();
|
||||
}
|
||||
|
||||
needSched |= OsSchedScanTimerList();
|
||||
}
|
||||
|
||||
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
if (needSched && LOS_CHECK_SCHEDULE) {
|
||||
HalTaskSchedule();
|
||||
} else {
|
||||
currTime = OsGetCurrSchedTimeCycle();
|
||||
OsTimeSliceUpdate(g_losTask.runTask, currTime);
|
||||
OsSchedUpdateExpireTime(currTime);
|
||||
}
|
||||
} else {
|
||||
OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
VOID LOS_Schedule(VOID)
|
||||
{
|
||||
if (g_taskScheduled && LOS_CHECK_SCHEDULE) {
|
||||
HalTaskSchedule();
|
||||
}
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
VOID OsSchedUpdateSleepTime(VOID)
|
||||
{
|
||||
UINT64 nextResponseTime;
|
||||
UINT64 currTime, realSleepTime;
|
||||
UINT32 intSave;
|
||||
|
||||
if (g_schedSleepFlags == FALSE) {
|
||||
return;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
realSleepTime = g_schedSleepCB.getTimeNs();
|
||||
realSleepTime = (realSleepTime / OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK +
|
||||
(realSleepTime % OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK / OS_SYS_NS_PER_SECOND;
|
||||
if (realSleepTime < g_schedSleepTime) {
|
||||
nextResponseTime = g_schedSleepTime - realSleepTime;
|
||||
} else {
|
||||
nextResponseTime = 0;
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
|
||||
currTime = HalGetTickCycle(NULL);
|
||||
#else
|
||||
g_schedTimerBase = g_schedEntrySleepTime + realSleepTime;
|
||||
currTime = g_schedTimerBase;
|
||||
#endif
|
||||
if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) {
|
||||
nextResponseTime = OS_TICK_RESPONSE_TIME_MAX;
|
||||
} else if (nextResponseTime < OS_CYCLE_PER_TICK) {
|
||||
nextResponseTime = OS_CYCLE_PER_TICK;
|
||||
}
|
||||
|
||||
g_schedResponseID = OS_INVALID;
|
||||
g_schedResponseTime = currTime + nextResponseTime;
|
||||
HalSysTickReload(nextResponseTime);
|
||||
g_schedSleepFlags = FALSE;
|
||||
g_schedSleepTime = 0;
|
||||
g_schedSleepCB.stop();
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
VOID OsSchedToSleep(VOID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT64 sleepTime;
|
||||
|
||||
if (!g_schedSleepCB.ready) {
|
||||
return;
|
||||
}
|
||||
|
||||
sleepTime = (g_schedSleepTime / OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND +
|
||||
(g_schedSleepTime % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK;
|
||||
if (sleepTime == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
HalTickLock();
|
||||
g_schedEntrySleepTime = OsGetCurrSchedTimeCycle();
|
||||
|
||||
g_schedSleepCB.start(sleepTime);
|
||||
g_schedSleepFlags = TRUE;
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
|
||||
SchedSleepStop stop, SchedSleepGetSleepTimeNs getTime)
|
||||
{
|
||||
UINT32 ret;
|
||||
|
||||
if ((init == NULL) || (start == NULL) || (stop == NULL) || (getTime == NULL)) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
g_schedSleepCB.init = init;
|
||||
g_schedSleepCB.start = start;
|
||||
g_schedSleepCB.stop = stop;
|
||||
g_schedSleepCB.getTimeNs = getTime;
|
||||
|
||||
ret = g_schedSleepCB.init();
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
g_schedSleepCB.ready = TRUE;
|
||||
return LOS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
|
@ -36,6 +36,7 @@
|
|||
#include "los_hook.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -251,18 +252,19 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
|
|||
|
||||
runningTask = (LosTaskCB *)g_losTask.runTask;
|
||||
runningTask->taskSem = (VOID *)semPended;
|
||||
OsTaskWait(&semPended->semList, OS_TASK_STATUS_PEND, timeout);
|
||||
OsSchedTaskWait(&semPended->semList, timeout);
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
intSave = LOS_IntLock();
|
||||
runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
|
||||
retErr = LOS_ERRNO_SEM_TIMEOUT;
|
||||
goto ERROR_SEM_PEND;
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_OK;
|
||||
|
||||
ERROR_SEM_PEND:
|
||||
|
@ -301,7 +303,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle)
|
|||
if (!LOS_ListEmpty(&semPosted->semList)) {
|
||||
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(semPosted->semList)));
|
||||
resumedTask->taskSem = NULL;
|
||||
OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask);
|
||||
|
|
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_sortlink.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif /* __cplusplus */
|
||||
|
||||
STATIC SortLinkAttribute g_taskSortLink;
|
||||
STATIC SortLinkAttribute g_swtmrSortLink;
|
||||
|
||||
UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
|
||||
{
|
||||
LOS_ListInit(&sortLinkHeader->sortLink);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsAddNode2SortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
|
||||
{
|
||||
LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink;
|
||||
|
||||
if (LOS_ListEmpty(head)) {
|
||||
LOS_ListAdd(head, &sortList->sortLinkNode);
|
||||
return;
|
||||
}
|
||||
|
||||
SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
|
||||
if (listSorted->responseTime >= sortList->responseTime) {
|
||||
LOS_ListAdd(head, &sortList->sortLinkNode);
|
||||
return;
|
||||
}
|
||||
|
||||
LOS_DL_LIST *prevNode = head->pstPrev;
|
||||
do {
|
||||
listSorted = LOS_DL_LIST_ENTRY(prevNode, SortLinkList, sortLinkNode);
|
||||
if (listSorted->responseTime <= sortList->responseTime) {
|
||||
LOS_ListAdd(prevNode, &sortList->sortLinkNode);
|
||||
break;
|
||||
}
|
||||
|
||||
prevNode = prevNode->pstPrev;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
|
||||
{
|
||||
LOS_ListDelete(&sortList->sortLinkNode);
|
||||
SET_SORTLIST_VALUE(sortList, OS_SORT_LINK_INVALID_TIME);
|
||||
}
|
||||
|
||||
STATIC INLINE UINT64 OsGetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, UINT64 startTime)
|
||||
{
|
||||
UINT64 expirTime = 0;
|
||||
UINT64 nextExpirTime = 0;
|
||||
LOS_DL_LIST *head = &sortHeader->sortLink;
|
||||
LOS_DL_LIST *list = head->pstNext;
|
||||
|
||||
if (LOS_ListEmpty(head)) {
|
||||
return (UINT64)-1;
|
||||
}
|
||||
|
||||
do {
|
||||
SortLinkList *listSorted = LOS_DL_LIST_ENTRY(list, SortLinkList, sortLinkNode);
|
||||
if (listSorted->responseTime <= startTime) {
|
||||
expirTime = startTime;
|
||||
list = list->pstNext;
|
||||
} else {
|
||||
nextExpirTime = listSorted->responseTime;
|
||||
break;
|
||||
}
|
||||
} while (list != head);
|
||||
|
||||
if (expirTime == 0) {
|
||||
return nextExpirTime;
|
||||
}
|
||||
|
||||
if (nextExpirTime == 0) {
|
||||
return expirTime;
|
||||
}
|
||||
|
||||
if ((nextExpirTime - expirTime) <= OS_US_PER_TICK) {
|
||||
return nextExpirTime;
|
||||
}
|
||||
|
||||
return expirTime;
|
||||
}
|
||||
|
||||
VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SortLinkAttribute *sortLinkHeader = NULL;
|
||||
|
||||
if (type == OS_SORT_LINK_TASK) {
|
||||
sortLinkHeader = &g_taskSortLink;
|
||||
} else if (type == OS_SORT_LINK_SWTMR) {
|
||||
sortLinkHeader = &g_swtmrSortLink;
|
||||
} else {
|
||||
LOS_Panic("Sort link type error : %u\n", type);
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
SET_SORTLIST_VALUE(node, startTime + (UINT64)waitTicks * OS_CYCLE_PER_TICK);
|
||||
OsAddNode2SortLink(sortLinkHeader, node);
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SortLinkAttribute *sortLinkHeader = NULL;
|
||||
|
||||
if (type == OS_SORT_LINK_TASK) {
|
||||
sortLinkHeader = &g_taskSortLink;
|
||||
} else if (type == OS_SORT_LINK_SWTMR) {
|
||||
sortLinkHeader = &g_swtmrSortLink;
|
||||
} else {
|
||||
LOS_Panic("Sort link type error : %u\n", type);
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
|
||||
OsDeleteNodeSortLink(sortLinkHeader, node);
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
SortLinkAttribute *OsGetSortLinkAttribute(SortLinkType type)
|
||||
{
|
||||
if (type == OS_SORT_LINK_TASK) {
|
||||
return &g_taskSortLink;
|
||||
} else if (type == OS_SORT_LINK_SWTMR) {
|
||||
return &g_swtmrSortLink;
|
||||
}
|
||||
|
||||
PRINT_ERR("Invalid sort link type!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
UINT64 OsGetNextExpireTime(UINT64 startTime)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SortLinkAttribute *taskHeader = &g_taskSortLink;
|
||||
SortLinkAttribute *swtmrHeader = &g_swtmrSortLink;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
UINT64 taskExpirTime = OsGetSortLinkNextExpireTime(taskHeader, startTime);
|
||||
UINT64 swtmrExpirTime = OsGetSortLinkNextExpireTime(swtmrHeader, startTime);
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return (taskExpirTime < swtmrExpirTime) ? taskExpirTime : swtmrExpirTime;
|
||||
}
|
||||
|
||||
UINT32 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList)
|
||||
{
|
||||
if (currTime >= targetSortList->responseTime) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (UINT32)(((targetSortList->responseTime - currTime) * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_CLOCK);
|
||||
}
|
||||
|
||||
UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader)
|
||||
{
|
||||
LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink;
|
||||
|
||||
if (LOS_ListEmpty(head)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
|
||||
return OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), listSorted);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* __cplusplus */
|
|
@ -36,6 +36,7 @@
|
|||
#include "los_memory.h"
|
||||
#include "los_queue.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -45,10 +46,10 @@ extern "C" {
|
|||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR == 1)
|
||||
|
||||
LITE_OS_SEC_BSS UINT32 g_swtmrHandlerQueue; /* Software Timer timeout queue ID */
|
||||
LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrCBArray = NULL; /* first address in Timer memory space */
|
||||
LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrFreeList = NULL; /* Free list of Softwaer Timer */
|
||||
LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrSortList = NULL; /* The software timer count list */
|
||||
LITE_OS_SEC_BSS UINT32 g_swtmrHandlerQueue; /* Software Timer timeout queue ID */
|
||||
LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrCBArray = NULL; /* first address in Timer memory space */
|
||||
LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrFreeList = NULL; /* Free list of Softwaer Timer */
|
||||
LITE_OS_SEC_BSS SortLinkAttribute *g_swtmrSortLinkList = NULL; /* The software timer count list */
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
typedef struct SwtmrAlignDataStr {
|
||||
|
@ -59,9 +60,6 @@ typedef struct SwtmrAlignDataStr {
|
|||
UINT32 isAligned : 1;
|
||||
} SwtmrAlignData;
|
||||
LITE_OS_SEC_BSS SwtmrAlignData g_swtmrAlignID[LOSCFG_BASE_CORE_SWTMR_LIMIT] = {0}; /* store swtmr align */
|
||||
static UINT32 g_swtimerRousesTime = 0; /* suspend time */
|
||||
static SWTMR_CTRL_S *g_swtmrRouses = NULL; /* first swtmr that can wake up */
|
||||
static SWTMR_CTRL_S *g_swtmrRousesPrev = NULL;
|
||||
#endif
|
||||
|
||||
#define SWTMR_MAX_RUNNING_TICKS 2
|
||||
|
@ -125,103 +123,48 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsSwtmrInit
|
||||
Description : Initializes Software Timer
|
||||
Input : None
|
||||
Output : None
|
||||
Return : LOS_OK on success or error code on failure
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
|
||||
{
|
||||
UINT32 size;
|
||||
UINT16 index;
|
||||
UINT32 ret;
|
||||
SWTMR_CTRL_S *swtmr = NULL;
|
||||
SWTMR_CTRL_S *temp = NULL;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
// Ignore the return code when matching CSEC rule 6.6(1).
|
||||
(VOID)memset_s((VOID *)g_swtmrAlignID, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT,
|
||||
0, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT);
|
||||
#endif
|
||||
|
||||
g_swtmrSortList = (SWTMR_CTRL_S *)NULL;
|
||||
size = sizeof(SWTMR_CTRL_S) * LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
swtmr = (SWTMR_CTRL_S *)LOS_MemAlloc(m_aucSysMem0, size);
|
||||
if (swtmr == NULL) {
|
||||
return LOS_ERRNO_SWTMR_NO_MEMORY;
|
||||
}
|
||||
// Ignore the return code when matching CSEC rule 6.6(3).
|
||||
(VOID)memset_s((VOID *)swtmr, size, 0, size);
|
||||
g_swtmrCBArray = swtmr;
|
||||
g_swtmrFreeList = swtmr;
|
||||
swtmr->usTimerID = 0;
|
||||
temp = swtmr;
|
||||
swtmr++;
|
||||
for (index = 1; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) {
|
||||
swtmr->usTimerID = index;
|
||||
temp->pstNext = swtmr;
|
||||
temp = swtmr;
|
||||
}
|
||||
|
||||
ret = LOS_QueueCreate((CHAR *)NULL, OS_SWTMR_HANDLE_QUEUE_SIZE,
|
||||
&g_swtmrHandlerQueue, 0, sizeof(SwtmrHandlerItem));
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED;
|
||||
}
|
||||
|
||||
ret = OsSwtmrTaskCreate();
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_ERRNO_SWTMR_TASK_CREATE_FAILED;
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
STATIC_INLINE UINT32 OsSwtmrCalcAlignCount(UINT32 interval, UINT32 timerId)
|
||||
STATIC_INLINE UINT32 OsSwtmrCalcAlignCount(UINT64 currTime, UINT32 interval, UINT32 timerId)
|
||||
{
|
||||
SWTMR_CTRL_S *cur = g_swtmrSortList;
|
||||
UINT32 count = 0;
|
||||
UINT32 count;
|
||||
|
||||
if (interval == 0) {
|
||||
return interval;
|
||||
}
|
||||
while (cur != NULL) {
|
||||
count += cur->uwCount;
|
||||
if (cur->usTimerID == timerId) {
|
||||
return (interval - (cur->uwInterval - count) % interval);
|
||||
}
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
return interval;
|
||||
SWTMR_CTRL_S *cur = g_swtmrCBArray + timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
count = OsSortLinkGetTargetExpireTime(currTime, &cur->stSortList);
|
||||
return (interval - (cur->uwInterval - count) % interval);
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
|
||||
VOID OsSwtmrFindAlignPos(UINT64 currTime, SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *intPos = (SWTMR_CTRL_S *)NULL;
|
||||
SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
|
||||
SWTMR_CTRL_S *minInLarge = (SWTMR_CTRL_S *)NULL;
|
||||
SWTMR_CTRL_S *maxInLitte = (SWTMR_CTRL_S *)NULL;
|
||||
UINT32 currSwtmrTimes, swtmrTimes;
|
||||
SwtmrAlignData swtmrAlgInfo, currSwtmrAlgInfo;
|
||||
UINT32 minInLargeVal = OS_NULL_INT;
|
||||
UINT32 maxInLitteval = OS_NULL_INT;
|
||||
|
||||
currSwtmrAlgInfo = g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
|
||||
LOS_DL_LIST *listHead = &g_swtmrSortLinkList->sortLink;
|
||||
if (LOS_ListEmpty(listHead)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SwtmrAlignData currSwtmrAlgInfo = g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
|
||||
currSwtmrTimes = currSwtmrAlgInfo.times;
|
||||
cur = g_swtmrSortList;
|
||||
while (cur != NULL) {
|
||||
swtmrAlgInfo = g_swtmrAlignID[cur->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
|
||||
if ((swtmrAlgInfo.isAligned == 0) || (swtmrAlgInfo.canAlign == 0)) { // swtmr not start
|
||||
LOS_DL_LIST *listObject = listHead->pstNext;
|
||||
|
||||
do {
|
||||
SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject, SortLinkList, sortLinkNode);
|
||||
SWTMR_CTRL_S *cur = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
|
||||
SwtmrAlignData swtmrAlgInfo = g_swtmrAlignID[cur->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
|
||||
/* swtmr not start */
|
||||
if ((swtmrAlgInfo.isAligned == 0) || (swtmrAlgInfo.canAlign == 0)) {
|
||||
goto CONTINUE_NEXT_NODE;
|
||||
}
|
||||
// find same interval timer, directly return
|
||||
/* find same interval timer, directly return */
|
||||
if (cur->uwInterval == swtmr->uwInterval) {
|
||||
swtmr->uwCount = 0;
|
||||
return cur;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((currSwtmrAlgInfo.canMultiple != 1) || (swtmrAlgInfo.times == 0)) {
|
||||
|
@ -229,7 +172,7 @@ LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
|
|||
}
|
||||
swtmrTimes = swtmrAlgInfo.times;
|
||||
if (currSwtmrTimes == 0) {
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
if ((swtmrTimes >= currSwtmrTimes) && ((swtmrTimes % currSwtmrTimes) == 0)) {
|
||||
if (minInLargeVal > (swtmrTimes / currSwtmrTimes)) {
|
||||
|
@ -242,17 +185,17 @@ LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
|
|||
maxInLitte = cur;
|
||||
}
|
||||
}
|
||||
CONTINUE_NEXT_NODE:
|
||||
CONTINUE_NEXT_NODE:
|
||||
listObject = listObject->pstNext;
|
||||
} while (listObject != listHead);
|
||||
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
if (minInLarge != NULL) {
|
||||
swtmr->uwCount = OsSwtmrCalcAlignCount(swtmr->uwInterval, minInLarge->usTimerID);
|
||||
swtmr->uwCount = OsSwtmrCalcAlignCount(currTime, swtmr->uwInterval, minInLarge->usTimerID);
|
||||
} else if (maxInLitte != NULL) {
|
||||
swtmr->uwCount = 0;
|
||||
intPos = maxInLitte;
|
||||
swtmr->uwCount = OsSortLinkGetTargetExpireTime(currTime, &maxInLitte->stSortList);
|
||||
}
|
||||
return intPos;
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -265,38 +208,22 @@ Return : None
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *prev = (SWTMR_CTRL_S *)NULL;
|
||||
SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
|
||||
UINT64 currTime = OsGetCurrSchedTimeCycle();
|
||||
|
||||
swtmr->uwCount = swtmr->uwInterval;
|
||||
swtmr->ucState = OS_SWTMR_STATUS_TICKING;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
if ((g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].canAlign == 1) &&
|
||||
(g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned == 0)) {
|
||||
g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 1;
|
||||
prev = OsSwtmrFindAlignPos(swtmr);
|
||||
OsSwtmrFindAlignPos(currTime, swtmr);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (prev == NULL) {
|
||||
cur = g_swtmrSortList;
|
||||
while (cur != NULL) {
|
||||
if (cur->uwCount > swtmr->uwCount) {
|
||||
break;
|
||||
}
|
||||
|
||||
swtmr->uwCount -= cur->uwCount;
|
||||
prev = cur;
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
OsAdd2SortLink(&swtmr->stSortList, currTime, swtmr->uwCount, OS_SORT_LINK_SWTMR);
|
||||
if (LOS_TaskIsRunning()) {
|
||||
OsSchedUpdateExpireTime(currTime);
|
||||
}
|
||||
|
||||
swtmr->pstNext = ((prev == NULL) ? g_swtmrSortList : prev->pstNext);
|
||||
if (swtmr->pstNext != NULL) {
|
||||
swtmr->pstNext->uwCount -= swtmr->uwCount;
|
||||
}
|
||||
(prev == NULL) ? (g_swtmrSortList = swtmr) : (prev->pstNext = swtmr);
|
||||
swtmr->ucState = OS_SWTMR_STATUS_TICKING;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -320,93 +247,67 @@ STATIC_INLINE VOID OsSwtmrDelete(SWTMR_CTRL_S *swtmr)
|
|||
}
|
||||
|
||||
|
||||
LITE_OS_SEC_TEXT VOID OsSwtmrStop(const SWTMR_CTRL_S *swtmr)
|
||||
LITE_OS_SEC_TEXT VOID OsSwtmrStop(SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *prev = (SWTMR_CTRL_S *)NULL;
|
||||
SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
|
||||
|
||||
if (!g_swtmrSortList) {
|
||||
return;
|
||||
}
|
||||
|
||||
cur = g_swtmrSortList;
|
||||
|
||||
while (cur != swtmr) {
|
||||
prev = cur;
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
return;
|
||||
}
|
||||
if (cur->pstNext != NULL) {
|
||||
cur->pstNext->uwCount += cur->uwCount;
|
||||
}
|
||||
|
||||
if (prev == NULL) {
|
||||
g_swtmrSortList = cur->pstNext;
|
||||
} else {
|
||||
prev->pstNext = cur->pstNext;
|
||||
}
|
||||
|
||||
cur->pstNext = (SWTMR_CTRL_S *)NULL;
|
||||
cur->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
OsDeleteSortLink(&swtmr->stSortList, OS_SORT_LINK_SWTMR);
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
|
||||
if (LOS_TaskIsRunning()) {
|
||||
OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 0;
|
||||
g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsSwtmrTimeoutHandle
|
||||
Description : Software Timer time out handler
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT static VOID OsSwtmrTimeoutHandle(VOID)
|
||||
STATIC VOID OsSwtmrTimeoutHandle(SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *swtmr = g_swtmrSortList;
|
||||
SwtmrHandlerItem swtmrHandler;
|
||||
|
||||
while ((swtmr != NULL) && (swtmr->uwCount == 0)) {
|
||||
g_swtmrSortList = swtmr->pstNext;
|
||||
swtmrHandler.handler = swtmr->pfnHandler;
|
||||
swtmrHandler.arg = swtmr->uwArg;
|
||||
(VOID)LOS_QueueWriteCopy(g_swtmrHandlerQueue, &swtmrHandler, sizeof(SwtmrHandlerItem), LOS_NO_WAIT);
|
||||
if (swtmr->ucMode == LOS_SWTMR_MODE_ONCE) {
|
||||
OsSwtmrDelete(swtmr);
|
||||
if (swtmr->usTimerID < (OS_SWTMR_MAX_TIMERID - LOSCFG_BASE_CORE_SWTMR_LIMIT)) {
|
||||
swtmr->usTimerID += LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
} else {
|
||||
swtmr->usTimerID %= LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
}
|
||||
} else if (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD) {
|
||||
OsSwtmrStart(swtmr);
|
||||
} else if (swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE) {
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
}
|
||||
swtmrHandler.handler = swtmr->pfnHandler;
|
||||
swtmrHandler.arg = swtmr->uwArg;
|
||||
|
||||
swtmr = g_swtmrSortList;
|
||||
(VOID)LOS_QueueWriteCopy(g_swtmrHandlerQueue, &swtmrHandler, sizeof(SwtmrHandlerItem), LOS_NO_WAIT);
|
||||
if (swtmr->ucMode == LOS_SWTMR_MODE_ONCE) {
|
||||
OsSwtmrDelete(swtmr);
|
||||
if (swtmr->usTimerID < (OS_SWTMR_MAX_TIMERID - LOSCFG_BASE_CORE_SWTMR_LIMIT)) {
|
||||
swtmr->usTimerID += LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
} else {
|
||||
swtmr->usTimerID %= LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
}
|
||||
} else if (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD) {
|
||||
OsSwtmrStart(swtmr);
|
||||
} else if (swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE) {
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsSwtmrScan
|
||||
Description : Tick interrupt interface module of Software Timer
|
||||
Input : None
|
||||
Output : None
|
||||
Return : LOS_OK on success
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT UINT32 OsSwtmrScan(VOID)
|
||||
STATIC BOOL OsSwtmrScan(VOID)
|
||||
{
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
if (g_swtmrSortList != NULL) {
|
||||
if (--(g_swtmrSortList->uwCount) == 0) {
|
||||
OsSwtmrTimeoutHandle();
|
||||
}
|
||||
BOOL needSchedule = FALSE;
|
||||
LOS_DL_LIST *listObject = &g_swtmrSortLinkList->sortLink;
|
||||
|
||||
if (LOS_ListEmpty(listObject)) {
|
||||
return needSchedule;
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_OK;
|
||||
|
||||
SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
|
||||
UINT64 currTime = OsGetCurrSchedTimeCycle();
|
||||
while (sortList->responseTime <= currTime) {
|
||||
OsDeleteNodeSortLink(g_swtmrSortLinkList, sortList);
|
||||
|
||||
SWTMR_CTRL_S *swtmr = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
|
||||
OsSwtmrTimeoutHandle(swtmr);
|
||||
|
||||
needSchedule = TRUE;
|
||||
if (LOS_ListEmpty(listObject)) {
|
||||
break;
|
||||
}
|
||||
|
||||
sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
|
||||
}
|
||||
|
||||
return needSchedule;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -416,174 +317,88 @@ Input : None
|
|||
Output : None
|
||||
Return : Count of the Timer list
|
||||
*****************************************************************************/
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
|
||||
{
|
||||
SWTMR_CTRL_S *cur = NULL;
|
||||
UINT32 tmpTime = 0;
|
||||
UINT32 sleepTime = OS_NULL_INT;
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
cur = g_swtmrSortList;
|
||||
|
||||
// find first timer can wakeup the system
|
||||
while (cur != NULL) {
|
||||
if (cur->ucRouses == OS_SWTMR_ROUSES_ALLOW) {
|
||||
g_swtmrRouses = cur;
|
||||
break;
|
||||
}
|
||||
|
||||
tmpTime += cur->uwCount;
|
||||
g_swtmrRousesPrev = cur;
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
|
||||
if (cur != NULL) {
|
||||
sleepTime = cur->uwCount + tmpTime;
|
||||
g_swtimerRousesTime = sleepTime;
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
return sleepTime;
|
||||
}
|
||||
#else
|
||||
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
|
||||
{
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
if (g_swtmrSortList == NULL) {
|
||||
LOS_IntRestore(intSave);
|
||||
return OS_NULL_INT;
|
||||
}
|
||||
UINT32 tmp = g_swtmrSortList->uwCount;
|
||||
UINT32 ticks = OsSortLinkGetNextExpireTime(g_swtmrSortLinkList);
|
||||
LOS_IntRestore(intSave);
|
||||
return tmp;
|
||||
return ticks;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsSwtimerInsert
|
||||
Description : Insert a list of swtmr
|
||||
Input : **head, *swtmr
|
||||
Output : **head, *swtmr
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
VOID OsSwtimerInsert(SWTMR_CTRL_S **head, SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *prev = NULL;
|
||||
SWTMR_CTRL_S *nextTmp = swtmr->pstNext;
|
||||
SWTMR_CTRL_S *cur = *head;
|
||||
|
||||
while (swtmr != NULL) {
|
||||
while (cur != NULL) {
|
||||
if (cur->uwCount > swtmr->uwCount) {
|
||||
break;
|
||||
}
|
||||
|
||||
swtmr->uwCount -= cur->uwCount;
|
||||
prev = cur;
|
||||
cur = cur->pstNext;
|
||||
}
|
||||
swtmr->pstNext = cur;
|
||||
|
||||
if (cur != NULL) {
|
||||
cur->uwCount -= swtmr->uwCount;
|
||||
}
|
||||
if (prev == NULL) {
|
||||
*head = swtmr;
|
||||
} else {
|
||||
prev->pstNext = swtmr;
|
||||
}
|
||||
|
||||
prev = swtmr;
|
||||
swtmr = nextTmp;
|
||||
nextTmp = nextTmp->pstNext;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/*****************************************************************************
|
||||
Function : OsSwtmrAdjust
|
||||
Description : Adjust Software Timer list
|
||||
Input : sleepTime
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
LITE_OS_SEC_TEXT VOID OsSwtmrAdjust(UINT32 sleepTime)
|
||||
{
|
||||
SWTMR_CTRL_S *cur = NULL;
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
if (g_swtmrRouses == NULL) {
|
||||
LOS_IntRestore(intSave);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sleepTime > g_swtimerRousesTime) {
|
||||
sleepTime = g_swtimerRousesTime;
|
||||
}
|
||||
|
||||
if (sleepTime <= g_swtmrRouses->uwCount) {
|
||||
g_swtmrRouses->uwCount -= sleepTime;
|
||||
} else {
|
||||
g_swtmrRouses->uwCount = g_swtimerRousesTime - sleepTime;
|
||||
|
||||
if (g_swtmrRousesPrev != NULL) {
|
||||
g_swtmrRousesPrev->pstNext = NULL;
|
||||
cur = g_swtmrSortList;
|
||||
OsSwtimerInsert(&g_swtmrRouses, cur);
|
||||
g_swtmrSortList = g_swtmrRouses;
|
||||
}
|
||||
}
|
||||
if (g_swtmrSortList->uwCount == 0) {
|
||||
OsSwtmrTimeoutHandle();
|
||||
}
|
||||
|
||||
g_swtmrRouses = NULL;
|
||||
g_swtmrRousesPrev = NULL;
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
#else
|
||||
LITE_OS_SEC_TEXT VOID OsSwtmrAdjust(UINT32 sleepTime)
|
||||
{
|
||||
UINT32 tmpSleepTime = sleepTime;
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
if (g_swtmrSortList == NULL) {
|
||||
LOS_IntRestore(intSave);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tmpSleepTime > g_swtmrSortList->uwCount) {
|
||||
tmpSleepTime = g_swtmrSortList->uwCount;
|
||||
}
|
||||
|
||||
g_swtmrSortList->uwCount -= tmpSleepTime;
|
||||
|
||||
if (g_swtmrSortList->uwCount == 0) {
|
||||
OsSwtmrTimeoutHandle();
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
#endif
|
||||
|
||||
LITE_OS_SEC_TEXT UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr)
|
||||
{
|
||||
SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
|
||||
UINT32 tick = 0;
|
||||
return OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), &swtmr->stSortList);
|
||||
}
|
||||
|
||||
cur = g_swtmrSortList;
|
||||
while (1) {
|
||||
if (cur == NULL) {
|
||||
break;
|
||||
}
|
||||
tick += cur->uwCount;
|
||||
if (cur == swtmr) {
|
||||
break;
|
||||
}
|
||||
/*****************************************************************************
|
||||
Function : OsSwtmrInit
|
||||
Description : Initializes Software Timer
|
||||
Input : None
|
||||
Output : None
|
||||
Return : LOS_OK on success or error code on failure
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
|
||||
{
|
||||
UINT32 size;
|
||||
UINT16 index;
|
||||
UINT32 ret;
|
||||
|
||||
cur = cur->pstNext;
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
// Ignore the return code when matching CSEC rule 6.6(1).
|
||||
(VOID)memset_s((VOID *)g_swtmrAlignID, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT,
|
||||
0, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT);
|
||||
#endif
|
||||
|
||||
size = sizeof(SWTMR_CTRL_S) * LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
SWTMR_CTRL_S *swtmr = (SWTMR_CTRL_S *)LOS_MemAlloc(m_aucSysMem0, size);
|
||||
if (swtmr == NULL) {
|
||||
return LOS_ERRNO_SWTMR_NO_MEMORY;
|
||||
}
|
||||
// Ignore the return code when matching CSEC rule 6.6(3).
|
||||
(VOID)memset_s((VOID *)swtmr, size, 0, size);
|
||||
g_swtmrCBArray = swtmr;
|
||||
g_swtmrFreeList = swtmr;
|
||||
swtmr->usTimerID = 0;
|
||||
SWTMR_CTRL_S *temp = swtmr;
|
||||
swtmr++;
|
||||
for (index = 1; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) {
|
||||
swtmr->usTimerID = index;
|
||||
temp->pstNext = swtmr;
|
||||
temp = swtmr;
|
||||
}
|
||||
|
||||
return tick;
|
||||
ret = LOS_QueueCreate((CHAR *)NULL, OS_SWTMR_HANDLE_QUEUE_SIZE,
|
||||
&g_swtmrHandlerQueue, 0, sizeof(SwtmrHandlerItem));
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED;
|
||||
}
|
||||
|
||||
ret = OsSwtmrTaskCreate();
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_ERRNO_SWTMR_TASK_CREATE_FAILED;
|
||||
}
|
||||
|
||||
g_swtmrSortLinkList = OsGetSortLinkAttribute(OS_SORT_LINK_SWTMR);
|
||||
if (g_swtmrSortLinkList == NULL) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
ret = OsSortLinkInit(g_swtmrSortLinkList);
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
ret = OsSchedSwtmrScanRegister((SchedScan)OsSwtmrScan);
|
||||
if (ret != LOS_OK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, swtmr);
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -664,6 +479,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
|
|||
#endif
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
*swtmrId = swtmr->usTimerID;
|
||||
SET_SORTLIST_VALUE(&swtmr->stSortList, OS_SORT_LINK_INVALID_TIME);
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
@ -677,21 +493,15 @@ Return : LOS_OK on success or error code on failure
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT32 swtmrId)
|
||||
{
|
||||
SWTMR_CTRL_S *swtmr = NULL;
|
||||
UINTPTR intSave;
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
UINT32 times;
|
||||
UINT32 swtmrAlignIdIndex = 0;
|
||||
#endif
|
||||
UINT32 ret = LOS_OK;
|
||||
UINT16 swtmrCbId;
|
||||
|
||||
if (swtmrId >= OS_SWTMR_MAX_TIMERID) {
|
||||
return LOS_ERRNO_SWTMR_ID_INVALID;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
swtmrCbId = swtmrId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
swtmr = g_swtmrCBArray + swtmrCbId;
|
||||
SWTMR_CTRL_S *swtmr = g_swtmrCBArray + swtmrId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
if (swtmr->usTimerID != swtmrId) {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_SWTMR_ID_INVALID;
|
||||
|
@ -699,12 +509,11 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT32 swtmrId)
|
|||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
if ((swtmr->ucSensitive == OS_SWTMR_ALIGN_INSENSITIVE) && (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD)) {
|
||||
swtmrAlignIdIndex = swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
UINT32 swtmrAlignIdIndex = swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT;
|
||||
g_swtmrAlignID[swtmrAlignIdIndex].canAlign = 1;
|
||||
if ((swtmr->uwInterval % LOS_COMMON_DIVISOR) == 0) {
|
||||
g_swtmrAlignID[swtmrAlignIdIndex].canMultiple = 1;
|
||||
times = swtmr->uwInterval / (LOS_COMMON_DIVISOR);
|
||||
g_swtmrAlignID[swtmrAlignIdIndex].times = times;
|
||||
g_swtmrAlignID[swtmrAlignIdIndex].times = swtmr->uwInterval / LOS_COMMON_DIVISOR;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "los_interrupt.h"
|
||||
#include "los_memory.h"
|
||||
#include "los_mpu.h"
|
||||
#include "los_sched.h"
|
||||
#include "los_mux.h"
|
||||
#include "los_sem.h"
|
||||
#include "los_timer.h"
|
||||
|
@ -74,11 +75,9 @@ extern "C" {
|
|||
((NUMBER) = ((NUMBER) - 1))
|
||||
|
||||
|
||||
#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
|
||||
OS_TASK_STATUS_PEND | \
|
||||
OS_TASK_STATUS_SUSPEND | \
|
||||
OS_TASK_STATUS_EVENT | \
|
||||
OS_TASK_STATUS_PEND_QUEUE)
|
||||
#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
|
||||
OS_TASK_STATUS_PEND | \
|
||||
OS_TASK_STATUS_SUSPEND)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
|
@ -98,13 +97,6 @@ extern "C" {
|
|||
*/
|
||||
#define OS_TASK_STACK_TOP_OFFSET 4
|
||||
|
||||
LITE_OS_SEC_BSS LOS_DL_LIST *g_losPriorityQueueList = NULL;
|
||||
static LITE_OS_SEC_BSS UINT32 g_priqueueBitmap = 0;
|
||||
|
||||
#define PRIQUEUE_PRIOR0_BIT (UINT32)0x80000000
|
||||
#define OS_PRIORITY_QUEUE_PRIORITYNUM 32
|
||||
#define OS_TASK_STACK_PROTECT_SIZE 32
|
||||
|
||||
LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray = NULL;
|
||||
LITE_OS_SEC_BSS LosTask g_losTask;
|
||||
LITE_OS_SEC_BSS UINT16 g_losTaskLock;
|
||||
|
@ -113,7 +105,6 @@ LITE_OS_SEC_BSS UINT32 g_idleTaskID;
|
|||
LITE_OS_SEC_BSS UINT32 g_swtmrTaskID;
|
||||
LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_losFreeTask;
|
||||
LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_taskRecyleList;
|
||||
LITE_OS_SEC_BSS TaskSortLinkAttr g_taskSortLink;
|
||||
LITE_OS_SEC_BSS BOOL g_taskScheduled = FALSE;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
|
||||
|
@ -124,66 +115,6 @@ TSKSWITCHHOOK g_pfnUsrTskSwitchHook = NULL;
|
|||
TaskSwitchInfo g_taskSwitchInfo;
|
||||
#endif
|
||||
|
||||
STATIC UINT32 OsPriqueueInit(VOID)
|
||||
{
|
||||
UINT32 priority;
|
||||
UINT32 size = OS_PRIORITY_QUEUE_PRIORITYNUM * sizeof(LOS_DL_LIST);
|
||||
|
||||
g_losPriorityQueueList = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size);
|
||||
if (g_losPriorityQueueList == NULL) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
for (priority = 0; priority < OS_PRIORITY_QUEUE_PRIORITYNUM; ++priority) {
|
||||
LOS_ListInit(&g_losPriorityQueueList[priority]);
|
||||
}
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
STATIC VOID OsPriqueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority)
|
||||
{
|
||||
if (LOS_ListEmpty(&g_losPriorityQueueList[priority])) {
|
||||
g_priqueueBitmap |= (PRIQUEUE_PRIOR0_BIT >> priority);
|
||||
}
|
||||
|
||||
LOS_ListTailInsert(&g_losPriorityQueueList[priority], priqueueItem);
|
||||
}
|
||||
|
||||
STATIC VOID OsPriqueueDequeue(LOS_DL_LIST *priqueueItem)
|
||||
{
|
||||
LosTaskCB *runningTask = NULL;
|
||||
LOS_ListDelete(priqueueItem);
|
||||
|
||||
runningTask = LOS_DL_LIST_ENTRY(priqueueItem, LosTaskCB, pendList);
|
||||
if (LOS_ListEmpty(&g_losPriorityQueueList[runningTask->priority])) {
|
||||
g_priqueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runningTask->priority);
|
||||
}
|
||||
}
|
||||
|
||||
STATIC LOS_DL_LIST *OsPriqueueTop(VOID)
|
||||
{
|
||||
UINT32 priority;
|
||||
|
||||
if (g_priqueueBitmap != 0) {
|
||||
priority = CLZ(g_priqueueBitmap);
|
||||
return LOS_DL_LIST_FIRST(&g_losPriorityQueueList[priority]);
|
||||
}
|
||||
|
||||
return (LOS_DL_LIST *)NULL;
|
||||
}
|
||||
|
||||
STATIC UINT32 OsPriqueueSize(UINT32 priority)
|
||||
{
|
||||
UINT32 itemCnt = 0;
|
||||
LOS_DL_LIST *curPQNode = (LOS_DL_LIST *)NULL;
|
||||
|
||||
LOS_DL_LIST_FOR_EACH(curPQNode, &g_losPriorityQueueList[priority]) {
|
||||
++itemCnt;
|
||||
}
|
||||
|
||||
return itemCnt;
|
||||
}
|
||||
|
||||
STATIC_INLINE UINT32 OsCheckTaskIDValid(UINT32 taskID)
|
||||
{
|
||||
UINT32 ret = LOS_OK;
|
||||
|
@ -219,28 +150,6 @@ STATIC VOID OsRecyleFinishedTask(VOID)
|
|||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
UINT32 OsTaskNextSwitchTimeGet(VOID)
|
||||
{
|
||||
LosTaskCB *taskCB = NULL;
|
||||
UINT32 taskSortLinkTick = LOS_WAIT_FOREVER;
|
||||
LOS_DL_LIST *listObject = NULL;
|
||||
UINT32 tempTicks;
|
||||
UINT32 index;
|
||||
|
||||
for (index = 0; index < OS_TSK_SORTLINK_LEN; index++) {
|
||||
listObject = g_taskSortLink.sortLink + ((g_taskSortLink.cursor + index) % OS_TSK_SORTLINK_LEN);
|
||||
if (!LOS_ListEmpty(listObject)) {
|
||||
taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
|
||||
tempTicks = (index == 0) ? OS_TSK_SORTLINK_LEN : index;
|
||||
tempTicks += (UINT32)(UWROLLNUM((UINT32)taskCB->idxRollNum) * OS_TSK_SORTLINK_LEN);
|
||||
if (taskSortLinkTick > tempTicks) {
|
||||
taskSortLinkTick = tempTicks;
|
||||
}
|
||||
}
|
||||
}
|
||||
return taskSortLinkTick;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsIdleTask
|
||||
Description : Idle task.
|
||||
|
@ -252,154 +161,7 @@ LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
|
|||
{
|
||||
while (1) {
|
||||
OsRecyleFinishedTask();
|
||||
#if (LOSCFG_KERNEL_RUNSTOP == 1)
|
||||
HalEnterSleep(OS_SYS_NORMAL_SLEEP);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsTaskPriModify
|
||||
Description : Change task priority.
|
||||
Input : taskCB --- task control block
|
||||
priority --- priority
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_MINOR VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
|
||||
OsPriqueueDequeue(&taskCB->pendList);
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
taskCB->priority = priority;
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
|
||||
OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
|
||||
} else {
|
||||
taskCB->priority = priority;
|
||||
}
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsTaskAdd2TimerList
|
||||
Description : Add task to sorted delay list.
|
||||
Input : taskCB --- task control block
|
||||
timeout --- wait time, ticks
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout)
|
||||
{
|
||||
LosTaskCB *taskDelay = NULL;
|
||||
LOS_DL_LIST *listObject = NULL;
|
||||
UINT32 sortIndex;
|
||||
UINT32 rollNum;
|
||||
|
||||
sortIndex = timeout & OS_TSK_SORTLINK_MASK;
|
||||
rollNum = (timeout >> OS_TSK_SORTLINK_LOGLEN);
|
||||
(sortIndex > 0) ? 0 : (rollNum--);
|
||||
EVALUATE_L(taskCB->idxRollNum, rollNum);
|
||||
sortIndex = (sortIndex + g_taskSortLink.cursor);
|
||||
sortIndex = sortIndex & OS_TSK_SORTLINK_MASK;
|
||||
EVALUATE_H(taskCB->idxRollNum, sortIndex);
|
||||
listObject = g_taskSortLink.sortLink + sortIndex;
|
||||
if (listObject->pstNext == listObject) {
|
||||
LOS_ListTailInsert(listObject, &taskCB->timerList);
|
||||
} else {
|
||||
taskDelay = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
|
||||
do {
|
||||
if (UWROLLNUM(taskDelay->idxRollNum) <= UWROLLNUM(taskCB->idxRollNum)) {
|
||||
UWROLLNUMSUB(taskCB->idxRollNum, taskDelay->idxRollNum);
|
||||
} else {
|
||||
UWROLLNUMSUB(taskDelay->idxRollNum, taskCB->idxRollNum);
|
||||
break;
|
||||
}
|
||||
|
||||
taskDelay = LOS_DL_LIST_ENTRY(taskDelay->timerList.pstNext, LosTaskCB, timerList);
|
||||
} while (&taskDelay->timerList != (listObject));
|
||||
|
||||
LOS_ListTailInsert(&taskDelay->timerList, &taskCB->timerList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LITE_OS_SEC_TEXT VOID OsTimerListDelete(LosTaskCB *taskCB)
|
||||
{
|
||||
LOS_DL_LIST *listObject = NULL;
|
||||
LosTaskCB *nextTask = NULL;
|
||||
UINT32 sortIndex;
|
||||
|
||||
sortIndex = UWSORTINDEX(taskCB->idxRollNum);
|
||||
listObject = g_taskSortLink.sortLink + sortIndex;
|
||||
|
||||
if (listObject != taskCB->timerList.pstNext) {
|
||||
nextTask = LOS_DL_LIST_ENTRY(taskCB->timerList.pstNext, LosTaskCB, timerList);
|
||||
UWROLLNUMADD(nextTask->idxRollNum, taskCB->idxRollNum);
|
||||
}
|
||||
|
||||
LOS_ListDelete(&taskCB->timerList);
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT VOID OsTaskScan(VOID)
|
||||
{
|
||||
LosTaskCB *taskCB = NULL;
|
||||
BOOL needSchedule = FALSE;
|
||||
LOS_DL_LIST *listObject = NULL;
|
||||
UINT16 tempStatus;
|
||||
UINTPTR intSave;
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
g_taskSortLink.cursor = (g_taskSortLink.cursor + 1) % OS_TSK_SORTLINK_LEN;
|
||||
listObject = g_taskSortLink.sortLink + g_taskSortLink.cursor;
|
||||
if (listObject->pstNext == listObject) {
|
||||
LOS_IntRestore(intSave);
|
||||
return;
|
||||
}
|
||||
|
||||
for (taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
|
||||
&taskCB->timerList != (listObject);) {
|
||||
tempStatus = taskCB->taskStatus;
|
||||
if (UWROLLNUM(taskCB->idxRollNum) > 0) {
|
||||
UWROLLNUMDEC(taskCB->idxRollNum);
|
||||
break;
|
||||
}
|
||||
|
||||
LOS_ListDelete(&taskCB->timerList);
|
||||
if (tempStatus & OS_TASK_STATUS_PEND) {
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND);
|
||||
LOS_ListDelete(&taskCB->pendList);
|
||||
taskCB->taskSem = NULL;
|
||||
taskCB->taskMux = NULL;
|
||||
}
|
||||
else if (tempStatus & OS_TASK_STATUS_EVENT) {
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_EVENT);
|
||||
}
|
||||
else if (tempStatus & OS_TASK_STATUS_PEND_QUEUE) {
|
||||
LOS_ListDelete(&taskCB->pendList);
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND_QUEUE);
|
||||
} else {
|
||||
taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY);
|
||||
}
|
||||
|
||||
if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
|
||||
OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
|
||||
needSchedule = TRUE;
|
||||
}
|
||||
|
||||
if (listObject->pstNext == listObject) {
|
||||
break;
|
||||
}
|
||||
|
||||
taskCB = LOS_DL_LIST_ENTRY(listObject->pstNext, LosTaskCB, timerList);
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
if (needSchedule) {
|
||||
LOS_Schedule();
|
||||
HalEnterSleep(OS_SYS_DEEP_SLEEP);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -419,19 +181,12 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsConvertTskStatus(UINT16 taskStatus)
|
|||
} else if (taskStatus & OS_TASK_STATUS_DELAY) {
|
||||
return (UINT8 *)"Delay";
|
||||
} else if (taskStatus & OS_TASK_STATUS_PEND) {
|
||||
if (taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
return (UINT8 *)"PendTimeOut";
|
||||
if (taskStatus & OS_TASK_STATUS_PEND_TIME) {
|
||||
return (UINT8 *)"PendTime";
|
||||
}
|
||||
|
||||
return (UINT8 *)"Pend";
|
||||
} else if (taskStatus & OS_TASK_STATUS_SUSPEND) {
|
||||
return (UINT8 *)"Suspend";
|
||||
} else if (taskStatus & OS_TASK_STATUS_PEND_QUEUE) {
|
||||
if (taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
return (UINT8 *)"QueuePendTimeOut";
|
||||
}
|
||||
|
||||
return (UINT8 *)"QueuePend";
|
||||
}
|
||||
|
||||
return (UINT8 *)"Impossible";
|
||||
|
@ -594,8 +349,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
|
|||
{
|
||||
UINT32 size;
|
||||
UINT32 index;
|
||||
LOS_DL_LIST *listObject = NULL;
|
||||
UINT32 queueResult;
|
||||
|
||||
size = (g_taskMaxNum + 1) * sizeof(LosTaskCB);
|
||||
g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size);
|
||||
|
@ -619,28 +372,9 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
|
|||
g_losTask.runTask->taskID = index;
|
||||
g_losTask.runTask->taskStatus = (OS_TASK_STATUS_UNUSED | OS_TASK_STATUS_RUNNING);
|
||||
g_losTask.runTask->priority = OS_TASK_PRIORITY_LOWEST + 1;
|
||||
queueResult = OsPriqueueInit();
|
||||
if (queueResult == LOS_NOK) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, g_taskCBArray);
|
||||
return LOS_ERRNO_TSK_NO_MEMORY;
|
||||
}
|
||||
|
||||
size = sizeof(LOS_DL_LIST) * OS_TSK_SORTLINK_LEN;
|
||||
listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size);
|
||||
if (listObject == NULL) {
|
||||
(VOID)LOS_MemFree(m_aucSysMem0, g_taskCBArray);
|
||||
return LOS_ERRNO_TSK_NO_MEMORY;
|
||||
}
|
||||
|
||||
// Ignore the return code when matching CSEC rule 6.6(3).
|
||||
(VOID)memset_s((VOID *)listObject, size, 0, size);
|
||||
g_taskSortLink.sortLink = listObject;
|
||||
g_taskSortLink.cursor = 0;
|
||||
for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {
|
||||
LOS_ListInit(listObject);
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
g_idleTaskID = OS_INVALID;
|
||||
return OsSchedInit();
|
||||
}
|
||||
|
||||
|
||||
|
@ -661,12 +395,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
|
|||
taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;
|
||||
taskInitParam.pcName = "IdleCore000";
|
||||
taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST;
|
||||
retVal = LOS_TaskCreate(&g_idleTaskID, &taskInitParam);
|
||||
retVal = LOS_TaskCreateOnly(&g_idleTaskID, &taskInitParam);
|
||||
|
||||
if (retVal != LOS_OK) {
|
||||
return retVal;
|
||||
}
|
||||
|
||||
OsSchedSetIdleTaskSchedPartam(OS_TCB_FROM_TID(g_idleTaskID));
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
@ -694,10 +429,11 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT UINT32 LOS_NextTaskIDGet(VOID)
|
||||
{
|
||||
if (g_losTask.newTask == NULL) {
|
||||
return LOS_ERRNO_TSK_ID_INVALID;
|
||||
}
|
||||
return g_losTask.newTask->taskID;
|
||||
UINTPTR intSave = LOS_IntLock();
|
||||
UINT32 taskID = OsGetTopTask()->taskID;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
return taskID;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -866,11 +602,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskMonInit(VOID)
|
|||
LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
|
||||
{
|
||||
UINT32 retVal;
|
||||
LosTaskCB *taskCB = NULL;
|
||||
|
||||
OS_TASK_ID_CHECK(taskID);
|
||||
|
||||
taskCB = OS_TCB_FROM_TID(taskID);
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
|
||||
|
||||
(VOID)taskCB->taskEntry(taskCB->arg);
|
||||
|
||||
|
@ -928,11 +660,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsNewTaskInit(LosTaskCB *taskCB, TSK_INIT_PARAM_S *
|
|||
taskCB->taskMux = NULL;
|
||||
taskCB->taskStatus = OS_TASK_STATUS_SUSPEND;
|
||||
taskCB->priority = taskInitParam->usTaskPrio;
|
||||
taskCB->timeSlice = 0;
|
||||
taskCB->waitTimes = 0;
|
||||
taskCB->taskEntry = taskInitParam->pfnTaskEntry;
|
||||
taskCB->event.uwEventID = OS_NULL_INT;
|
||||
taskCB->eventMask = 0;
|
||||
taskCB->taskName = taskInitParam->pcName;
|
||||
taskCB->msg = NULL;
|
||||
SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
@ -1001,22 +736,6 @@ LOS_ERREND:
|
|||
return retVal;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : OsTaskSchedule
|
||||
Description : Function to check task schedule and do real task schedule.
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
**************************************************************************** */
|
||||
VOID OsTaskSchedule(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
|
||||
OsTaskSwitchCheck();
|
||||
#endif
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN);
|
||||
HalTaskSchedule();
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : LOS_TaskCreate
|
||||
Description : Create a task
|
||||
|
@ -1037,28 +756,18 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *ta
|
|||
taskCB = OS_TCB_FROM_TID(*taskID);
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND);
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_CPUP == 1)
|
||||
g_cpup[taskCB->taskID].cpupID = taskCB->taskID;
|
||||
g_cpup[taskCB->taskID].status = taskCB->taskStatus;
|
||||
#endif
|
||||
|
||||
OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
|
||||
g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
|
||||
OsSchedTaskEnQueue(taskCB);
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
if ((g_taskScheduled) && (g_losTaskLock == 0)) {
|
||||
if (g_losTask.runTask != g_losTask.newTask) {
|
||||
if (LOS_CHECK_SCHEDULE) {
|
||||
LOS_IntRestore(intSave);
|
||||
OsTaskSchedule();
|
||||
return LOS_OK;
|
||||
}
|
||||
}
|
||||
if (g_taskScheduled) {
|
||||
LOS_Schedule();
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
@ -1094,15 +803,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
|
|||
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND);
|
||||
if (!(taskCB->taskStatus & OS_CHECK_TASK_BLOCK)) {
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
|
||||
OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
|
||||
OsSchedTaskEnQueue(taskCB);
|
||||
if (g_taskScheduled) {
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
return LOS_OK;
|
||||
}
|
||||
g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
@ -1151,8 +857,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID)
|
|||
}
|
||||
|
||||
if (tempStatus & OS_TASK_STATUS_READY) {
|
||||
OsPriqueueDequeue(&taskCB->pendList);
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
OsSchedTaskDeQueue(taskCB);
|
||||
}
|
||||
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_SUSPEND;
|
||||
|
@ -1176,7 +881,7 @@ LITE_OS_SEC_TEXT_INIT STATIC_INLINE VOID OsRunningTaskDelete(UINT32 taskID, LosT
|
|||
LOS_ListTailInsert(&g_taskRecyleList, &taskCB->pendList);
|
||||
g_losTask.runTask = &g_taskCBArray[g_taskMaxNum];
|
||||
g_losTask.runTask->taskID = taskID;
|
||||
g_losTask.runTask->taskStatus = taskCB->taskStatus;
|
||||
g_losTask.runTask->taskStatus = taskCB->taskStatus | OS_TASK_STATUS_RUNNING;
|
||||
g_losTask.runTask->topOfStack = taskCB->topOfStack;
|
||||
g_losTask.runTask->taskName = taskCB->taskName;
|
||||
}
|
||||
|
@ -1212,32 +917,19 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
|
|||
}
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB);
|
||||
OsSchedTaskExit(taskCB);
|
||||
|
||||
if ((taskCB->taskStatus) & OS_TASK_STATUS_READY) {
|
||||
OsPriqueueDequeue(&taskCB->pendList);
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
} else if (((taskCB->taskStatus) & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_PEND_QUEUE))) {
|
||||
LOS_ListDelete(&taskCB->pendList);
|
||||
}
|
||||
|
||||
if ((taskCB->taskStatus) & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_TIMEOUT)) {
|
||||
OsTimerListDelete(taskCB);
|
||||
}
|
||||
|
||||
taskCB->taskStatus &= (~(OS_TASK_STATUS_SUSPEND));
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_UNUSED;
|
||||
taskCB->event.uwEventID = OS_NULL_INT;
|
||||
taskCB->eventMask = 0;
|
||||
#if (LOSCFG_BASE_CORE_CPUP == 1)
|
||||
// Ignore the return code when matching CSEC rule 6.6(4).
|
||||
(VOID)memset_s((VOID *)&g_cpup[taskCB->taskID], sizeof(OsCpupCB), 0, sizeof(OsCpupCB));
|
||||
#endif
|
||||
g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
OsRunningTaskDelete(taskID, taskCB);
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
OsRunningTaskDelete(taskID, taskCB);
|
||||
LOS_IntRestore(intSave);
|
||||
OsTaskSchedule();
|
||||
LOS_Schedule();
|
||||
return LOS_OK;
|
||||
} else {
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
|
@ -1279,12 +971,9 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
|
|||
return LOS_TaskYield();
|
||||
} else {
|
||||
intSave = LOS_IntLock();
|
||||
OsPriqueueDequeue(&(g_losTask.runTask->pendList));
|
||||
g_losTask.runTask->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
OsTaskAdd2TimerList((LosTaskCB *)g_losTask.runTask, tick);
|
||||
g_losTask.runTask->taskStatus |= OS_TASK_STATUS_DELAY;
|
||||
LOS_IntRestore(intSave);
|
||||
OsSchedDelay(g_losTask.runTask, tick);
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, g_losTask.runTask);
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
}
|
||||
|
||||
|
@ -1345,19 +1034,8 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
|
|||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
/* delete the task and insert with right priority into ready queue */
|
||||
isReady = (tempStatus & OS_TASK_STATUS_READY);
|
||||
if (isReady) {
|
||||
OsPriqueueDequeue(&taskCB->pendList);
|
||||
taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
taskCB->priority = taskPrio;
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
|
||||
OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
|
||||
} else {
|
||||
taskCB->priority = taskPrio;
|
||||
}
|
||||
|
||||
isReady = OsSchedModifyTaskSchedParam(taskCB, taskPrio);
|
||||
LOS_IntRestore(intSave);
|
||||
/* delete the task and insert with right priority into ready queue */
|
||||
if (isReady) {
|
||||
|
@ -1369,58 +1047,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
|
|||
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio)
|
||||
{
|
||||
UINT32 retVal;
|
||||
retVal = LOS_TaskPriSet(g_losTask.runTask->taskID, taskPrio);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Function : OsTaskWait
|
||||
Description : pend the running task in a list
|
||||
Input : pendingList -- The pending list
|
||||
taskStatus -- The status need to be converted to
|
||||
timeout -- Expiry time
|
||||
Output : None
|
||||
Return : None
|
||||
**************************************************************************/
|
||||
VOID OsTaskWait(LOS_DL_LIST *pendingList, UINT32 taskStatus, UINT32 timeout)
|
||||
{
|
||||
LosTaskCB *runTask = NULL;
|
||||
LOS_DL_LIST *pendObj = NULL;
|
||||
|
||||
runTask = g_losTask.runTask;
|
||||
OsPriqueueDequeue(&runTask->pendList);
|
||||
runTask->taskStatus &= (~OS_TASK_STATUS_READY);
|
||||
pendObj = &runTask->pendList;
|
||||
runTask->taskStatus |= taskStatus;
|
||||
LOS_ListTailInsert(pendingList, pendObj);
|
||||
if (timeout != LOS_WAIT_FOREVER) {
|
||||
runTask->taskStatus |= OS_TASK_STATUS_TIMEOUT;
|
||||
OsTaskAdd2TimerList((LosTaskCB *)runTask, timeout);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Function : OsTaskWake
|
||||
Description : delete the task from pendlist and also add to the priqueue
|
||||
Input : resumedTask -- resumed task
|
||||
: taskStatus -- the status to be unset
|
||||
Output : resumedTask -- resumed task
|
||||
Return : None
|
||||
**************************************************************************/
|
||||
VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus)
|
||||
{
|
||||
LOS_ListDelete(&resumedTask->pendList);
|
||||
resumedTask->taskStatus &= (~taskStatus);
|
||||
if (resumedTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
|
||||
OsTimerListDelete(resumedTask);
|
||||
resumedTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
|
||||
}
|
||||
if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) {
|
||||
resumedTask->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, resumedTask);
|
||||
OsPriqueueEnqueue(&resumedTask->pendList, resumedTask->priority);
|
||||
}
|
||||
return LOS_TaskPriSet(g_losTask.runTask->taskID, taskPrio);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -1432,29 +1059,10 @@ VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus)
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
|
||||
{
|
||||
UINT32 taskCount;
|
||||
UINTPTR intSave;
|
||||
|
||||
if (g_losTask.runTask->taskID >= g_taskMaxNum) {
|
||||
return LOS_ERRNO_TSK_ID_INVALID;
|
||||
}
|
||||
|
||||
if (!(g_losTask.runTask->taskStatus & OS_TASK_STATUS_READY)) {
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
taskCount = OsPriqueueSize(g_losTask.runTask->priority);
|
||||
if (taskCount > 1) {
|
||||
LOS_ListDelete(&(g_losTask.runTask->pendList));
|
||||
g_losTask.runTask->taskStatus |= OS_TASK_STATUS_READY;
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, g_losTask.runTask);
|
||||
OsPriqueueEnqueue(&(g_losTask.runTask->pendList), g_losTask.runTask->priority);
|
||||
} else {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK;
|
||||
}
|
||||
|
||||
OsSchedYield();
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
return LOS_OK;
|
||||
|
@ -1642,10 +1250,7 @@ LITE_OS_SEC_TEXT_MINOR BOOL LOS_TaskIsRunning(VOID)
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT UINT32 LOS_NewTaskIDGet(VOID)
|
||||
{
|
||||
if (g_losTask.newTask == NULL) {
|
||||
return LOS_ERRNO_TSK_ID_INVALID;
|
||||
}
|
||||
return g_losTask.newTask->taskID;
|
||||
return LOS_NextTaskIDGet();
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -1676,71 +1281,6 @@ LITE_OS_SEC_TEXT CHAR* LOS_TaskNameGet(UINT32 taskID)
|
|||
return taskCB->taskName;
|
||||
}
|
||||
|
||||
/* ****************************************************************************
|
||||
Function : LOS_Schedule
|
||||
Description : Function to determine whether task scheduling is required.
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
**************************************************************************** */
|
||||
VOID LOS_Schedule(VOID)
|
||||
{
|
||||
UINTPTR intSave;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
/* Find the highest task */
|
||||
g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
|
||||
/* In case that running is not highest then reschedule */
|
||||
if (g_losTask.runTask != g_losTask.newTask) {
|
||||
if (LOS_CHECK_SCHEDULE) {
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_EXITTOSCHEDULER);
|
||||
OsTaskSchedule();
|
||||
return;
|
||||
}
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
|
||||
LITE_OS_SEC_BSS OsTaskRobin g_taskTimeSlice;
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsTimesliceInit
|
||||
Description : Initialztion Timeslice
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_INIT VOID OsTimesliceInit(VOID)
|
||||
{
|
||||
g_taskTimeSlice.task = (LosTaskCB *)NULL;
|
||||
g_taskTimeSlice.tout = LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsTimesliceCheck
|
||||
Description : check Timeslice
|
||||
Input : None
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
|
||||
{
|
||||
if (g_taskTimeSlice.task != g_losTask.runTask) {
|
||||
g_taskTimeSlice.task = g_losTask.runTask;
|
||||
g_taskTimeSlice.time = ((UINT16)g_ullTickCount + g_taskTimeSlice.tout) - 1;
|
||||
}
|
||||
|
||||
if (g_taskTimeSlice.time == (UINT16)g_ullTickCount) {
|
||||
g_taskTimeSlice.task = (LosTaskCB *)NULL;
|
||||
if (LOS_TaskYield() != LOS_OK) {
|
||||
PRINT_INFO("%s, %d\n", __FUNCTION__, __LINE__);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 mSecs)
|
||||
{
|
||||
UINT32 interval;
|
||||
|
|
|
@ -30,9 +30,10 @@
|
|||
*/
|
||||
|
||||
#include "los_tick.h"
|
||||
#include "los_config.h"
|
||||
#include "los_task.h"
|
||||
#include "los_swtmr.h"
|
||||
#include "los_config.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
|
@ -40,7 +41,6 @@ extern "C" {
|
|||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
LITE_OS_SEC_BSS UINT64 g_ullTickCount;
|
||||
LITE_OS_SEC_BSS UINT32 g_ticksPerSec;
|
||||
LITE_OS_SEC_BSS UINT32 g_uwCyclePerSec;
|
||||
LITE_OS_SEC_BSS UINT32 g_cyclesPerTick;
|
||||
|
@ -52,21 +52,15 @@ extern VOID platform_tick_handler(VOID);
|
|||
|
||||
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||
OsSchedUpdateTimeBase();
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1)
|
||||
platform_tick_handler();
|
||||
#endif
|
||||
|
||||
g_ullTickCount++;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
|
||||
OsTimesliceCheck();
|
||||
#endif
|
||||
|
||||
OsTaskScan(); // task timeout scan
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR == 1)
|
||||
(VOID)OsSwtmrScan();
|
||||
#endif
|
||||
LOS_SchedTickHandler();
|
||||
}
|
||||
|
||||
UINT32 LOS_SysClockGet(VOID)
|
||||
|
@ -84,7 +78,7 @@ Return : current tick
|
|||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
|
||||
{
|
||||
return g_ullTickCount;
|
||||
return OsGetCurrTimeCycle() / OS_CYCLE_PER_TICK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
|
@ -220,7 +220,7 @@
|
|||
|
||||
<Group>
|
||||
<GroupName>liteos-m</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
|
@ -500,6 +500,30 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\src\los_sched.c</PathWithFileName>
|
||||
<FilenameWithoutPath>los_sched.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\src\los_sortlink.c</PathWithFileName>
|
||||
<FilenameWithoutPath>los_sortlink.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
|
@ -510,7 +534,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -522,7 +546,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -534,7 +558,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -548,13 +572,13 @@
|
|||
|
||||
<Group>
|
||||
<GroupName>component</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -566,7 +590,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -578,7 +602,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -590,7 +614,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -602,7 +626,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -614,7 +638,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -626,7 +650,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -638,7 +662,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -650,7 +674,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
|
@ -537,6 +537,16 @@
|
|||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\utils\los_debug.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>los_sched.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\kernel\src\los_sched.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>los_sortlink.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\kernel\src\los_sortlink.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
|
|
@ -48,6 +48,9 @@ extern "C" {
|
|||
#define OS_SYS_CLOCK 24000000
|
||||
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
|
||||
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
|
||||
#define LOSCFG_BASE_CORE_TICK_WTIMER 0
|
||||
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX 0xFFFFFF
|
||||
|
||||
/*=============================================================================
|
||||
Hardware interrupt module configuration
|
||||
=============================================================================*/
|
||||
|
@ -61,7 +64,7 @@ extern "C" {
|
|||
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
|
||||
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE 1
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
|
||||
/*=============================================================================
|
||||
Semaphore module configuration
|
||||
=============================================================================*/
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "los_interrupt.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_compiler.h"
|
||||
#include "los_sched.h"
|
||||
#include "iar_stm32f429ig_fire-challenger.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -43,48 +44,123 @@ extern "C" {
|
|||
#endif /* __cpluscplus */
|
||||
#endif /* __cpluscplus */
|
||||
|
||||
VOID taskSampleEntry2(VOID)
|
||||
STATIC VOID TaskSampleEntry2(VOID)
|
||||
{
|
||||
while(1) {
|
||||
LOS_TaskDelay(10000);
|
||||
printf("taskSampleEntry2 running...\n");
|
||||
while (1) {
|
||||
printf("TaskSampleEntry2 running...\n");
|
||||
LOS_TaskDelay(10000); /* 10 Seconds */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID taskSampleEntry1(VOID)
|
||||
STATIC VOID TaskSampleEntry1(VOID)
|
||||
{
|
||||
while(1) {
|
||||
LOS_TaskDelay(2000);
|
||||
printf("taskSampleEntry1 running...\n");
|
||||
while (1) {
|
||||
printf("TaskSampleEntry1 running...\n");
|
||||
LOS_TaskDelay(2000); /* 2 Seconds */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
UINT32 taskSample(VOID)
|
||||
WEAK VOID TaskSample(VOID)
|
||||
{
|
||||
UINT32 uwRet;
|
||||
UINT32 taskID1,taskID2;
|
||||
TSK_INIT_PARAM_S stTask1={0};
|
||||
stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry1;
|
||||
stTask1.uwStackSize = 0X1000;
|
||||
stTask1.pcName = "taskSampleEntry1";
|
||||
stTask1.usTaskPrio = 6;
|
||||
uwRet = LOS_TaskCreate(&taskID1, &stTask1);
|
||||
UINT32 uwRet;
|
||||
UINT32 taskID1;
|
||||
UINT32 taskID2;
|
||||
TSK_INIT_PARAM_S stTask = {0};
|
||||
|
||||
stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry1;
|
||||
stTask.uwStackSize = 0x1000;
|
||||
stTask.pcName = "TaskSampleEntry1";
|
||||
stTask.usTaskPrio = 6; /* Os task priority is 6 */
|
||||
uwRet = LOS_TaskCreate(&taskID1, &stTask);
|
||||
if (uwRet != LOS_OK) {
|
||||
printf("task1 create failed\n");
|
||||
printf("Task1 create failed\n");
|
||||
}
|
||||
|
||||
stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry2;
|
||||
stTask1.uwStackSize = 0X1000;
|
||||
stTask1.pcName = "taskSampleEntry2";
|
||||
stTask1.usTaskPrio = 7;
|
||||
uwRet = LOS_TaskCreate(&taskID2, &stTask1);
|
||||
stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry2;
|
||||
stTask.uwStackSize = 0x1000;
|
||||
stTask.pcName = "TaskSampleEntry2";
|
||||
stTask.usTaskPrio = 7; /* Os task priority is 7 */
|
||||
uwRet = LOS_TaskCreate(&taskID2, &stTask);
|
||||
if (uwRet != LOS_OK) {
|
||||
printf("task2 create failed\n");
|
||||
printf("Task2 create failed\n");
|
||||
}
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
#define SLEEP_TIME_CYCLE 90000000UL
|
||||
#define SLEEP_TIME_MAX_RESPONSE_TIME ((UINT32)-1)
|
||||
#define TIM2_INI_PRIORITY 3
|
||||
unsigned int g_sleepTimePeriod;
|
||||
TIM_TimeBaseInitTypeDef g_timerInit = { 0 };
|
||||
unsigned long long GetSleepTimeNs(VOID)
|
||||
{
|
||||
unsigned long long currTime = g_sleepTimePeriod + TIM_GetCounter(TIM2);
|
||||
currTime = (currTime * OS_SYS_NS_PER_SECOND) / SLEEP_TIME_CYCLE;
|
||||
return currTime;
|
||||
}
|
||||
|
||||
void SleepTimerStop(void)
|
||||
{
|
||||
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
|
||||
TIM_DeInit(TIM2);
|
||||
TIM_Cmd(TIM2, DISABLE);
|
||||
}
|
||||
|
||||
void SleepTimerStart(unsigned long long sleepTimeNs)
|
||||
{
|
||||
unsigned long long period = (sleepTimeNs * SLEEP_TIME_CYCLE) / OS_SYS_NS_PER_SECOND;
|
||||
if (period > SLEEP_TIME_MAX_RESPONSE_TIME) {
|
||||
period = SLEEP_TIME_MAX_RESPONSE_TIME;
|
||||
}
|
||||
|
||||
g_timerInit.TIM_Period = period;
|
||||
g_sleepTimePeriod = period;
|
||||
TIM_TimeBaseInit(TIM2, &g_timerInit);
|
||||
|
||||
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
|
||||
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
|
||||
|
||||
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
|
||||
TIM_Cmd(TIM2, ENABLE);
|
||||
}
|
||||
|
||||
void TIM2_IRQHandler(void)
|
||||
{
|
||||
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
|
||||
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
|
||||
|
||||
SleepTimerStop();
|
||||
}
|
||||
|
||||
unsigned int SleepTimerInit(void)
|
||||
{
|
||||
NVIC_InitTypeDef nvic = { 0 };
|
||||
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
||||
TIM_TimeBaseStructInit(&g_timerInit);
|
||||
g_timerInit.TIM_Period = SLEEP_TIME_MAX_RESPONSE_TIME;
|
||||
g_timerInit.TIM_Prescaler = 0;
|
||||
TIM_TimeBaseInit(TIM2, &g_timerInit);
|
||||
|
||||
nvic.NVIC_IRQChannel = TIM2_IRQn;
|
||||
nvic.NVIC_IRQChannelPreemptionPriority = TIM2_INI_PRIORITY;
|
||||
nvic.NVIC_IRQChannelSubPriority = 0;
|
||||
nvic.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&nvic);
|
||||
|
||||
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
|
||||
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
|
||||
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
|
||||
UINT32 ret = HalHwiCreate(TIM2_IRQn, TIM2_INI_PRIORITY, 0, TIM2_IRQHandler, 0);
|
||||
if (ret != LOS_OK) {
|
||||
printf("SleepTimerInit create time2 irq failed! ERROR: 0x%x\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
Function : main
|
||||
|
@ -103,10 +179,19 @@ LITE_OS_SEC_TEXT_INIT int main(void)
|
|||
|
||||
ret = LOS_KernelInit();
|
||||
if (ret == LOS_OK) {
|
||||
taskSample();
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
ret = LOS_SchedSleepInit(SleepTimerInit, SleepTimerStart, SleepTimerStop, GetSleepTimeNs);
|
||||
if (ret != LOS_OK) {
|
||||
goto EXIT;
|
||||
}
|
||||
#endif
|
||||
TaskSample();
|
||||
LOS_Start();
|
||||
}
|
||||
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
EXIT:
|
||||
#endif
|
||||
while (1) {
|
||||
__asm volatile("wfi");
|
||||
}
|
||||
|
|
56
targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp
Executable file → Normal file
56
targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp
Executable file → Normal file
|
@ -11,7 +11,7 @@
|
|||
<name>General</name>
|
||||
<archiveVersion>3</archiveVersion>
|
||||
<data>
|
||||
<version>30</version>
|
||||
<version>31</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>1</debug>
|
||||
<option>
|
||||
|
@ -66,7 +66,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OGLastSavedByProductVersion</name>
|
||||
<state>8.22.1.15696</state>
|
||||
<state>8.32.1.18618</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>GeneralEnableMisra</name>
|
||||
|
@ -112,7 +112,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>RTConfigPath2</name>
|
||||
<state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
|
||||
<state>$TOOLKIT_DIR$\inc\c\DLib_Config_Full.h</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>GBECoreSlave</name>
|
||||
|
@ -204,13 +204,18 @@
|
|||
<name>TrustZone</name>
|
||||
<state>0</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>TrustZoneModes</name>
|
||||
<version>0</version>
|
||||
<state>0</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
<name>ICCARM</name>
|
||||
<archiveVersion>2</archiveVersion>
|
||||
<data>
|
||||
<version>34</version>
|
||||
<version>35</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>1</debug>
|
||||
<option>
|
||||
|
@ -472,6 +477,10 @@
|
|||
<name>IccRTTI2</name>
|
||||
<state>0</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OICompilerExtraOption</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
|
@ -692,7 +701,7 @@
|
|||
<name>ILINK</name>
|
||||
<archiveVersion>0</archiveVersion>
|
||||
<data>
|
||||
<version>20</version>
|
||||
<version>22</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>1</debug>
|
||||
<option>
|
||||
|
@ -1004,6 +1013,14 @@
|
|||
<name>IlinkLocaleSelect</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>IlinkTrustzoneImportLibraryOut</name>
|
||||
<state>###Unitialized###</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OILinkExtraOption</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
|
@ -1043,7 +1060,7 @@
|
|||
<name>General</name>
|
||||
<archiveVersion>3</archiveVersion>
|
||||
<data>
|
||||
<version>30</version>
|
||||
<version>31</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>0</debug>
|
||||
<option>
|
||||
|
@ -1236,13 +1253,18 @@
|
|||
<name>TrustZone</name>
|
||||
<state>0</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>TrustZoneModes</name>
|
||||
<version>0</version>
|
||||
<state>0</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
<name>ICCARM</name>
|
||||
<archiveVersion>2</archiveVersion>
|
||||
<data>
|
||||
<version>34</version>
|
||||
<version>35</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>0</debug>
|
||||
<option>
|
||||
|
@ -1490,6 +1512,10 @@
|
|||
<name>IccRTTI2</name>
|
||||
<state>0</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OICompilerExtraOption</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
|
@ -1710,7 +1736,7 @@
|
|||
<name>ILINK</name>
|
||||
<archiveVersion>0</archiveVersion>
|
||||
<data>
|
||||
<version>20</version>
|
||||
<version>22</version>
|
||||
<wantNonLocal>1</wantNonLocal>
|
||||
<debug>0</debug>
|
||||
<option>
|
||||
|
@ -2022,6 +2048,14 @@
|
|||
<name>IlinkLocaleSelect</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>IlinkTrustzoneImportLibraryOut</name>
|
||||
<state>###Unitialized###</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OILinkExtraOption</name>
|
||||
<state>1</state>
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
<settings>
|
||||
|
@ -2116,9 +2150,15 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_queue.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sched.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sem.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sortlink.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_swtmr.c</name>
|
||||
</file>
|
||||
|
|
|
@ -2431,9 +2431,15 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_queue.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sched.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sem.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_sortlink.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\kernel\src\los_swtmr.c</name>
|
||||
</file>
|
||||
|
|
|
@ -48,14 +48,17 @@ extern "C" {
|
|||
/*=============================================================================
|
||||
System clock module configuration
|
||||
=============================================================================*/
|
||||
#define OS_SYS_CLOCK 64000000
|
||||
#define OS_SYS_CLOCK SystemCoreClock
|
||||
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
|
||||
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
|
||||
#define LOSCFG_BASE_CORE_TICK_WTIMER 0
|
||||
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX SysTick_LOAD_RELOAD_Msk
|
||||
|
||||
/*=============================================================================
|
||||
Hardware interrupt module configuration
|
||||
=============================================================================*/
|
||||
#define LOSCFG_PLATFORM_HWI 1
|
||||
#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 0
|
||||
#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 1
|
||||
#define LOSCFG_PLATFORM_HWI_LIMIT 128
|
||||
/*=============================================================================
|
||||
Task module configuration
|
||||
|
@ -65,7 +68,7 @@ extern "C" {
|
|||
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
|
||||
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE 1
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
|
||||
/*=============================================================================
|
||||
Semaphore module configuration
|
||||
=============================================================================*/
|
||||
|
@ -101,11 +104,12 @@ extern "C" {
|
|||
============================================================================= */
|
||||
#define LOSCFG_KERNEL_PRINTF 1
|
||||
|
||||
#define LOSCFG_BASE_CORE_SCHED_SLEEP 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* _TARGET_CONFIG_H */
|
||||
|
|
|
@ -51,6 +51,9 @@ extern "C" {
|
|||
#define OS_SYS_CLOCK 96000000
|
||||
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
|
||||
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
|
||||
#define LOSCFG_BASE_CORE_TICK_WTIMER 0
|
||||
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX SysTick_LOAD_RELOAD_Msk
|
||||
|
||||
/*=============================================================================
|
||||
Hardware interrupt module configuration
|
||||
=============================================================================*/
|
||||
|
@ -64,7 +67,7 @@ extern "C" {
|
|||
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
|
||||
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE 1
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
|
||||
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
|
||||
/*=============================================================================
|
||||
Semaphore module configuration
|
||||
=============================================================================*/
|
||||
|
|
Loading…
Reference in New Issue