/*
* 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_task_pri.h"
# include "los_base_pri.h"
# include "los_event_pri.h"
# include "los_exc.h"
# include "los_hw_pri.h"
# include "los_init.h"
# include "los_memstat_pri.h"
# include "los_mp.h"
# include "los_mux_pri.h"
# include "los_sched_pri.h"
# include "los_sem_pri.h"
# include "los_spinlock.h"
# include "los_strncpy_from_user.h"
# include "los_percpu_pri.h"
# include "los_process_pri.h"
# include "los_vm_map.h"
# include "los_vm_syscall.h"
# include "los_signal.h"
# include "los_hook.h"
# ifdef LOSCFG_KERNEL_CPUP
# include "los_cpup_pri.h"
# endif
# ifdef LOSCFG_BASE_CORE_SWTMR_ENABLE
# include "los_swtmr_pri.h"
# endif
# ifdef LOSCFG_KERNEL_LITEIPC
# include "hm_liteipc.h"
# endif
# ifdef LOSCFG_ENABLE_OOM_LOOP_TASK
# include "los_oom.h"
# endif
# if (LOSCFG_BASE_CORE_TSK_LIMIT <= 0)
# error "task maxnum cannot be zero"
# endif /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */
// ȫ<> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LITE_OS_SEC_BSS LosTaskCB * g_taskCBArray ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD>
LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
LITE_OS_SEC_BSS UINT32 g_taskMaxNum ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LITE_OS_SEC_BSS UINT32 g_taskScheduled ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȱ<EFBFBD> ־<EFBFBD> <D6BE> ÿ<EFBFBD> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> λ
LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent ; // <20> <> Դ<EFBFBD> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
LITE_OS_SEC_BSS SPIN_LOCK_INIT ( g_taskSpin ) ; // <20> <> <EFBFBD> <EFBFBD> ģ<EFBFBD> <C4A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ú<EFBFBD> <C3BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
STATIC VOID OsConsoleIDSetHook ( UINT32 param1 ,
UINT32 param2 ) __attribute__ ( ( weakref ( " OsSetConsoleID " ) ) ) ;
// <20> 궨<EFBFBD> <EAB6A8>
# define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
OS_TASK_STATUS_PENDING | \
OS_TASK_STATUS_SUSPENDED )
// <20> <> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LITE_OS_SEC_BSS STATIC LosTaskCB g_mainTask [ LOSCFG_KERNEL_CORE_NUM ] ;
// <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
LosTaskCB * OsGetMainTask ( )
{
return ( LosTaskCB * ) ( g_mainTask + ArchCurrCpuid ( ) ) ;
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ij<EFBFBD> ʼ ״̬
VOID OsSetMainTask ( )
{
UINT32 i ;
CHAR * name = " osMain " ;
for ( i = 0 ; i < LOSCFG_KERNEL_CORE_NUM ; i + + ) {
g_mainTask [ i ] . taskStatus = OS_TASK_STATUS_UNUSED ;
g_mainTask [ i ] . taskID = LOSCFG_BASE_CORE_TSK_LIMIT ;
g_mainTask [ i ] . priority = OS_TASK_PRIORITY_LOWEST ;
# ifdef LOSCFG_KERNEL_SMP_LOCKDEP
g_mainTask [ i ] . lockDep . lockDepth = 0 ;
g_mainTask [ i ] . lockDep . waitLock = NULL ;
# endif
( VOID ) strncpy_s ( g_mainTask [ i ] . taskName , OS_TCB_NAME_LEN , name , OS_TCB_NAME_LEN - 1 ) ;
LOS_ListInit ( & g_mainTask [ i ] . lockList ) ;
}
}
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask ( VOID )
{
while ( 1 ) {
WFI ; // <20> ȴ<EFBFBD> <C8B4> ж<EFBFBD> ָ<EFBFBD> <EFBFBD> <EEA3AC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڵ<DAB5> <CDB9> <EFBFBD> ״̬<D7B4> <CCAC> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> յ<EFBFBD> <D5B5> ж<EFBFBD> <D0B6> ź<EFBFBD>
}
}
STATIC INLINE VOID OsInsertTCBToFreeList ( LosTaskCB * taskCB )
{
UINT32 taskID = taskCB - > taskID ;
( VOID ) memset_s ( taskCB , sizeof ( LosTaskCB ) , 0 , sizeof ( LosTaskCB ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
taskCB - > taskID = taskID ;
taskCB - > taskStatus = OS_TASK_STATUS_UNUSED ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊδʹ <CEB4> <CAB9>
taskCB - > processID = OS_INVALID_VALUE ; // <20> <> <EFBFBD> ý<EFBFBD> <C3BD> <EFBFBD> IDΪ<44> <CEAA> Чֵ
LOS_ListAdd ( & g_losFreeTask , & taskCB - > pendList ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> ӵ<EFBFBD> <D3B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD> <D0B1> <EFBFBD>
}
LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe ( LosTaskCB * taskCB )
{
LosTaskCB * resumedTask = NULL ;
if ( taskCB - > taskStatus & OS_TASK_FLAG_PTHREAD_JOIN ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> pthread_join<69> <6E> ־
if ( ! LOS_ListEmpty ( & taskCB - > joinList ) ) {
resumedTask = OS_TCB_FROM_PENDLIST ( LOS_DL_LIST_FIRST ( & ( taskCB - > joinList ) ) ) ; // <20> <> ȡ<EFBFBD> <C8A1> һ <EFBFBD> <D2BB> <EFBFBD> ȴ<EFBFBD> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
OsTaskWakeClearPendMask ( resumedTask ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĵȴ<C4B5> <C8B4> <EFBFBD> ־
OsSchedTaskWake ( resumedTask ) ; // <20> <> <EFBFBD> ѵ ȴ<D1B5> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
taskCB - > taskStatus & = ~ OS_TASK_FLAG_PTHREAD_JOIN ; // <20> <> <EFBFBD> <EFBFBD> pthread_join<69> <6E> ־
}
taskCB - > taskStatus | = OS_TASK_STATUS_EXIT ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊ<CCAC> ˳<EFBFBD>
}
LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe ( LosTaskCB * taskCB )
{
LosProcessCB * processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD>
if ( ! ( processCB - > processStatus & OS_PROCESS_STATUS_RUNNING ) ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬
return LOS_EPERM ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ û<CABE> <C3BB> Ȩ<EFBFBD> <C8A8>
}
if ( taskCB - > taskStatus & OS_TASK_STATUS_INIT ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊ<CCAC> <CEAA> ʼ <EFBFBD> <CABC> ״̬
return LOS_EINVAL ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч
}
if ( ( taskCB - > taskStatus & OS_TASK_FLAG_PTHREAD_JOIN ) & & LOS_ListEmpty ( & taskCB - > joinList ) ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> pthread_join<69> <6E> ־<EFBFBD> ҵȴ<D2B5> <C8B4> б <EFBFBD> Ϊ<EFBFBD> <CEAA>
OsTaskWaitSetPendMask ( OS_TASK_WAIT_JOIN , taskCB - > taskID , LOS_WAIT_FOREVER ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĵȴ<C4B5> <C8B4> <EFBFBD> ־
return OsSchedTaskWait ( & taskCB - > joinList , LOS_WAIT_FOREVER , TRUE ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȴ<EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> ȴ<EFBFBD> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
else if ( taskCB - > taskStatus & OS_TASK_STATUS_EXIT ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊ<CCAC> ˳<EFBFBD> ״̬
return LOS_OK ; // <20> <> <EFBFBD> سɹ<D8B3> <C9B9> <EFBFBD>
}
return LOS_EINVAL ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч
}
LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe ( LosTaskCB * taskCB )
{
LosProcessCB * processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD>
if ( ! ( processCB - > processStatus & OS_PROCESS_STATUS_RUNNING ) ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬
return LOS_EPERM ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ û<CABE> <C3BB> Ȩ<EFBFBD> <C8A8>
}
if ( taskCB - > taskStatus & OS_TASK_FLAG_PTHREAD_JOIN ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> pthread_join<69> <6E> ־
if ( LOS_ListEmpty ( & ( taskCB - > joinList ) ) ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ȴ<EFBFBD> <C8B4> б <EFBFBD> Ϊ<EFBFBD> <CEAA>
LOS_ListDelete ( & ( taskCB - > joinList ) ) ; // <20> ӵȴ<D3B5> <C8B4> б <EFBFBD> <D0B1> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
taskCB - > taskStatus & = ~ OS_TASK_FLAG_PTHREAD_JOIN ; // <20> <> <EFBFBD> <EFBFBD> pthread_join<69> <6E> ־
taskCB - > taskStatus | = OS_TASK_FLAG_DETACHED ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> ״̬
return LOS_OK ; // <20> <> <EFBFBD> سɹ<D8B3> <C9B9> <EFBFBD>
}
/* This error code has a special purpose and is not allowed to appear again on the interface */
return LOS_ESRCH ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ û<CABE> <C3BB> <EFBFBD> ҵ<EFBFBD>
}
return LOS_EINVAL ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> 룬<EFBFBD> <EBA3AC> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ч
}
LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit ( VOID )
{
UINT32 index ;
UINT32 size ;
UINT32 ret ;
g_taskMaxNum = LOSCFG_BASE_CORE_TSK_LIMIT ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
size = ( g_taskMaxNum + 1 ) * sizeof ( LosTaskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĵ<EFBFBD> С
/*
* This memory is resident memory and is used to save the system resources
* of task control block and will not be freed .
*/
g_taskCBArray = ( LosTaskCB * ) LOS_MemAlloc ( m_aucSysMem0 , size ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD>
if ( g_taskCBArray = = NULL ) {
ret = LOS_ERRNO_TSK_NO_MEMORY ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD> ʧ<EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> <EFBFBD>
goto EXIT ;
}
( VOID ) memset_s ( g_taskCBArray , size , 0 , size ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD>
LOS_ListInit ( & g_losFreeTask ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
LOS_ListInit ( & g_taskRecycleList ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
for ( index = 0 ; index < g_taskMaxNum ; index + + ) {
g_taskCBArray [ index ] . taskStatus = OS_TASK_STATUS_UNUSED ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊδʹ <CEB4> <CAB9>
g_taskCBArray [ index ] . taskID = index ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
LOS_ListTailInsert ( & g_losFreeTask , & g_taskCBArray [ index ] . pendList ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> ӵ<EFBFBD> <D3B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD> <D0B1> <EFBFBD>
}
ret = OsSchedInit ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC>
EXIT :
if ( ret ! = LOS_OK ) {
PRINT_ERR ( " OsTaskInit error \n " ) ; // <20> <> ӡ<EFBFBD> <D3A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
}
return ret ; // <20> <> <EFBFBD> س<EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
UINT32 OsGetIdleTaskId ( VOID )
{
Percpu * perCpu = OsPercpuGet ( ) ; // <20> <> ȡ<EFBFBD> <C8A1> ǰCPU<50> <55> ˽<EFBFBD> <CBBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return perCpu - > idleTaskID ; // <20> <> <EFBFBD> ؿ<EFBFBD> <D8BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
}
LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate ( VOID )
{
UINT32 ret ;
TSK_INIT_PARAM_S taskInitParam ;
Percpu * perCpu = OsPercpuGet ( ) ; // <20> <> ȡ<EFBFBD> <C8A1> ǰCPU<50> <55> ˽<EFBFBD> <CBBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
UINT32 * idleTaskID = & perCpu - > idleTaskID ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
( VOID ) memset_s ( ( VOID * ) ( & taskInitParam ) , sizeof ( TSK_INIT_PARAM_S ) , 0 , sizeof ( TSK_INIT_PARAM_S ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ṹ<EFBFBD> <E1B9B9>
taskInitParam . pfnTaskEntry = ( TSK_ENTRY_FUNC ) OsIdleTask ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ں<EFBFBD> <DABA> <EFBFBD> ΪOsIdleTask
taskInitParam . uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> С
taskInitParam . pcName = " Idle " ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
taskInitParam . usTaskPrio = OS_TASK_PRIORITY_LOWEST ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD>
taskInitParam . processID = OsGetIdleProcessID ( ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵<EFBFBD> ID
# ifdef LOSCFG_KERNEL_SMP
taskInitParam . usCpuAffiMask = CPUID_TO_AFFI_MASK ( ArchCurrCpuid ( ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> CPU<50> <EFBFBD> <D7BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
# endif
ret = LOS_TaskCreateOnly ( idleTaskID , & taskInitParam ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LosTaskCB * idleTask = OS_TCB_FROM_TID ( * idleTaskID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
idleTask - > taskStatus | = OS_TASK_FLAG_SYSTEM_TASK ; // <20> <> <EFBFBD> ÿ<EFBFBD> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ı <EFBFBD> ־Ϊϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD>
OsSchedSetIdleTaskSchedParam ( idleTask ) ; // <20> <> <EFBFBD> ÿ<EFBFBD> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĵ<EFBFBD> <C4B5> Ȳ<EFBFBD> <C8B2> <EFBFBD>
return ret ; // <20> <> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
/*
* Description : get id of current running task .
* Return : task id
*/
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet ( VOID )
{
LosTaskCB * runTask = OsCurrTaskGet ( ) ; // <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
if ( runTask = = NULL ) {
return LOS_ERRNO_TSK_ID_INVALID ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> Ϊ<EFBFBD> գ <EFBFBD> <D5A3> <EFBFBD> <EFBFBD> ش<EFBFBD> <D8B4> <EFBFBD> <EFBFBD> <EFBFBD>
}
return runTask - > taskID ; // <20> <> <EFBFBD> ص<EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
}
LITE_OS_SEC_TEXT VOID OsTaskToExit ( LosTaskCB * taskCB , UINT32 status )
{
UINT32 intSave ;
LosProcessCB * runProcess = OS_PCB_FROM_PID ( taskCB - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD>
LosTaskCB * mainTask = OS_TCB_FROM_TID ( runProcess - > threadGroupID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
if ( mainTask = = taskCB ) {
OsTaskExitGroup ( status ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǽ<EFBFBD> <C7BD> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> ̣߳<DFB3> <CCA3> <EFBFBD> <EFBFBD> ˳<EFBFBD> <CBB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
SCHEDULER_LOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( runProcess - > threadNumber = = 1 ) { /* 1: The last task of the process exits */
SCHEDULER_UNLOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
( VOID ) OsProcessExit ( taskCB , status ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˳<EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> ý<EFBFBD> <C3BD> <EFBFBD> <EFBFBD> ˳<EFBFBD> <CBB3> <EFBFBD> <EFBFBD> <EFBFBD>
return ;
}
/* The thread being killed must be able to exit automatically and will have the detached property */
OsTaskJoinPostUnsafe ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> ɱ<EFBFBD> <C9B1> <EFBFBD> <EFBFBD> <EFBFBD> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> Զ<EFBFBD> <D4B6> ˳<EFBFBD> <CBB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> з<EFBFBD> <D0B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( taskCB - > taskStatus & ( OS_TASK_FLAG_DETACHED | OS_TASK_FLAG_EXIT_KILL ) ) {
UINT32 ret = OsTaskDeleteUnsafe ( taskCB , status , intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> з<EFBFBD> <D0B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ի<D4BB> <F2B1BBB1> <EFBFBD> Ϊ<EFBFBD> ˳<EFBFBD> ɱ<EFBFBD> <C9B1> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LOS_Panic ( " Task delete failed! ERROR : 0x%x \n " , ret ) ; // <20> <> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> ʧ<EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> ӡ<EFBFBD> <D3A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
}
OsSchedResched ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> µ<EFBFBD> <C2B5> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return ;
}
/*
* Description : All task entry
* Input : taskID - - - The ID of the task to be run
*/
LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry ( UINT32 taskID )
{
LosTaskCB * taskCB = NULL ;
LOS_ASSERT ( ! OS_TID_CHECK_INVALID ( taskID ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> <EFBFBD> <EFBFBD> Ч<EFBFBD> <D0A7>
/*
* task scheduler needs to be protected throughout the whole process
* from interrupt and other cores . release task spinlock and enable
* interrupt in sequence at the task entry .
*/
LOS_SpinUnlock ( & g_taskSpin ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
( VOID ) LOS_IntUnLock ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
taskCB = OS_TCB_FROM_TID ( taskID ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
taskCB - > joinRetval = taskCB - > taskEntry ( taskCB - > args [ 0 ] , taskCB - > args [ 1 ] ,
taskCB - > args [ 2 ] , taskCB - > args [ 3 ] ) ; /* 2 & 3: just for args array index */
if ( taskCB - > taskStatus & OS_TASK_FLAG_DETACHED ) {
taskCB - > joinRetval = 0 ;
}
OsTaskToExit ( taskCB , 0 ) ; // <20> <> <EFBFBD> <EFBFBD> ִ<EFBFBD> <D6B4> <EFBFBD> <EFBFBD> <EFBFBD> Ϻ <EFBFBD> <CFBA> ˳<EFBFBD>
}
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck ( const UINT32 * taskID ,
TSK_INIT_PARAM_S * initParam , VOID * * pool )
{
LosProcessCB * process = NULL ;
UINT32 poolSize = OS_SYS_MEM_SIZE ;
* pool = ( VOID * ) m_aucSysMem1 ;
if ( taskID = = NULL ) {
return LOS_ERRNO_TSK_ID_INVALID ; // <20> <> <EFBFBD> <EFBFBD> ID<49> <44> Ч
}
if ( initParam = = NULL ) {
return LOS_ERRNO_TSK_PTR_NULL ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA>
}
process = OS_PCB_FROM_PID ( initParam - > processID ) ; // <20> <> <EFBFBD> ݽ<EFBFBD> <DDBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD>
if ( process - > processMode > OS_USER_MODE ) {
return LOS_ERRNO_TSK_ID_INVALID ; // <20> <> <EFBFBD> <EFBFBD> ģʽ <C4A3> <CABD> Ч
}
if ( ! OsProcessIsUserMode ( process ) ) {
if ( initParam - > pcName = = NULL ) {
return LOS_ERRNO_TSK_NAME_EMPTY ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA>
}
}
if ( initParam - > pfnTaskEntry = = NULL ) {
return LOS_ERRNO_TSK_ENTRY_NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ں<EFBFBD> <DABA> <EFBFBD> Ϊ<EFBFBD> <CEAA>
}
if ( initParam - > usTaskPrio > OS_TASK_PRIORITY_LOWEST ) {
return LOS_ERRNO_TSK_PRIOR_ERROR ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD> <C8BC> <EFBFBD> <EFBFBD> <EFBFBD>
}
if ( initParam - > uwStackSize > poolSize ) {
return LOS_ERRNO_TSK_STKSZ_TOO_LARGE ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> С <EFBFBD> <D0A1> <EFBFBD> <EFBFBD>
}
if ( initParam - > uwStackSize = = 0 ) {
initParam - > uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> С Ϊ0<CEAA> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ΪĬ<CEAA> ϴ<EFBFBD> С
}
initParam - > uwStackSize = ( UINT32 ) ALIGN ( initParam - > uwStackSize , LOSCFG_STACK_POINT_ALIGN_SIZE ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> С <EFBFBD> <D0A1> <EFBFBD> ж<EFBFBD> <D0B6> <EFBFBD>
if ( initParam - > uwStackSize < LOS_TASK_MIN_STACK_SIZE ) {
return LOS_ERRNO_TSK_STKSZ_TOO_SMALL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> С <EFBFBD> <D0A1> С
}
return LOS_OK ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8>
}
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc ( VOID * * topStack , UINT32 stackSize , VOID * pool )
{
* topStack = ( VOID * ) LOS_MemAllocAlign ( pool , stackSize , LOSCFG_STACK_POINT_ALIGN_SIZE ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> ڴ<EFBFBD>
}
STATIC INLINE UINT32 OsTaskSyncCreate ( LosTaskCB * taskCB )
{
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32 ret = LOS_SemCreate ( 0 , & taskCB - > syncSignal ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD>
if ( ret ! = LOS_OK ) {
return LOS_ERRNO_TSK_MP_SYNC_RESOURCE ; // <20> <> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> Դ<EFBFBD> <D4B4> <EFBFBD> <EFBFBD> ʧ<EFBFBD> <CAA7>
}
# else
( VOID ) taskCB ;
# endif
return LOS_OK ; // <20> <> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD>
}
STATIC INLINE VOID OsTaskSyncDestroy ( UINT32 syncSignal )
{
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
( VOID ) LOS_SemDelete ( syncSignal ) ; // ɾ<> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD>
# else
( VOID ) syncSignal ;
# endif
}
LITE_OS_SEC_TEXT UINT32 OsTaskSyncWait ( const LosTaskCB * taskCB )
{
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32 ret = LOS_OK ;
LOS_ASSERT ( LOS_SpinHeld ( & g_taskSpin ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѳ<EFBFBD> <D1B3> <EFBFBD>
LOS_SpinUnlock ( & g_taskSpin ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/*
* gc soft timer works every OS_MP_GC_PERIOD period , to prevent this timer
* triggered right at the timeout has reached , we set the timeout as double
* of the gc peroid .
*/
if ( LOS_SemPend ( taskCB - > syncSignal , OS_MP_GC_PERIOD * 2 ) ! = LOS_OK ) {
ret = LOS_ERRNO_TSK_MP_SYNC_FAILED ; // <20> <> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ȴ<EFBFBD> ʧ<EFBFBD> <CAA7>
}
LOS_SpinLock ( & g_taskSpin ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return ret ;
# else
( VOID ) taskCB ;
return LOS_OK ;
# endif
}
STATIC INLINE VOID OsTaskSyncWake ( const LosTaskCB * taskCB )
{
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
( VOID ) OsSemPostUnsafe ( taskCB - > syncSignal , NULL ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD>
# else
( VOID ) taskCB ;
# endif
}
STATIC VOID OsTaskKernelResourcesToFree ( UINT32 syncSignal , UINTPTR topOfStack )
{
VOID * poolTmp = ( VOID * ) m_aucSysMem1 ;
OsTaskSyncDestroy ( syncSignal ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD>
( VOID ) LOS_MemFree ( poolTmp , ( VOID * ) topOfStack ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> ڴ<EFBFBD>
}
LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree ( )
{
LosTaskCB * taskCB = NULL ;
UINT32 intSave ;
SCHEDULER_LOCK ( intSave ) ;
while ( ! LOS_ListEmpty ( & g_taskRecycleList ) ) {
taskCB = OS_TCB_FROM_PENDLIST ( LOS_DL_LIST_FIRST ( & g_taskRecycleList ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD> <D0B1> л<EFBFBD> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
LOS_ListDelete ( & taskCB - > pendList ) ; // <20> ӻ<EFBFBD> <D3BB> <EFBFBD> <EFBFBD> б <EFBFBD> <D0B1> <EFBFBD> <EFBFBD> Ƴ<EFBFBD> <C6B3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
OsTaskResourcesToFree ( taskCB ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ
SCHEDULER_LOCK ( intSave ) ;
}
SCHEDULER_UNLOCK ( intSave ) ;
}
LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree ( LosTaskCB * taskCB )
{
UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT ;
UINT32 intSave ;
UINTPTR topOfStack ;
# ifdef LOSCFG_KERNEL_VM
LosProcessCB * processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ;
if ( OsProcessIsUserMode ( processCB ) & & ( taskCB - > userMapBase ! = 0 ) ) {
SCHEDULER_LOCK ( intSave ) ;
UINT32 mapBase = ( UINTPTR ) taskCB - > userMapBase ;
UINT32 mapSize = taskCB - > userMapSize ;
taskCB - > userMapBase = 0 ;
taskCB - > userArea = 0 ;
SCHEDULER_UNLOCK ( intSave ) ;
LOS_ASSERT ( ! ( processCB - > vmSpace = = NULL ) ) ;
UINT32 ret = OsUnMMap ( processCB - > vmSpace , ( UINTPTR ) mapBase , mapSize ) ; // ȡ<> <C8A1> ӳ<EFBFBD> <D3B3> <EFBFBD> û<EFBFBD> <C3BB> ڴ<EFBFBD>
if ( ( ret ! = LOS_OK ) & & ( mapBase ! = 0 ) & & ! ( processCB - > processStatus & OS_PROCESS_STATUS_INIT ) ) {
PRINT_ERR ( " process(%u) ummap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d \n " ,
processCB - > processID , taskCB - > taskID , mapBase , mapSize , ret ) ;
}
# ifdef LOSCFG_KERNEL_LITEIPC
LiteIpcRemoveServiceHandle ( taskCB ) ;
# endif
}
# endif
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
topOfStack = taskCB - > topOfStack ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> ջ<EFBFBD> <D5BB> <EFBFBD> <EFBFBD> ַ
taskCB - > topOfStack = 0 ;
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
syncSignal = taskCB - > syncSignal ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD>
taskCB - > syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT ;
# endif
OsTaskKernelResourcesToFree ( syncSignal , topOfStack ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ں<EFBFBD> <DABA> <EFBFBD> Դ
SCHEDULER_LOCK ( intSave ) ;
OsClearSigInfoTmpList ( & ( taskCB - > sig ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ź<EFBFBD> <C5BA> <EFBFBD> Ϣ<EFBFBD> <CFA2> ʱ<EFBFBD> б <EFBFBD>
OsInsertTCBToFreeList ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> 뵽<EFBFBD> <EBB5BD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD> <D0B1> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
}
return ;
}
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase ( LosTaskCB * taskCB ,
const VOID * stackPtr ,
const VOID * topStack ,
const TSK_INIT_PARAM_S * initParam )
{
taskCB - > stackPointer = ( VOID * ) stackPtr ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ķ<EFBFBD> ջָ<D5BB> <D6B8>
taskCB - > args [ 0 ] = initParam - > auwArgs [ 0 ] ; /* 0~3: just for args array index */ // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> IJ<EFBFBD> <C4B2> <EFBFBD>
taskCB - > args [ 1 ] = initParam - > auwArgs [ 1 ] ;
taskCB - > args [ 2 ] = initParam - > auwArgs [ 2 ] ;
taskCB - > args [ 3 ] = initParam - > auwArgs [ 3 ] ;
taskCB - > topOfStack = ( UINTPTR ) topStack ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> <D5BB> ջ<EFBFBD> <D5BB> <EFBFBD> <EFBFBD> ַ
taskCB - > stackSize = initParam - > uwStackSize ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> Ĵ<EFBFBD> С
taskCB - > priority = initParam - > usTaskPrio ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD>
taskCB - > taskEntry = initParam - > pfnTaskEntry ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ں<EFBFBD> <DABA> <EFBFBD>
taskCB - > signal = SIGNAL_NONE ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ź<EFBFBD>
# ifdef LOSCFG_KERNEL_SMP
taskCB - > currCpu = OS_TASK_INVALID_CPUID ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڵ<EFBFBD> CPU ID
taskCB - > cpuAffiMask = ( initParam - > usCpuAffiMask ) ?
initParam - > usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> CPU<50> <EFBFBD> <D7BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
# endif
# ifdef LOSCFG_KERNEL_LITEIPC
LOS_ListInit ( & ( taskCB - > msgListHead ) ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ<EFBFBD> б <EFBFBD>
# endif
taskCB - > policy = ( initParam - > policy = = LOS_SCHED_FIFO ) ? LOS_SCHED_FIFO : LOS_SCHED_RR ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĵ<EFBFBD> <C4B5> Ȳ<EFBFBD> <C8B2> <EFBFBD>
taskCB - > taskStatus = OS_TASK_STATUS_INIT ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬
if ( initParam - > uwResved & OS_TASK_FLAG_DETACHED ) {
taskCB - > taskStatus | = OS_TASK_FLAG_DETACHED ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> ̬<EFBFBD> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ķ<EFBFBD> <C4B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
else {
taskCB - > taskStatus | = OS_TASK_FLAG_PTHREAD_JOIN ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> pthread join<69> <6E> <EFBFBD> ǣ<EFBFBD> <C7A3> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĵȴ<C4B5> <C8B4> б <EFBFBD>
LOS_ListInit ( & taskCB - > joinList ) ;
}
taskCB - > futex . index = OS_INVALID_VALUE ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> futex<65> <78> <EFBFBD> <EFBFBD> ֵ
LOS_ListInit ( & taskCB - > lockList ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
SET_SORTLIST_VALUE ( & taskCB - > sortList , OS_SORT_LINK_INVALID_TIME ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
STATIC UINT32 OsTaskCBInit ( LosTaskCB * taskCB , const TSK_INIT_PARAM_S * initParam ,
const VOID * stackPtr , const VOID * topStack )
{
UINT32 intSave ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD>
UINT32 ret ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
UINT32 numCount ; // <20> ̼߳<DFB3> <CCBC> <EFBFBD>
UINT16 mode ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ
LosProcessCB * processCB = NULL ; // <20> <> <EFBFBD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
OsTaskCBInitBase ( taskCB , stackPtr , topStack , initParam ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> Ļ<EFBFBD> <C4BB> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
SCHEDULER_LOCK ( intSave ) ; // <20> رյ<D8B1> <D5B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
processCB = OS_PCB_FROM_PID ( initParam - > processID ) ; // <20> <> <EFBFBD> ݽ<EFBFBD> <DDBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD>
taskCB - > processID = processCB - > processID ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ľ<EFBFBD> <C4BD> <EFBFBD> ID
mode = processCB - > processMode ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ
LOS_ListTailInsert ( & ( processCB - > threadSiblingList ) , & ( taskCB - > threadList ) ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵<EFBFBD> <CCB5> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( mode = = OS_USER_MODE ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> û<EFBFBD> ģʽ <C4A3> <CABD>
taskCB - > userArea = initParam - > userParam . userArea ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> û<EFBFBD> <C3BB> <EFBFBD> <EFBFBD> <EFBFBD>
taskCB - > userMapBase = initParam - > userParam . userMapBase ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> û<EFBFBD> ӳ<EFBFBD> <D3B3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ
taskCB - > userMapSize = initParam - > userParam . userMapSize ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> û<EFBFBD> ӳ<EFBFBD> <D3B3> <EFBFBD> <EFBFBD> С
OsUserTaskStackInit ( taskCB - > stackPointer , ( UINTPTR ) taskCB - > taskEntry , initParam - > userParam . userSP ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> û<EFBFBD> <C3BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ
}
if ( ! processCB - > threadNumber ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵<EFBFBD> <CCB5> ߳<EFBFBD> <DFB3> <EFBFBD> Ϊ0
processCB - > threadGroupID = taskCB - > taskID ; // <20> <> <EFBFBD> ý<EFBFBD> <C3BD> ̵<EFBFBD> <CCB5> ߳<EFBFBD> <DFB3> <EFBFBD> IDΪ<44> <CEAA> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> ID
}
processCB - > threadNumber + + ; // <20> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> 1
numCount = processCB - > threadCount ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> ̵<EFBFBD> <CCB5> ̼߳<DFB3> <CCBC> <EFBFBD>
processCB - > threadCount + + ; // <20> ̼߳<DFB3> <CCBC> <EFBFBD> <EFBFBD> <EFBFBD> 1
SCHEDULER_UNLOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
if ( initParam - > pcName ! = NULL ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA>
ret = ( UINT32 ) OsSetTaskName ( taskCB , initParam - > pcName , FALSE ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ret = = LOS_OK ) {
return LOS_OK ;
}
}
if ( snprintf_s ( taskCB - > taskName , OS_TCB_NAME_LEN , OS_TCB_NAME_LEN - 1 , " thread%u " , numCount ) < 0 ) { // <20> <> <EFBFBD> <EFBFBD> Ĭ<EFBFBD> <C4AC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return LOS_NOK ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT LosTaskCB * OsGetFreeTaskCB ( VOID )
{
UINT32 intSave ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD>
LosTaskCB * taskCB = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
SCHEDULER_LOCK ( intSave ) ; // <20> رյ<D8B1> <D5B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
if ( LOS_ListEmpty ( & g_losFreeTask ) ) { // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA>
SCHEDULER_UNLOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
PRINT_ERR ( " No idle TCB in the system! \n " ) ; // <20> <> ӡ<EFBFBD> <D3A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
# ifdef LOSCFG_DEBUG_VERSION
( VOID ) OsShellCmdTskInfoGet ( OS_ALL_TASK_MASK , NULL , OS_PROCESS_INFO_ALL ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
# endif
return NULL ;
}
taskCB = OS_TCB_FROM_PENDLIST ( LOS_DL_LIST_FIRST ( & g_losFreeTask ) ) ; // <20> ӿ<EFBFBD> <D3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> л<EFBFBD> ȡһ <C8A1> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
LOS_ListDelete ( LOS_DL_LIST_FIRST ( & g_losFreeTask ) ) ; // <20> ӿ<EFBFBD> <D3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
return taskCB ; // <20> <> <EFBFBD> ػ<EFBFBD> ȡ<EFBFBD> Ŀ<EFBFBD> <C4BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly ( UINT32 * taskID , TSK_INIT_PARAM_S * initParam )
{
UINT32 intSave , errRet ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
VOID * topStack = NULL ; // ջ<> <D5BB> ָ<EFBFBD> <D6B8>
VOID * stackPtr = NULL ; // ջָ<D5BB> <D6B8>
LosTaskCB * taskCB = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
VOID * pool = NULL ; // <20> ڴ<EFBFBD> <DAB4> <EFBFBD> ָ<EFBFBD> <D6B8>
errRet = OsTaskCreateParamCheck ( taskID , initParam , & pool ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <F1B4B4BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĺϷ<C4BA> <CFB7> <EFBFBD>
if ( errRet ! = LOS_OK ) {
return errRet ;
}
taskCB = OsGetFreeTaskCB ( ) ; // <20> <> ȡһ <C8A1> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
if ( taskCB = = NULL ) {
errRet = LOS_ERRNO_TSK_TCB_UNAVAILABLE ;
goto LOS_ERREND ;
}
errRet = OsTaskSyncCreate ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( errRet ! = LOS_OK ) {
goto LOS_ERREND_REWIND_TCB ;
}
OsTaskStackAlloc ( & topStack , initParam - > uwStackSize , pool ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> ڴ<EFBFBD>
if ( topStack = = NULL ) {
errRet = LOS_ERRNO_TSK_NO_MEMORY ;
goto LOS_ERREND_REWIND_SYNC ;
}
stackPtr = OsTaskStackInit ( taskCB - > taskID , initParam - > uwStackSize , topStack , TRUE ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ջ
errRet = OsTaskCBInit ( taskCB , initParam , stackPtr , topStack ) ; // <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD>
if ( errRet ! = LOS_OK ) {
goto LOS_ERREND_TCB_INIT ;
}
if ( OsConsoleIDSetHook ! = NULL ) {
OsConsoleIDSetHook ( taskCB - > taskID , OsCurrTaskGet ( ) - > taskID ) ; // <20> <> <EFBFBD> ÿ<EFBFBD> <C3BF> <EFBFBD> ̨ID<49> Ĺ<EFBFBD> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
}
* taskID = taskCB - > taskID ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
OsHookCall ( LOS_HOOK_TYPE_TASK_CREATE , taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <F1B4B4BD> Ĺ<EFBFBD> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
return LOS_OK ;
LOS_ERREND_TCB_INIT :
( VOID ) LOS_MemFree ( pool , topStack ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> ջ<EFBFBD> ڴ<EFBFBD>
LOS_ERREND_REWIND_SYNC :
# ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
OsTaskSyncDestroy ( taskCB - > syncSignal ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
# endif
LOS_ERREND_REWIND_TCB :
SCHEDULER_LOCK ( intSave ) ;
OsInsertTCBToFreeList ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> <C6BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
LOS_ERREND :
return errRet ;
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate ( UINT32 * taskID , TSK_INIT_PARAM_S * initParam )
{
UINT32 ret ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
UINT32 intSave ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD>
LosTaskCB * taskCB = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
if ( initParam = = NULL ) {
return LOS_ERRNO_TSK_PTR_NULL ;
}
if ( OS_INT_ACTIVE ) {
return LOS_ERRNO_TSK_YIELD_IN_INT ;
}
if ( OsProcessIsUserMode ( OsCurrProcessGet ( ) ) ) {
initParam - > processID = OsGetKernelInitProcessID ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> û<EFBFBD> ģʽ <C4A3> £<EFBFBD> <C2A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> ں˳<DABA> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
}
else {
initParam - > processID = OsCurrProcessGet ( ) - > processID ; // <20> <> <EFBFBD> <EFBFBD> <F2BDABBD> <EFBFBD> ID<49> <44> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> ID
}
initParam - > uwResved & = ~ OS_TASK_FLAG_PTHREAD_JOIN ;
if ( initParam - > uwResved & LOS_TASK_STATUS_DETACHED ) {
initParam - > uwResved = OS_TASK_FLAG_DETACHED ;
}
ret = LOS_TaskCreateOnly ( taskID , initParam ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <F1B4B4BD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ret ! = LOS_OK ) {
return ret ;
}
taskCB = OS_TCB_FROM_TID ( * taskID ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
SCHEDULER_LOCK ( intSave ) ;
OsSchedTaskEnQueue ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȶ<EFBFBD> <C8B6> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
/* in case created task not running on this core,
schedule or not depends on other schedulers status . */
LOS_MpSchedule ( OS_MP_CPU_ALL ) ; // <20> ദ<EFBFBD> <E0B4A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( OS_SCHEDULER_ACTIVE ) {
LOS_Schedule ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume ( UINT32 taskID )
{
UINT32 intSave ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD>
UINT32 errRet ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
LosTaskCB * taskCB = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
BOOL needSched = FALSE ; // <20> Ƿ<EFBFBD> <C7B7> <EFBFBD> Ҫ<EFBFBD> <D2AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȵı <C8B5> ־
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
SCHEDULER_LOCK ( intSave ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ź<EFBFBD> */
taskCB - > signal & = ~ SIGNAL_SUSPEND ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
errRet = LOS_ERRNO_TSK_NOT_CREATED ;
OS_GOTO_ERREND ( ) ;
}
else if ( ! ( taskCB - > taskStatus & OS_TASK_STATUS_SUSPENDED ) ) {
errRet = LOS_ERRNO_TSK_NOT_SUSPENDED ;
OS_GOTO_ERREND ( ) ;
}
taskCB - > taskStatus & = ~ OS_TASK_STATUS_SUSPENDED ;
if ( ! ( taskCB - > taskStatus & OS_CHECK_TASK_BLOCK ) ) {
OsSchedTaskEnQueue ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȶ<EFBFBD> <C8B6> <EFBFBD>
if ( OS_SCHEDULER_ACTIVE ) {
needSched = TRUE ;
}
}
SCHEDULER_UNLOCK ( intSave ) ;
LOS_MpSchedule ( OS_MP_CPU_ALL ) ; // <20> ദ<EFBFBD> <E0B4A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
if ( needSched ) {
LOS_Schedule ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
return LOS_OK ;
LOS_ERREND :
SCHEDULER_UNLOCK ( intSave ) ;
return errRet ;
}
/*
* Check if needs to do the suspend operation on the running task .
* Return TRUE , if needs to do the suspension .
* Return FALSE , if meets following circumstances :
* 1. Do the suspension across cores , if SMP is enabled
* 2. Do the suspension when preemption is disabled
* 3. Do the suspension in hard - irq
* then LOS_TaskSuspend will directly return with ' ret ' value .
*/
LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun ( LosTaskCB * taskCB , UINT32 * ret )
{
/* <20> <> ʼ <EFBFBD> <CABC> Ĭ<EFBFBD> ϵķ<CFB5> <C4B7> <EFBFBD> ֵ */
* ret = LOS_OK ;
# ifdef LOSCFG_KERNEL_SMP
/* <20> 첽<EFBFBD> <ECB2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
if ( taskCB - > currCpu ! = ArchCurrCpuid ( ) ) {
taskCB - > signal = SIGNAL_SUSPEND ;
LOS_MpSchedule ( taskCB - > currCpu ) ;
return FALSE ;
}
# endif
if ( ! OsPreemptableInSched ( ) ) {
/* <20> ڵ<EFBFBD> <DAB5> <EFBFBD> <EFBFBD> ڼ<EFBFBD> <DABC> <EFBFBD> ֹ<EFBFBD> <D6B9> ռ <EFBFBD> <D5BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> */
* ret = LOS_ERRNO_TSK_SUSPEND_LOCKED ;
return FALSE ;
}
if ( OS_INT_ACTIVE ) {
/* <20> <> <EFBFBD> ж<EFBFBD> <D0B6> й<EFBFBD> <D0B9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> */
taskCB - > signal = SIGNAL_SUSPEND ;
return FALSE ;
}
return TRUE ;
}
LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend ( LosTaskCB * taskCB )
{
UINT32 errRet ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
UINT16 tempStatus ; // <20> <> ʱ<EFBFBD> 洢<EFBFBD> <E6B4A2> <EFBFBD> <EFBFBD> ״̬
tempStatus = taskCB - > taskStatus ;
if ( tempStatus & OS_TASK_STATUS_UNUSED ) {
return LOS_ERRNO_TSK_NOT_CREATED ;
}
if ( tempStatus & OS_TASK_STATUS_SUSPENDED ) {
return LOS_ERRNO_TSK_ALREADY_SUSPENDED ;
}
if ( ( tempStatus & OS_TASK_STATUS_RUNNING ) & &
! OsTaskSuspendCheckOnRun ( taskCB , & errRet ) ) {
return errRet ;
}
if ( tempStatus & OS_TASK_STATUS_READY ) {
OsSchedTaskDeQueue ( taskCB ) ; // <20> ӵ<EFBFBD> <D3B5> ȶ<EFBFBD> <C8B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƴ<EFBFBD> <C6B3> <EFBFBD> <EFBFBD> <EFBFBD>
}
taskCB - > taskStatus | = OS_TASK_STATUS_SUSPENDED ;
OsHookCall ( LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST , taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĺ<EFBFBD> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
if ( taskCB = = OsCurrTaskGet ( ) ) {
OsSchedResched ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend ( UINT32 taskID )
{
UINT32 intSave ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD> ״̬<D7B4> ı <EFBFBD> <C4B1> <EFBFBD>
LosTaskCB * taskCB = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
UINT32 errRet ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID<49> <44> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
if ( taskCB - > taskStatus & OS_TASK_FLAG_SYSTEM_TASK ) {
return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK ;
}
SCHEDULER_LOCK ( intSave ) ;
errRet = OsTaskSuspend ( taskCB ) ; // <20> <> <EFBFBD> ù<EFBFBD> <C3B9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ĺ<EFBFBD> <C4BA> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
return errRet ;
}
STATIC INLINE VOID OsTaskStatusUnusedSet ( LosTaskCB * taskCB )
{
taskCB - > taskStatus | = OS_TASK_STATUS_UNUSED ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊδʹ <CEB4> <CAB9>
taskCB - > eventMask = 0 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> <EFBFBD>
OS_MEM_CLEAR ( taskCB - > taskID ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID
}
STATIC INLINE VOID OsTaskReleaseHoldLock ( LosProcessCB * processCB , LosTaskCB * taskCB )
{
LosMux * mux = NULL ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> <D6B8>
UINT32 ret ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
while ( ! LOS_ListEmpty ( & taskCB - > lockList ) ) {
mux = LOS_DL_LIST_ENTRY ( LOS_DL_LIST_FIRST ( & taskCB - > lockList ) , LosMux , holdList ) ;
ret = OsMuxUnlockUnsafe ( taskCB , mux , NULL ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е Ļ<D0B5> <C4BB> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ret ! = LOS_OK ) {
LOS_ListDelete ( & mux - > holdList ) ;
PRINT_ERR ( " mux ulock failed! : %u \n " , ret ) ;
}
}
if ( processCB - > processMode = = OS_USER_MODE ) {
OsTaskJoinPostUnsafe ( taskCB ) ; // <20> û<EFBFBD> ̬<EFBFBD> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> ˳<EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
# ifdef LOSCFG_KERNEL_VM
OsFutexNodeDeleteFromFutexHash ( & taskCB - > futex , TRUE , NULL , NULL ) ; // <20> <> Futex<65> <78> ϣ<EFBFBD> <CFA3> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Futex<65> ڵ<EFBFBD>
# endif
}
OsTaskSyncWake ( taskCB ) ; // <20> <> <EFBFBD> ѵ ȴ<D1B5> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return ;
}
LITE_OS_SEC_TEXT VOID OsRunTaskToDelete ( LosTaskCB * runTask )
{
LosProcessCB * processCB = OS_PCB_FROM_PID ( runTask - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
OsTaskReleaseHoldLock ( processCB , runTask ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> Դ
OsTaskStatusUnusedSet ( runTask ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊδʹ <CEB4> <CAB9>
LOS_ListDelete ( & runTask - > threadList ) ; // <20> <> <EFBFBD> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
processCB - > threadNumber - - ; // <20> <> <EFBFBD> ̵<EFBFBD> <CCB5> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> һ
LOS_ListTailInsert ( & g_taskRecycleList , & runTask - > pendList ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
OsEventWriteUnsafe ( & g_resourceEvent , OS_RESOURCE_EVENT_FREE , FALSE , NULL ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ<EFBFBD> ¼<EFBFBD> ֪ͨ
OsSchedResched ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return ;
}
/*
* Check if needs to do the delete operation on the running task .
* Return TRUE , if needs to do the deletion .
* Return FALSE , if meets following circumstances :
* 1. Do the deletion across cores , if SMP is enabled
* 2. Do the deletion when preemption is disabled
* 3. Do the deletion in hard - irq
* then LOS_TaskDelete will directly return with ' ret ' value .
*/
STATIC BOOL OsRunTaskToDeleteCheckOnRun ( LosTaskCB * taskCB , UINT32 * ret )
{
/* init default out return value */
* ret = LOS_OK ;
# ifdef LOSCFG_KERNEL_SMP
/* ASYNCHRONIZED. No need to do task lock checking */
if ( taskCB - > currCpu ! = ArchCurrCpuid ( ) ) {
/*
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <EFBFBD> CPU <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> С <EFBFBD>
* ʹ <EFBFBD> <EFBFBD> " kill " <EFBFBD> ź <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ŀ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ദ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȣ <EFBFBD>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܲ <EFBFBD> <EFBFBD> DZ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģ <EFBFBD> <EFBFBD> <EFBFBD> ɾ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ը <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD>
*/
taskCB - > signal = SIGNAL_KILL ;
LOS_MpSchedule ( taskCB - > currCpu ) ;
* ret = OsTaskSyncWait ( taskCB ) ;
return FALSE ;
}
# endif
if ( ! OsPreemptableInSched ( ) ) {
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ҵ<EFBFBD> <D2B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
* ret = LOS_ERRNO_TSK_DELETE_LOCKED ;
return FALSE ;
}
if ( OS_INT_ACTIVE ) {
/*
* <EFBFBD> <EFBFBD> <EFBFBD> ж <EFBFBD> <EFBFBD> <EFBFBD> ɾ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " kill " <EFBFBD> ź ţ <EFBFBD> <EFBFBD> Ժ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
*/
taskCB - > signal = SIGNAL_KILL ;
return FALSE ;
}
return TRUE ;
}
STATIC VOID OsTaskDeleteInactive ( LosProcessCB * processCB , LosTaskCB * taskCB )
{
LosMux * mux = ( LosMux * ) taskCB - > taskMux ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> <D6B8>
UINT16 taskStatus = taskCB - > taskStatus ; // <20> <> <EFBFBD> <EFBFBD> ״̬
LOS_ASSERT ( ! ( taskStatus & OS_TASK_STATUS_RUNNING ) ) ;
OsTaskReleaseHoldLock ( processCB , taskCB ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> Դ
OsSchedTaskExit ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˳<EFBFBD>
if ( taskStatus & OS_TASK_STATUS_PENDING ) {
if ( LOS_MuxIsValid ( mux ) = = TRUE ) {
OsMuxBitmapRestore ( mux , taskCB , ( LosTaskCB * ) mux - > owner ) ;
}
}
OsTaskStatusUnusedSet ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬Ϊδʹ <CEB4> <CAB9>
LOS_ListDelete ( & taskCB - > threadList ) ; // <20> <> <EFBFBD> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
processCB - > threadNumber - - ; // <20> <> <EFBFBD> ̵<EFBFBD> <CCB5> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> һ
LOS_ListTailInsert ( & g_taskRecycleList , & taskCB - > pendList ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return ;
}
LITE_OS_SEC_TEXT UINT32 OsTaskDeleteUnsafe ( LosTaskCB * taskCB , UINT32 status , UINT32 intSave )
{
LosProcessCB * processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
UINT32 mode = processCB - > processMode ; // <20> <> <EFBFBD> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ
UINT32 errRet = LOS_OK ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
if ( taskCB - > taskStatus & OS_TASK_FLAG_SYSTEM_TASK ) {
errRet = LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK ;
goto EXIT ;
}
if ( ( taskCB - > taskStatus & OS_TASK_STATUS_RUNNING ) & & ! OsRunTaskToDeleteCheckOnRun ( taskCB , & errRet ) ) {
goto EXIT ;
}
if ( ! ( taskCB - > taskStatus & OS_TASK_STATUS_RUNNING ) ) {
OsTaskDeleteInactive ( processCB , taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
OsWriteResourceEvent ( OS_RESOURCE_EVENT_FREE ) ;
return errRet ;
}
OsHookCall ( LOS_HOOK_TYPE_TASK_DELETE , taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> Ĺ<EFBFBD> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
if ( mode = = OS_USER_MODE ) {
SCHEDULER_UNLOCK ( intSave ) ;
OsTaskResourcesToFree ( taskCB ) ; // <20> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ
SCHEDULER_LOCK ( intSave ) ;
}
# ifdef LOSCFG_KERNEL_SMP
LOS_ASSERT ( OsPercpuGet ( ) - > taskLockCnt = = 1 ) ;
# else
LOS_ASSERT ( OsPercpuGet ( ) - > taskLockCnt = = 0 ) ;
# endif
OsRunTaskToDelete ( taskCB ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
EXIT :
SCHEDULER_UNLOCK ( intSave ) ;
return errRet ;
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete ( UINT32 taskID )
{
UINT32 intSave ;
UINT32 ret ;
LosTaskCB * taskCB = NULL ;
LosProcessCB * processCB = NULL ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
if ( OS_INT_ACTIVE ) {
return LOS_ERRNO_TSK_YIELD_IN_INT ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
ret = LOS_ERRNO_TSK_NOT_CREATED ;
OS_GOTO_ERREND ( ) ;
}
if ( taskCB - > taskStatus & ( OS_TASK_FLAG_SYSTEM_TASK | OS_TASK_FLAG_NO_DELETE ) ) {
SCHEDULER_UNLOCK ( intSave ) ;
OsBackTrace ( ) ;
return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK ;
}
processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̵Ľ<CCB5> <C4BD> ̿<EFBFBD> <CCBF> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
if ( processCB - > threadNumber = = 1 ) { /* 1: The last task of the process exits */
if ( processCB = = OsCurrProcessGet ( ) ) {
SCHEDULER_UNLOCK ( intSave ) ;
OsProcessExit ( taskCB , OS_PRO_EXIT_OK ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ˳<EFBFBD>
return LOS_OK ;
}
ret = LOS_ERRNO_TSK_ID_INVALID ;
OS_GOTO_ERREND ( ) ;
}
return OsTaskDeleteUnsafe ( taskCB , OS_PRO_EXIT_OK , intSave ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
LOS_ERREND :
SCHEDULER_UNLOCK ( intSave ) ;
return ret ;
}
LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay ( UINT32 tick )
{
UINT32 intSave ;
LosTaskCB * runTask = NULL ;
if ( OS_INT_ACTIVE ) {
PRINT_ERR ( " In interrupt not allow delay task! \n " ) ;
return LOS_ERRNO_TSK_DELAY_IN_INT ;
}
runTask = OsCurrTaskGet ( ) ; // <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
if ( runTask - > taskStatus & OS_TASK_FLAG_SYSTEM_TASK ) {
OsBackTrace ( ) ;
return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK ;
}
if ( ! OsPreemptable ( ) ) {
return LOS_ERRNO_TSK_DELAY_IN_LOCK ;
}
OsHookCall ( LOS_HOOK_TYPE_TASK_DELAY , tick ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> Ĺ<EFBFBD> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
if ( tick = = 0 ) {
return LOS_TaskYield ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ó<EFBFBD> CPU
}
SCHEDULER_LOCK ( intSave ) ;
OsSchedDelay ( runTask , tick ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD>
OsHookCall ( LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST , runTask ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƶ<EFBFBD> <C6B6> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> е Ĺ<D0B5> <C4B9> Ӻ<EFBFBD> <D3BA> <EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_OK ;
}
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet ( UINT32 taskID )
{
UINT32 intSave ;
LosTaskCB * taskCB = NULL ;
UINT16 priority ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return ( UINT16 ) OS_INVALID ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƿ<EFBFBD> ָ<EFBFBD> <D6B8>
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
SCHEDULER_UNLOCK ( intSave ) ;
return ( UINT16 ) OS_INVALID ;
}
priority = taskCB - > priority ; // <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD>
SCHEDULER_UNLOCK ( intSave ) ;
return priority ;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet ( UINT32 taskID , UINT16 taskPrio )
{
UINT32 intSave ;
LosTaskCB * taskCB = NULL ;
if ( taskPrio > OS_TASK_PRIORITY_LOWEST ) {
return LOS_ERRNO_TSK_PRIOR_ERROR ;
}
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ;
if ( taskCB - > taskStatus & OS_TASK_FLAG_SYSTEM_TASK ) {
return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK ;
}
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_ERRNO_TSK_NOT_CREATED ;
}
BOOL isReady = OsSchedModifyTaskSchedParam ( taskCB , taskCB - > policy , taskPrio ) ;
SCHEDULER_UNLOCK ( intSave ) ;
LOS_MpSchedule ( OS_MP_CPU_ALL ) ;
if ( isReady & & OS_SCHEDULER_ACTIVE ) {
LOS_Schedule ( ) ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet ( UINT16 taskPrio )
{
return LOS_TaskPriSet ( OsCurrTaskGet ( ) - > taskID , taskPrio ) ;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield ( VOID )
{
UINT32 intSave ;
if ( OS_INT_ACTIVE ) {
return LOS_ERRNO_TSK_YIELD_IN_INT ;
}
if ( ! OsPreemptable ( ) ) {
return LOS_ERRNO_TSK_YIELD_IN_LOCK ;
}
LosTaskCB * runTask = OsCurrTaskGet ( ) ;
if ( OS_TID_CHECK_INVALID ( runTask - > taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
SCHEDULER_LOCK ( intSave ) ;
/* reset timeslice of yielded task */
OsSchedYield ( ) ;
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_OK ;
}
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock ( VOID )
{
UINT32 intSave ;
intSave = LOS_IntLock ( ) ;
OsCpuSchedLock ( OsPercpuGet ( ) ) ;
LOS_IntRestore ( intSave ) ;
}
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock ( VOID )
{
OsCpuSchedUnlock ( OsPercpuGet ( ) , LOS_IntLock ( ) ) ;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet ( UINT32 taskID , TSK_INFO_S * taskInfo )
{
UINT32 intSave ;
LosTaskCB * taskCB = NULL ;
if ( taskInfo = = NULL ) {
return LOS_ERRNO_TSK_PTR_NULL ;
}
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ;
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_ERRNO_TSK_NOT_CREATED ;
}
if ( ! ( taskCB - > taskStatus & OS_TASK_STATUS_RUNNING ) | | OS_INT_ACTIVE ) {
taskInfo - > uwSP = ( UINTPTR ) taskCB - > stackPointer ;
} else {
taskInfo - > uwSP = ArchSPGet ( ) ;
}
taskInfo - > usTaskStatus = taskCB - > taskStatus ;
taskInfo - > usTaskPrio = taskCB - > priority ;
taskInfo - > uwStackSize = taskCB - > stackSize ;
taskInfo - > uwTopOfStack = taskCB - > topOfStack ;
taskInfo - > uwEventMask = taskCB - > eventMask ;
taskInfo - > taskEvent = taskCB - > taskEvent ;
taskInfo - > pTaskMux = taskCB - > taskMux ;
taskInfo - > uwTaskID = taskID ;
if ( strncpy_s ( taskInfo - > acName , LOS_TASK_NAMELEN , taskCB - > taskName , LOS_TASK_NAMELEN - 1 ) ! = EOK ) {
PRINT_ERR ( " Task name copy failed! \n " ) ;
}
taskInfo - > acName [ LOS_TASK_NAMELEN - 1 ] = ' \0 ' ;
taskInfo - > uwBottomOfStack = TRUNCATE ( ( ( UINTPTR ) taskCB - > topOfStack + taskCB - > stackSize ) ,
OS_TASK_STACK_ADDR_ALIGN ) ;
taskInfo - > uwCurrUsed = ( UINT32 ) ( taskInfo - > uwBottomOfStack - taskInfo - > uwSP ) ;
taskInfo - > bOvf = OsStackWaterLineGet ( ( const UINTPTR * ) taskInfo - > uwBottomOfStack ,
( const UINTPTR * ) taskInfo - > uwTopOfStack , & taskInfo - > uwPeakUsed ) ;
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_OK ;
}
LITE_OS_SEC_TEXT BOOL OsTaskCpuAffiSetUnsafe ( UINT32 taskID , UINT16 newCpuAffiMask , UINT16 * oldCpuAffiMask )
{
# ifdef LOSCFG_KERNEL_SMP
LosTaskCB * taskCB = OS_TCB_FROM_TID ( taskID ) ;
taskCB - > cpuAffiMask = newCpuAffiMask ;
* oldCpuAffiMask = CPUID_TO_AFFI_MASK ( taskCB - > currCpu ) ;
if ( ! ( ( * oldCpuAffiMask ) & newCpuAffiMask ) ) {
taskCB - > signal = SIGNAL_AFFI ;
return TRUE ;
}
# else
( VOID ) taskID ;
( VOID ) newCpuAffiMask ;
( VOID ) oldCpuAffiMask ;
# endif /* LOSCFG_KERNEL_SMP */
return FALSE ;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet ( UINT32 taskID , UINT16 cpuAffiMask )
{
LosTaskCB * taskCB = NULL ;
BOOL needSched = FALSE ;
UINT32 intSave ;
UINT16 currCpuMask ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ERRNO_TSK_ID_INVALID ;
}
if ( ! ( cpuAffiMask & LOSCFG_KERNEL_CPU_MASK ) ) {
return LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ;
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
SCHEDULER_UNLOCK ( intSave ) ;
return LOS_ERRNO_TSK_NOT_CREATED ;
}
needSched = OsTaskCpuAffiSetUnsafe ( taskID , cpuAffiMask , & currCpuMask ) ;
SCHEDULER_UNLOCK ( intSave ) ;
if ( needSched & & OS_SCHEDULER_ACTIVE ) {
LOS_MpSchedule ( currCpuMask ) ;
LOS_Schedule ( ) ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet ( UINT32 taskID )
{
# ifdef LOSCFG_KERNEL_SMP
# define INVALID_CPU_AFFI_MASK 0
LosTaskCB * taskCB = NULL ;
UINT16 cpuAffiMask ;
UINT32 intSave ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return INVALID_CPU_AFFI_MASK ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ;
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
SCHEDULER_UNLOCK ( intSave ) ;
return INVALID_CPU_AFFI_MASK ;
}
cpuAffiMask = taskCB - > cpuAffiMask ;
SCHEDULER_UNLOCK ( intSave ) ;
return cpuAffiMask ;
# else
( VOID ) taskID ;
return 1 ;
# endif
}
/*
* Description : Process pending signals tagged by others cores
*/
LITE_OS_SEC_TEXT_MINOR VOID OsTaskProcSignal ( VOID )
{
UINT32 intSave , ret ;
/*
* private and uninterruptable , no protection needed .
* while this task is always running when others cores see it ,
* so it keeps receiving signals while follow code executing .
*/
LosTaskCB * runTask = OsCurrTaskGet ( ) ;
if ( runTask - > signal = = SIGNAL_NONE ) {
return ;
}
if ( runTask - > signal & SIGNAL_KILL ) {
/*
* clear the signal , and do the task deletion . if the signaled task has been
* scheduled out , then this deletion will wait until next run .
*/
SCHEDULER_LOCK ( intSave ) ;
runTask - > signal = SIGNAL_NONE ;
ret = OsTaskDeleteUnsafe ( runTask , OS_PRO_EXIT_OK , intSave ) ;
if ( ret ) {
PRINT_ERR ( " Task proc signal delete task(%u) failed err:0x%x \n " , runTask - > taskID , ret ) ;
}
} else if ( runTask - > signal & SIGNAL_SUSPEND ) {
runTask - > signal & = ~ SIGNAL_SUSPEND ;
/* suspend killed task may fail, ignore the result */
( VOID ) LOS_TaskSuspend ( runTask - > taskID ) ;
# ifdef LOSCFG_KERNEL_SMP
} else if ( runTask - > signal & SIGNAL_AFFI ) {
runTask - > signal & = ~ SIGNAL_AFFI ;
/* pri-queue has updated, notify the target cpu */
LOS_MpSchedule ( ( UINT32 ) runTask - > cpuAffiMask ) ;
# endif
}
}
LITE_OS_SEC_TEXT INT32 OsSetTaskName ( LosTaskCB * taskCB , const CHAR * name , BOOL setPName )
{
UINT32 intSave ;
errno_t err ;
LosProcessCB * processCB = NULL ;
const CHAR * namePtr = NULL ;
CHAR nameBuff [ OS_TCB_NAME_LEN ] = { 0 } ;
if ( ( taskCB = = NULL ) | | ( name = = NULL ) ) {
return EINVAL ;
}
if ( LOS_IsUserAddress ( ( VADDR_T ) ( UINTPTR ) name ) ) {
err = LOS_StrncpyFromUser ( nameBuff , ( const CHAR * ) name , OS_TCB_NAME_LEN ) ;
if ( err < 0 ) {
return - err ;
}
namePtr = nameBuff ;
} else {
namePtr = name ;
}
SCHEDULER_LOCK ( intSave ) ;
err = strncpy_s ( taskCB - > taskName , OS_TCB_NAME_LEN , ( VOID * ) namePtr , OS_TCB_NAME_LEN - 1 ) ;
if ( err ! = EOK ) {
err = EINVAL ;
goto EXIT ;
}
err = LOS_OK ;
processCB = OS_PCB_FROM_PID ( taskCB - > processID ) ;
/* if thread is main thread, then set processName as taskName */
if ( ( taskCB - > taskID = = processCB - > threadGroupID ) & & ( setPName = = TRUE ) ) {
err = ( INT32 ) OsSetProcessName ( processCB , ( const CHAR * ) taskCB - > taskName ) ;
if ( err ! = LOS_OK ) {
err = EINVAL ;
}
}
EXIT :
SCHEDULER_UNLOCK ( intSave ) ;
return err ;
}
STATIC VOID OsExitGroupActiveTaskKilled ( LosProcessCB * processCB , LosTaskCB * taskCB )
{
INT32 ret ;
taskCB - > taskStatus | = OS_TASK_FLAG_EXIT_KILL ;
# ifdef LOSCFG_KERNEL_SMP
/* The other core that the thread is running on and is currently running in a non-system call */
if ( ! taskCB - > sig . sigIntLock & & ( taskCB - > taskStatus & OS_TASK_STATUS_RUNNING ) ) {
taskCB - > signal = SIGNAL_KILL ;
LOS_MpSchedule ( taskCB - > currCpu ) ;
} else
# endif
# ifdef LOSCFG_KERNEL_VM
{
ret = OsTaskKillUnsafe ( taskCB - > taskID , SIGKILL ) ;
if ( ret ! = LOS_OK ) {
PRINT_ERR ( " pid %u exit, Exit task group %u kill %u failed! ERROR: %d \n " ,
taskCB - > processID , OsCurrTaskGet ( ) - > taskID , taskCB - > taskID , ret ) ;
}
}
# endif
if ( ! ( taskCB - > taskStatus & OS_TASK_FLAG_PTHREAD_JOIN ) ) {
taskCB - > taskStatus | = OS_TASK_FLAG_PTHREAD_JOIN ;
LOS_ListInit ( & taskCB - > joinList ) ;
}
ret = OsTaskJoinPendUnsafe ( taskCB ) ;
if ( ret ! = LOS_OK ) {
PRINT_ERR ( " pid %u exit, Exit task group %u to wait others task %u(0x%x) exit failed! ERROR: %d \n " ,
taskCB - > processID , OsCurrTaskGet ( ) - > taskID , taskCB - > taskID , taskCB - > taskStatus , ret ) ;
}
}
LITE_OS_SEC_TEXT VOID OsTaskExitGroup ( UINT32 status )
{
UINT32 intSave ;
LosProcessCB * processCB = OsCurrProcessGet ( ) ;
LosTaskCB * currTask = OsCurrTaskGet ( ) ;
SCHEDULER_LOCK ( intSave ) ;
if ( ( processCB - > processStatus & OS_PROCESS_FLAG_EXIT ) | | ! OsProcessIsUserMode ( processCB ) ) {
SCHEDULER_UNLOCK ( intSave ) ;
return ;
}
processCB - > processStatus | = OS_PROCESS_FLAG_EXIT ;
processCB - > threadGroupID = currTask - > taskID ;
LOS_DL_LIST * list = & processCB - > threadSiblingList ;
LOS_DL_LIST * head = list ;
do {
LosTaskCB * taskCB = LOS_DL_LIST_ENTRY ( list - > pstNext , LosTaskCB , threadList ) ;
if ( ( taskCB - > taskStatus & ( OS_TASK_STATUS_INIT | OS_TASK_STATUS_EXIT ) | |
( ( taskCB - > taskStatus & OS_TASK_STATUS_READY ) & & ! taskCB - > sig . sigIntLock ) ) & &
! ( taskCB - > taskStatus & OS_TASK_STATUS_RUNNING ) ) {
OsTaskDeleteInactive ( processCB , taskCB ) ;
} else {
if ( taskCB ! = currTask ) {
OsExitGroupActiveTaskKilled ( processCB , taskCB ) ;
} else {
/* Skip the current task */
list = list - > pstNext ;
}
}
} while ( head ! = list - > pstNext ) ;
SCHEDULER_UNLOCK ( intSave ) ;
LOS_ASSERT ( processCB - > threadNumber = = 1 ) ;
return ;
}
LITE_OS_SEC_TEXT VOID OsExecDestroyTaskGroup ( VOID )
{
OsTaskExitGroup ( OS_PRO_EXIT_OK ) ;
OsTaskCBRecycleToFree ( ) ;
}
UINT32 OsUserTaskOperatePermissionsCheck ( LosTaskCB * taskCB )
{
return OsUserProcessOperatePermissionsCheck ( taskCB , OsCurrProcessGet ( ) - > processID ) ;
}
UINT32 OsUserProcessOperatePermissionsCheck ( LosTaskCB * taskCB , UINT32 processID )
{
if ( taskCB = = NULL ) {
return LOS_EINVAL ;
}
if ( processID = = OS_INVALID_VALUE ) {
return OS_INVALID_VALUE ;
}
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
return LOS_EINVAL ;
}
if ( processID ! = taskCB - > processID ) {
return LOS_EPERM ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsCreateUserTaskParamCheck ( UINT32 processID , TSK_INIT_PARAM_S * param )
{
UserTaskParam * userParam = NULL ;
if ( param = = NULL ) {
return OS_INVALID_VALUE ;
}
userParam = & param - > userParam ;
if ( ( processID = = OS_INVALID_VALUE ) & & ! LOS_IsUserAddress ( userParam - > userArea ) ) {
return OS_INVALID_VALUE ;
}
if ( ! LOS_IsUserAddress ( ( UINTPTR ) param - > pfnTaskEntry ) ) {
return OS_INVALID_VALUE ;
}
if ( userParam - > userMapBase & & ! LOS_IsUserAddressRange ( userParam - > userMapBase , userParam - > userMapSize ) ) {
return OS_INVALID_VALUE ;
}
if ( ! LOS_IsUserAddress ( userParam - > userSP ) ) {
return OS_INVALID_VALUE ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT_INIT UINT32 OsCreateUserTask ( UINT32 processID , TSK_INIT_PARAM_S * initParam )
{
LosProcessCB * processCB = NULL ;
UINT32 taskID ;
UINT32 ret ;
UINT32 intSave ;
ret = OsCreateUserTaskParamCheck ( processID , initParam ) ;
if ( ret ! = LOS_OK ) {
return ret ;
}
initParam - > uwStackSize = OS_USER_TASK_SYSCALL_STACK_SIZE ;
initParam - > usTaskPrio = OS_TASK_PRIORITY_LOWEST ;
initParam - > policy = LOS_SCHED_RR ;
if ( processID = = OS_INVALID_VALUE ) {
SCHEDULER_LOCK ( intSave ) ;
processCB = OsCurrProcessGet ( ) ;
initParam - > processID = processCB - > processID ;
initParam - > consoleID = processCB - > consoleID ;
SCHEDULER_UNLOCK ( intSave ) ;
} else {
processCB = OS_PCB_FROM_PID ( processID ) ;
if ( ! ( processCB - > processStatus & ( OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING ) ) ) {
return OS_INVALID_VALUE ;
}
initParam - > processID = processID ;
initParam - > consoleID = 0 ;
}
ret = LOS_TaskCreateOnly ( & taskID , initParam ) ;
if ( ret ! = LOS_OK ) {
return OS_INVALID_VALUE ;
}
return taskID ;
}
LITE_OS_SEC_TEXT INT32 LOS_GetTaskScheduler ( INT32 taskID )
{
UINT32 intSave ;
LosTaskCB * taskCB = NULL ;
INT32 policy ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return - LOS_EINVAL ;
}
taskCB = OS_TCB_FROM_TID ( taskID ) ;
SCHEDULER_LOCK ( intSave ) ;
if ( taskCB - > taskStatus & OS_TASK_STATUS_UNUSED ) {
policy = - LOS_EINVAL ;
OS_GOTO_ERREND ( ) ;
}
policy = taskCB - > policy ;
LOS_ERREND :
SCHEDULER_UNLOCK ( intSave ) ;
return policy ;
}
LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler ( INT32 taskID , UINT16 policy , UINT16 priority )
{
UINT32 intSave ;
BOOL needSched = FALSE ;
if ( OS_TID_CHECK_INVALID ( taskID ) ) {
return LOS_ESRCH ;
}
if ( priority > OS_TASK_PRIORITY_LOWEST ) {
return LOS_EINVAL ;
}
if ( ( policy ! = LOS_SCHED_FIFO ) & & ( policy ! = LOS_SCHED_RR ) ) {
return LOS_EINVAL ;
}
SCHEDULER_LOCK ( intSave ) ;
needSched = OsSchedModifyTaskSchedParam ( OS_TCB_FROM_TID ( taskID ) , policy , priority ) ;
SCHEDULER_UNLOCK ( intSave ) ;
LOS_MpSchedule ( OS_MP_CPU_ALL ) ;
if ( needSched & & OS_SCHEDULER_ACTIVE ) {
LOS_Schedule ( ) ;
}
return LOS_OK ;
}
LITE_OS_SEC_TEXT UINT32 LOS_GetSystemTaskMaximum ( VOID )
{
return g_taskMaxNum ;
}
LITE_OS_SEC_TEXT VOID OsWriteResourceEvent ( UINT32 events )
{
( VOID ) LOS_EventWrite ( & g_resourceEvent , events ) ;
}
LITE_OS_SEC_TEXT VOID OsWriteResourceEventUnsafe ( UINT32 events )
{
( VOID ) OsEventWriteUnsafe ( & g_resourceEvent , events , FALSE , NULL ) ;
}
STATIC VOID OsResourceRecoveryTask ( VOID )
{
UINT32 ret ;
while ( 1 ) {
ret = LOS_EventRead ( & g_resourceEvent , OS_RESOURCE_EVENT_MASK ,
LOS_WAITMODE_OR | LOS_WAITMODE_CLR , LOS_WAIT_FOREVER ) ;
if ( ret & ( OS_RESOURCE_EVENT_FREE | OS_RESOURCE_EVENT_OOM ) ) {
OsTaskCBRecycleToFree ( ) ;
OsProcessCBRecycleToFree ( ) ;
}
# ifdef LOSCFG_ENABLE_OOM_LOOP_TASK
if ( ret & OS_RESOURCE_EVENT_OOM ) {
( VOID ) OomCheckProcess ( ) ;
}
# endif
}
}
LITE_OS_SEC_TEXT UINT32 OsResourceFreeTaskCreate ( VOID )
{
UINT32 ret ;
UINT32 taskID ;
TSK_INIT_PARAM_S taskInitParam ;
ret = LOS_EventInit ( ( PEVENT_CB_S ) & g_resourceEvent ) ;
if ( ret ! = LOS_OK ) {
return LOS_NOK ;
}
( VOID ) memset_s ( ( VOID * ) ( & taskInitParam ) , sizeof ( TSK_INIT_PARAM_S ) , 0 , sizeof ( TSK_INIT_PARAM_S ) ) ;
taskInitParam . pfnTaskEntry = ( TSK_ENTRY_FUNC ) OsResourceRecoveryTask ;
taskInitParam . uwStackSize = OS_TASK_RESOURCE_STATIC_SIZE ;
taskInitParam . pcName = " ResourcesTask " ;
taskInitParam . usTaskPrio = OS_TASK_RESOURCE_FREE_PRIORITY ;
ret = LOS_TaskCreate ( & taskID , & taskInitParam ) ;
if ( ret = = LOS_OK ) {
OS_TCB_FROM_TID ( taskID ) - > taskStatus | = OS_TASK_FLAG_NO_DELETE ;
}
return ret ;
}
LOS_MODULE_INIT ( OsResourceFreeTaskCreate , LOS_INIT_LEVEL_KMOD_TASK ) ;