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:
zhushengle 2021-04-13 12:30:01 +08:00
parent c6a520b7f8
commit f685eeb97d
73 changed files with 2376 additions and 2717 deletions

View File

@ -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;

View File

@ -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;

117
kernel/arch/arm/cortex-m3/keil/los_arch_interrupt.h Executable file → Normal file
View File

@ -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;

24
kernel/arch/arm/cortex-m3/keil/los_context.c Executable file → Normal file
View File

@ -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 */

View File

@ -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}

9
kernel/arch/arm/cortex-m3/keil/los_interrupt.c Executable file → Normal file
View File

@ -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);

150
kernel/arch/arm/cortex-m3/keil/los_timer.c Executable file → Normal file
View File

@ -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)

View File

@ -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;

118
kernel/arch/arm/cortex-m33/gcc/los_arch_interrupt.h Executable file → Normal file
View File

@ -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 */

View File

@ -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 */

View File

@ -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)) && \

7
kernel/arch/arm/cortex-m33/gcc/los_interrupt.c Executable file → Normal file
View File

@ -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);

View File

@ -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

View File

@ -128,3 +128,4 @@ extern VOID HalStartToRun(VOID);
#endif /* __cpluscplus */
#endif /* _LOS_ARCH_CONTEXT_H */

View File

@ -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

View File

@ -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 */
}

View File

@ -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

View File

@ -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);

View File

@ -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();

43
kernel/arch/arm/cortex-m4/iar/los_arch_interrupt.h Executable file → Normal file
View File

@ -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 */

11
kernel/arch/arm/cortex-m4/iar/los_context.c Executable file → Normal file
View File

@ -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 */
}

67
kernel/arch/arm/cortex-m4/iar/los_dispatch.S Executable file → Normal file
View File

@ -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

5
kernel/arch/arm/cortex-m4/iar/los_interrupt.c Executable file → Normal file
View File

@ -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);

0
kernel/arch/arm/cortex-m4/iar/los_mpu.c Executable file → Normal file
View File

130
kernel/arch/arm/cortex-m4/iar/los_timer.c Executable file → Normal file
View File

@ -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();

View File

@ -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;

117
kernel/arch/arm/cortex-m7/gcc/los_arch_interrupt.h Executable file → Normal file
View File

@ -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;

View File

@ -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 */

View File

@ -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

7
kernel/arch/arm/cortex-m7/gcc/los_interrupt.c Executable file → Normal file
View File

@ -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);

148
kernel/arch/arm/cortex-m7/gcc/los_timer.c Executable file → Normal file
View File

@ -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)

View File

@ -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;

118
kernel/arch/arm/cortex-m7/iar/los_arch_interrupt.h Executable file → Normal file
View File

@ -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 */

View File

@ -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 */

67
kernel/arch/arm/cortex-m7/iar/los_dispatch.S Executable file → Normal file
View File

@ -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

5
kernel/arch/arm/cortex-m7/iar/los_interrupt.c Executable file → Normal file
View File

@ -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);

0
kernel/arch/arm/cortex-m7/iar/los_mpu.c Executable file → Normal file
View File

148
kernel/arch/arm/cortex-m7/iar/los_timer.c Executable file → Normal file
View File

@ -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)

0
kernel/arch/include/los_atomic.h Normal file → Executable file
View File

0
kernel/arch/include/los_context.h Normal file → Executable file
View File

View File

@ -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

View File

@ -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.

0
kernel/arch/risc-v/riscv32/gcc/los_arch_interrupt.h Executable file → Normal file
View File

View File

@ -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

View File

@ -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
}

View File

@ -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

55
kernel/arch/risc-v/riscv32/gcc/los_exc.S Executable file → Normal file
View File

@ -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 */

1
kernel/arch/risc-v/riscv32/gcc/los_interrupt.c Executable file → Normal file
View File

@ -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"

69
kernel/arch/risc-v/riscv32/gcc/los_timer.c Executable file → Normal file
View File

@ -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)
{

28
kernel/include/los_config.h Executable file → Normal file
View File

@ -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
}

113
kernel/include/los_sched.h Normal file
View File

@ -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 */

View File

@ -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 */

View File

@ -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.

View File

@ -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
}

View File

@ -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.

View File

@ -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;
}

4
kernel/src/los_init.c Executable file → Normal file
View File

@ -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;

View File

@ -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);

14
kernel/src/los_queue.c Executable file → Normal file
View File

@ -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);

638
kernel/src/los_sched.c Normal file
View File

@ -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 */

8
kernel/src/los_sem.c Executable file → Normal file
View File

@ -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);

211
kernel/src/los_sortlink.c Normal file
View File

@ -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 */

View File

@ -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

534
kernel/src/los_task.c Executable file → Normal file
View File

@ -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;

View File

@ -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;
}
/*****************************************************************************

View File

@ -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>

View File

@ -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>

View File

@ -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
=============================================================================*/

View File

@ -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");
}

View 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>

View 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>

View 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 */

View File

@ -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
=============================================================================*/