From 159d304275bb87c22646c19c6c1e80e0d1f285ba Mon Sep 17 00:00:00 2001 From: wangchen <253227059@qq.com> Date: Thu, 26 May 2022 06:42:36 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BC=80=E5=90=AFcpup=E5=90=8E=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=8C=82=E6=AD=BB=20=E3=80=90=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E3=80=91=E5=BC=80=E5=90=AFcpup=E5=90=8E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=8C=82=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【修改方案】 1, cpup开启后,task模块会在g_cpup初始化前赋值。 因此需提前cpup模块的初始化。 【影响】 对现有的产品编译不会有影响。 re #I59DDE Signed-off-by: wangchen https://gitee.com/openharmony/kernel_liteos_m/issues/I59DDE --- components/cpup/los_cpup.c | 46 +++++++++++++++++++++++--------------- components/cpup/los_cpup.h | 1 + kernel/src/los_init.c | 20 ++++++++++++----- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/components/cpup/los_cpup.c b/components/cpup/los_cpup.c index f802639f..b403ee31 100644 --- a/components/cpup/los_cpup.c +++ b/components/cpup/los_cpup.c @@ -117,7 +117,24 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsCpupGuardCreator(VOID) return LOS_OK; } #endif + +/***************************************************************************** +Function : OsCpupDaemonInit +Description: initialization of CPUP Daemon +Input : None +Return : LOS_OK or Error Information +*****************************************************************************/ +LITE_OS_SEC_TEXT_INIT UINT32 OsCpupDaemonInit() +{ +#if (LOSCFG_BASE_CORE_SWTMR == 1) + (VOID)OsCpupGuardCreator(); + g_irqCpupInitFlg = 1; #endif + + return LOS_OK; +} +#endif + /***************************************************************************** Function : OsCpupInit Description: initialization of CPUP @@ -127,32 +144,25 @@ Return : LOS_OK or Error Information LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit() { UINT32 size; + CHAR *cpupMem = NULL; size = g_taskMaxNum * sizeof(OsCpupCB); - g_cpup = (OsCpupCB *)LOS_MemAlloc(m_aucSysMem0, size); - - if (g_cpup == NULL) { - return LOS_ERRNO_CPUP_NO_MEMORY; - } - - // Ignore the return code when matching CSEC rule 6.6(3). - (VOID)memset_s(g_cpup, size, 0, size); - g_cpupInitFlg = 1; - #if (LOSCFG_CPUP_INCLUDE_IRQ == 1) - size = LOSCFG_PLATFORM_HWI_LIMIT * sizeof(OsIrqCpupCB); - g_irqCpup = (OsIrqCpupCB *)LOS_MemAlloc(m_aucSysMem0, size); - if (g_irqCpup == NULL) { + size += LOSCFG_PLATFORM_HWI_LIMIT * sizeof(OsIrqCpupCB); +#endif + + cpupMem = LOS_MemAlloc(m_aucSysMem0, size); + if (cpupMem == NULL) { return LOS_ERRNO_CPUP_NO_MEMORY; } + (VOID)memset_s(cpupMem, size, 0, size); - (VOID)memset_s(g_irqCpup, size, 0, size); -#if (LOSCFG_BASE_CORE_SWTMR == 1) - (VOID)OsCpupGuardCreator(); - g_irqCpupInitFlg = 1; + g_cpup = (OsCpupCB *)cpupMem; +#if (LOSCFG_CPUP_INCLUDE_IRQ == 1) + g_irqCpup = (OsIrqCpupCB *)(cpupMem + g_taskMaxNum * sizeof(OsCpupCB)); #endif -#endif + g_cpupInitFlg = 1; return LOS_OK; } diff --git a/components/cpup/los_cpup.h b/components/cpup/los_cpup.h index eec1f7f5..89e20cb5 100644 --- a/components/cpup/los_cpup.h +++ b/components/cpup/los_cpup.h @@ -171,6 +171,7 @@ typedef struct { */ extern UINT32 OsCpupInit(VOID); +extern UINT32 OsCpupDaemonInit(VOID); /** * @ingroup los_cpup * @brief Start task to get cycles count in current task ending. diff --git a/kernel/src/los_init.c b/kernel/src/los_init.c index 09c86187..6bba060a 100644 --- a/kernel/src/los_init.c +++ b/kernel/src/los_init.c @@ -181,6 +181,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID) OsTaskMonInit(); #endif +#if (LOSCFG_BASE_CORE_CPUP == 1) + ret = OsCpupInit(); + if (ret != LOS_OK) { + PRINT_ERR("OsCpupInit error\n"); + return ret; + } +#endif + #if (LOSCFG_BASE_IPC_SEM == 1) ret = OsSemInit(); if (ret != LOS_OK) { @@ -211,12 +219,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID) } #endif -#if (LOSCFG_BASE_CORE_CPUP == 1) - ret = OsCpupInit(); - if (ret != LOS_OK) { - PRINT_ERR("OsCpupInit error\n"); - return ret; - } +#if (LOSCFG_CPUP_INCLUDE_IRQ == 1) + ret = OsCpupDaemonInit(); + if (ret != LOS_OK) { + PRINT_ERR("OsCpupDaemonInit error\n"); + return ret; + } #endif #if (LOSCFG_FS_VFS == 1)