本文主要是介绍SylixOS内核全局变量的定义、声明与初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概要
SylixOS内核用到了很多全局变量,如:内核配置参数,系统状态,内核工作队列,系统时间计数器、定时器缓冲区、内核堆等等。这些全局变量在很多地方会被访问,SylixOS就把它们统一在一处进行定义,声明和初始化。这篇我们不关心这些全局变量的具体含义和功能,只是从宏观的角度去了解SylixOS内核中全局变量的位置和实现方法。
定义和声明的代码实现比较接近,通过一个小技巧可以把它们写到同一个头文件中。除非定义时需要有初始化值,否则对统一变量的定义和声明是同一行代码实现的。技巧在于每个变量的定义前都有一个__KERNEL_EXT
宏,根据条件编译的不同,展开为空时是变量定义,展开为关键字extern
时为变量声明。而如何展开则是受是否定义__KERNEL_MAIN_FILE
宏为依据。需要使用这些变量的源文件都要包含该头文件,而只有需要定义这些变量的唯一源文件中,在头文件包含之前会定义__KERNEL_MAIN_FILE
宏。
头文件中的关键代码
#ifdef __KERNEL_MAIN_FILE
#define __KERNEL_EXT
#else
#define __KERNEL_EXT extern
#endif/*********************************************************************************************************内核调试信息打印接口
*********************************************************************************************************/
__KERNEL_EXT VOIDFUNCPTR _K_pfuncKernelDebugLog; /* 内核调试信息 */
__KERNEL_EXT VOIDFUNCPTR _K_pfuncKernelDebugError; /* 内核错误信息 */
C文件中的关键代码
#define __SYLIXOS_KERNEL
#define __KERNEL_NCPUS_SET
#define __KERNEL_MAIN_FILE //只有唯一需要则正定义这些变量的源文件才会定义该宏,且不需位于头文件包含之前
#include "../SylixOS/kernel/include/k_kernel.h" //该头文件中包括k_globalvar.h
源码
SylixOS内核中所有全局变量定义和声明在libsylixos\SylixOS\kernel\include\k_globalvar.h
文件中。而所有初始化都在libsylixos\SylixOS\kernel\core\_GlobalInit.c
文件中。
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM)
**
** Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: k_globalvar.h
**
** 创 建 人: Han.Hui (韩辉)
**
** 文件创建日期: 2006 年 12 月 12 日
**
** 描 述: 这是系统全局变量定义文件。** BUG
2007.09.12 加入了可裁剪宏限制。
2007.11.07 将用户堆正式命名为内核堆.
2007.12.06 系统线程建立时,直接进入安全模式,不能被删除.
2008.01.20 删除了全局的调度器锁变量, 改由线程私有锁代替.
2008.01.24 增加 启动时临时截获 TCB .
2008.01.24 增加可以裁剪的 LOGO 图标.
2008.05.18 加入 _K_iKernelStatus 变量, 此变量为内核态的状态变量!
2008.06.27 线程属性快不进入安全模式.
2009.09.30 加入原子操作自旋锁.
2010.01.22 内核任务扫描连加入链尾.
2010.08.03 加入 tick spinlock.
2012.03.19 将调度器参数改为多核兼容方式.
2013.07.17 加入 _K_bMultiTaskStart 主核在初始化结束后将此变量设为 LW_TRUE 告知其他的 CPU 可以进入多任务模式.
2013.07.19 内核状态不再放在此处, 而应该放在每一个 CPU 中.
*********************************************************************************************************/#ifndef __K_GLOBALVAR_H
#define __K_GLOBALVAR_H#ifdef __KERNEL_MAIN_FILE
#define __KERNEL_EXT
#else
#define __KERNEL_EXT extern
#endif/*********************************************************************************************************内核调试信息打印接口
*********************************************************************************************************/
__KERNEL_EXT VOIDFUNCPTR _K_pfuncKernelDebugLog; /* 内核调试信息 */
__KERNEL_EXT VOIDFUNCPTR _K_pfuncKernelDebugError; /* 内核错误信息 */
/*********************************************************************************************************HOOK TABLE
*********************************************************************************************************/
#ifdef __KERNEL_MAIN_FILELW_CLASS_TIMING _K_timingKernel = {100, 10000000, 100, 5, 1, 10, LW_CFG_SLICE_DEFAULT};
#else
__KERNEL_EXT LW_CLASS_TIMING _K_timingKernel; /* 内核时间参数集合 */
#endif /* __KERNEL_MAIN_FILE */
/*********************************************************************************************************HOOK TABLE
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_HOOK _K_hookKernel; /* 内核动态钩子函数定义 */
/*********************************************************************************************************内核配置参数
*********************************************************************************************************/
__KERNEL_EXT ULONG _K_ulKernFlags; /* 内核配置参数 */
/*********************************************************************************************************系统中断向量表
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_INTDESC _K_idescTable[LW_CFG_MAX_INTER_SRC];
#ifdef __KERNEL_MAIN_FILE
LW_SPINLOCK_CA_DEFINE_CACHE_ALIGN (_K_slcaVectorTable);
#else
__KERNEL_EXT LW_SPINLOCK_CA_DECLARE (_K_slcaVectorTable);
#endif /* __KERNEL_MAIN_FILE */
/*********************************************************************************************************系统状态
*********************************************************************************************************/
__KERNEL_EXT UINT8 _K_ucSysStatus; /* 系统状态 */
__KERNEL_EXT ULONG _K_ulNotRunError; /* 系统未启动错误代码存放 */
/*********************************************************************************************************内核工作队列
*********************************************************************************************************/
__KERNEL_EXT LW_JOB_QUEUE _K_jobqKernel; /* 内核工作队列 */
__KERNEL_EXT LW_JOB_MSG _K_jobmsgKernel[LW_CFG_MAX_EXCEMSGS];
/*********************************************************************************************************TICK (由于大量的应用软件都将 SylixOS 时钟定义为 ulong 型, 在 32 位机器上, 扩展使用 64 位 tick 会有历史遗留问题, 所以这里只能加入一个溢出计数器)
*********************************************************************************************************/
__KERNEL_EXT atomic64_t _K_atomic64KernelTime; /* 系统时间计数器 */
#if LW_CFG_THREAD_CPU_USAGE_CHK_EN > 0
__KERNEL_EXT ULONG _K_ulCPUUsageTicks; /* 利用率测算计数器 */
__KERNEL_EXT ULONG _K_ulCPUUsageKernelTicks; /* 内核利用率测算 */
__KERNEL_EXT BOOL _K_ulCPUUsageEnable; /* 是否使能CPU利用率测算 */
#endif
/*********************************************************************************************************线程数计数器
*********************************************************************************************************/
__KERNEL_EXT UINT16 _K_usThreadCounter; /* 线程数量 */
/*********************************************************************************************************IDLE 线程定义
*********************************************************************************************************/
__KERNEL_EXT LW_OBJECT_ID _K_ulIdleId[LW_CFG_MAX_PROCESSORS];
__KERNEL_EXT PLW_CLASS_TCB _K_ptcbIdle[LW_CFG_MAX_PROCESSORS];/* 空闲线程 ID 及 TCB */
/*********************************************************************************************************ITIMER 线程定义
*********************************************************************************************************/
__KERNEL_EXT LW_OBJECT_ID _K_ulThreadItimerId; /* 内部定时器服务线程 */
/*********************************************************************************************************堆栈相关
*********************************************************************************************************/
__KERNEL_EXT LW_STACK _K_stkFreeFlag; /* 空闲堆栈区域标志 */
/*********************************************************************************************************定时器
*********************************************************************************************************/
#if ((LW_CFG_HTIMER_EN > 0) || (LW_CFG_ITIMER_EN > 0)) && (LW_CFG_MAX_TIMERS)
__KERNEL_EXT LW_CLASS_TIMER _K_tmrBuffer[LW_CFG_MAX_TIMERS]; /* 定时器缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcTmr; /* 定时器对象资源管理 */
#if (LW_CFG_HTIMER_EN > 0)
__KERNEL_EXT LW_CLASS_WAKEUP _K_wuHTmr; /* 高速定时器管理表 */
#endif
#if (LW_CFG_ITIMER_EN > 0)
__KERNEL_EXT LW_CLASS_WAKEUP _K_wuITmr; /* 普通定时器管理表 */
#endif
#endif
/*********************************************************************************************************RTC
*********************************************************************************************************/
#if LW_CFG_RTC_EN > 0
__KERNEL_EXT INT32 _K_iTODDelta; /* 系统时钟微调 tick 参数 */
__KERNEL_EXT INT32 _K_iTODDeltaNs; /* 系统时钟微调 ns 参数 */
__KERNEL_EXT struct timespec _K_tvTODCurrent; /* 当前TOD时间 CLOCK_REALTIME */
__KERNEL_EXT struct timespec _K_tvTODMono; /* MonoTOD时间 CLOCK_MONOTONIC */
#endif /* LW_CFG_RTC_EN > 0 */
/*********************************************************************************************************PARTITION 缓冲区 (_part 为类型,避免 ppart 前缀命名出现歧异,ppart 应为 p_part)
*********************************************************************************************************/
#if (LW_CFG_PARTITION_EN > 0) && (LW_CFG_MAX_PARTITIONS > 0)
__KERNEL_EXT LW_CLASS_PARTITION _K__partBuffer[LW_CFG_MAX_PARTITIONS];/* PARTITION 缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcPart; /* PARTITION 对象资源管理 */
#endif
/*********************************************************************************************************堆操作缓冲区
*********************************************************************************************************/
__KERNEL_EXT PLW_CLASS_HEAP _K_pheapKernel; /* 内核堆 */
__KERNEL_EXT PLW_CLASS_HEAP _K_pheapSystem; /* 系统堆 */
/*********************************************************************************************************堆控制块
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_HEAP _K_heapBuffer[2 + LW_CFG_MAX_REGIONS];/* 系统堆建立 *//* 系统使用两个堆 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcHeap; /* 内存堆对象资源管理 */
__KERNEL_EXT BOOL _K_bHeapCrossBorderEn; /* 内存越界检查 */
/*********************************************************************************************************RMS
*********************************************************************************************************/
#if (LW_CFG_RMS_EN > 0) && (LW_CFG_MAX_RMSS > 0)
__KERNEL_EXT LW_CLASS_RMS _K_rmsBuffer[LW_CFG_MAX_RMSS]; /* RMS 缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcRms; /* RMS 对象资源管理 */
#endif
/*********************************************************************************************************TCB 管理表表头
*********************************************************************************************************/
__KERNEL_EXT LW_LIST_LINE_HEADER _K_plineTCBHeader; /* 管理表头 */
/*********************************************************************************************************TCB 内核扫描链
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_WAKEUP _K_wuDelay; /* 超时唤醒的链表 */
#if LW_CFG_SOFTWARE_WATCHDOG_EN > 0
__KERNEL_EXT LW_CLASS_WAKEUP _K_wuWatchDog; /* 看门狗扫描表 */
#endif
/*********************************************************************************************************事件控件缓冲区
*********************************************************************************************************/
#if (LW_CFG_EVENT_EN > 0) && (LW_CFG_MAX_EVENTS > 0)
__KERNEL_EXT LW_CLASS_EVENT _K_eventBuffer[LW_CFG_MAX_EVENTS]; /* 事件控制块缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcEvent; /* 事件对象资源管理 */
#endif
/*********************************************************************************************************消息队列缓冲区
*********************************************************************************************************/
#if (LW_CFG_MSGQUEUE_EN > 0) && (LW_CFG_MAX_MSGQUEUES > 0)
__KERNEL_EXT LW_CLASS_MSGQUEUE _K_msgqueueBuffer[LW_CFG_MAX_MSGQUEUES];/* 消息队列控制块缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcMsgQueue; /* 消息队列对象资源管理 */
#endif
/*********************************************************************************************************事件标志组
*********************************************************************************************************/
#if (LW_CFG_EVENTSET_EN > 0) && (LW_CFG_MAX_EVENTSETS > 0)
__KERNEL_EXT LW_CLASS_EVENTSET _K_esBuffer[LW_CFG_MAX_EVENTSETS]; /* 事件集控制块缓冲区 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcEventSet; /* 事件集对象资源管理 */
#endif
/*********************************************************************************************************THREAD VAR
*********************************************************************************************************/
#if (LW_CFG_SMP_EN == 0) && (LW_CFG_THREAD_PRIVATE_VARS_EN > 0) && (LW_CFG_MAX_THREAD_GLB_VARS > 0)
__KERNEL_EXT LW_CLASS_THREADVAR _K_threavarBuffer[LW_CFG_MAX_THREAD_GLB_VARS];/* 私有变量控制块 */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcThreadVar; /* 私有变量对象资源管理 */
#endif
/*********************************************************************************************************THREAD
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_TCB _K_tcbBuffer[LW_CFG_MAX_THREADS]; /* TCB 分配池 */
__KERNEL_EXT LW_CLASS_WAITJOIN _K_twjTable[LW_CFG_MAX_THREADS]; /* TCB POSIX 线程 wait join */
__KERNEL_EXT LW_CLASS_OBJECT_RESRC _K_resrcTcb; /* TCB 对象资源管理 */
/*********************************************************************************************************私有化全局变量
*********************************************************************************************************/
#if (LW_CFG_SMP_EN == 0) && (LW_CFG_THREAD_PRIVATE_VARS_EN > 0) && (LW_CFG_MAX_THREAD_GLB_VARS > 0)
__KERNEL_EXT LW_CLASS_THREADVAR _K_privatevarBuffer[LW_CFG_MAX_THREAD_GLB_VARS];
#endif
/*********************************************************************************************************全局就绪位图表
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_PCBBMAP _K_pcbbmapGlobalReady;
/*********************************************************************************************************线程 TCB 地址表
*********************************************************************************************************/
__KERNEL_EXT PLW_CLASS_TCB _K_ptcbTCBIdTable[LW_CFG_MAX_THREADS];
/*********************************************************************************************************CPU 与 物理 CPU 个数
*********************************************************************************************************/
#ifdef __KERNEL_NCPUS_SET
#ifdef __KERNEL_MAIN_FILE
__KERNEL_EXT ULONG _K_ulNCpus = 1;
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)
__KERNEL_EXT ULONG _K_ulNPhyCpus = 1;
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */
#else /* !__KERNEL_MAIN_FILE */
__KERNEL_EXT ULONG _K_ulNCpus;
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)
__KERNEL_EXT ULONG _K_ulNPhyCpus;
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */
#endif /* __KERNEL_MAIN_FILE */
#else /* !__KERNEL_NCPUS_SET */
__KERNEL_EXT const ULONG _K_ulNCpus;
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)
__KERNEL_EXT const ULONG _K_ulNPhyCpus;
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */
#endif /* __KERNEL_NCPUS_SET */
/*********************************************************************************************************CPU 表与 内核锁
*********************************************************************************************************/
#ifdef __KERNEL_MAIN_FILE /* 每个 CPU 的内容 */LW_CLASS_CPU _K_cpuTable[LW_CFG_MAX_PROCESSORS] LW_CACHE_LINE_ALIGN;
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)LW_CLASS_PHYCPU _K_phycpuTable[LW_CFG_MAX_PROCESSORS] LW_CACHE_LINE_ALIGN;
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */LW_CLASS_KERNLOCK _K_klKernel;
#else
__KERNEL_EXT LW_CLASS_CPU _K_cpuTable[LW_CFG_MAX_PROCESSORS];
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)
__KERNEL_EXT LW_CLASS_PHYCPU _K_phycpuTable[LW_CFG_MAX_PROCESSORS];
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */
__KERNEL_EXT LW_CLASS_KERNLOCK _K_klKernel; /* 内核锁 */
#endif /* __KERNEL_MAIN_FILE */
/*********************************************************************************************************原子操作锁
*********************************************************************************************************/
#ifdef __KERNEL_MAIN_FILE
LW_SPINLOCK_CA_DEFINE_CACHE_ALIGN (_K_slcaAtomic);
#else
__KERNEL_EXT LW_SPINLOCK_CA_DECLARE (_K_slcaAtomic); /* 原子操作锁 */
#endif /* __KERNEL_MAIN_FILE */
/*********************************************************************************************************启动时临时截获 TCB
*********************************************************************************************************/
__KERNEL_EXT LW_CLASS_TCB _K_tcbDummy[LW_CFG_MAX_PROCESSORS];
/*********************************************************************************************************系统 LOGO
*********************************************************************************************************/
#if LW_CFG_KERNEL_LOGO > 0
#ifdef __KERNEL_MAIN_FILEconst CHAR _K_cKernelLogo[] = __SYLIXOS_LOGO;
#else
__KERNEL_EXT const CHAR _K_cKernelLogo[];
#endif /* __KERNEL_MAIN_FILE */
#endif /* LW_CFG_KERNEL_LOGO > 0 */#endif /* __K_GLOBALVAR_H */
/*********************************************************************************************************END
*********************************************************************************************************/
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM) LW : long wing
**
** Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: _GlobalInit.c
**
** 创 建 人: Han.Hui (韩辉)
**
** 文件创建日期: 2006 年 12 月 13 日
**
** 描 述: 这是系统初始化函数库。** BUG
2007.03.22 加入系统没有启动时的错误处理机制
2007.04.12 加入中断堆栈区基地址初始化
2007.04.12 清空中断堆栈
2007.06.06 最高中断嵌套层数清零
2008.01.20 取消对线程调度器锁的全局变量初始化.
2008.03.29 初始化分化出来的等待链表和看门狗链表的链表头.
2009.04.29 加入对 SMP 相关内核锁的初始化.
2009.10.12 加入对 CPU ID 的初始化.
2009.11.01 修正注释.10.31日, 我国伟大的科学家钱学森逝世, 享年98岁. 作者对钱老无比敬佩! 借用<士兵突击>中高诚的一句话追思钱老, "信念这东西, 还真不是说出来的, 是做出来的!". 也借此勉励自己.
2010.01.22 加入内核线程扫描链尾的初始化.
2010.08.03 加入 tick spinlock 初始化.
2012.07.04 合并 hook 初始化.
2012.09.11 _GlobalInit() 中加入对 FPU 的初始化.
2013.12.19 去掉 FPU 的初始化, 放在 bsp 内核初始化回调中进行, 用户需要指定 fpu 的名称.
2017.08.17 中断堆栈 ARCH_STK_ALIGN_SIZE 字节对齐, 确保不同体系架构安全.
*********************************************************************************************************/
#define __SYLIXOS_KERNEL
#define __KERNEL_NCPUS_SET
#define __KERNEL_MAIN_FILE /* 这是系统主文件 */
#include "../SylixOS/kernel/include/k_kernel.h"
/*********************************************************************************************************中断堆栈定义
*********************************************************************************************************/
LW_STACK _K_stkInterruptStack[LW_CFG_MAX_PROCESSORS][LW_CFG_INT_STK_SIZE / sizeof(LW_STACK)];
/*********************************************************************************************************
** 函数名称: __interPrimaryStackInit
** 功能描述: 初始化中断堆栈, (SylixOS 在 SMP 中每一个 CPU 都可以接受中断)
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static VOID __interPrimaryStackInit (VOID)
{REGISTER INT i;PLW_CLASS_CPU pcpu;PLW_STACK pstk;LW_SPIN_INIT(&_K_slcaVectorTable.SLCA_sl);for (i = 0; i < LW_CFG_MAX_PROCESSORS; i++) {pcpu = LW_CPU_GET(i);
#if CPU_STK_GROWTH == 0pstk = &_K_stkInterruptStack[i][0];pcpu->CPU_pstkInterBase = (PLW_STACK)ROUND_UP(pstk, ARCH_STK_ALIGN_SIZE);
#elsepstk = &_K_stkInterruptStack[i][(LW_CFG_INT_STK_SIZE / sizeof(LW_STACK)) - 1];pcpu->CPU_pstkInterBase = (PLW_STACK)ROUND_DOWN(pstk, ARCH_STK_ALIGN_SIZE);
#endif /* CPU_STK_GROWTH */lib_memset(_K_stkInterruptStack[i], LW_CFG_STK_EMPTY_FLAG, LW_CFG_INT_STK_SIZE);}
}
/*********************************************************************************************************
** 函数名称: __interSecondaryStackInit
** 功能描述: 初始化中断堆栈
** 输 入 : ulCPUId CPU ID
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0static VOID __interSecondaryStackInit (ULONG ulCPUId)
{lib_memset(_K_stkInterruptStack[ulCPUId], LW_CFG_STK_EMPTY_FLAG, LW_CFG_INT_STK_SIZE);
}#endif /* LW_CFG_SMP_EN > 0 */
/*********************************************************************************************************
** 函数名称: __cpuPrimaryInit
** 功能描述: 操作系统 CPU 控制块结构初始化
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
** 注 意 : 为了防止有些处理器在 CACHE 打开之前不能使用原子指令, 这里直接使用赋值方式.
*********************************************************************************************************/
static VOID __cpuPrimaryInit (VOID)
{REGISTER INT i;for (i = 0; i < LW_CFG_MAX_PROCESSORS; i++) {LW_CPU_GET(i)->CPU_ulStatus = 0ul; /* CPU INACTIVE */LW_SPIN_INIT(&_K_tcbDummy[i].TCB_slLock); /* 初始化自旋锁 */#if LW_CFG_SMP_EN > 0LW_CPU_ONLY_AFFINITY_SET(LW_CPU_GET(i), LW_FALSE);LW_CPU_GET(i)->CPU_iIPIPend.counter = 0; /* 清除所有中断标志 */
#endif /* LW_CFG_SMP_EN > 0 */}
}
/*********************************************************************************************************
** 函数名称: __cpuSecondaryInit
** 功能描述: 操作系统 CPU 控制块结构初始化
** 输 入 : ulCPUId CPU ID
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0static VOID __cpuSecondaryInit (ULONG ulCPUId)
{LW_CPU_GET(ulCPUId)->CPU_ulStatus = 0ul; /* CPU INACTIVE */LW_SPIN_INIT(&_K_tcbDummy[ulCPUId].TCB_slLock); /* 初始化自旋锁 */#if LW_CFG_SMP_EN > 0LW_CPU_ONLY_AFFINITY_SET(LW_CPU_GET(ulCPUId), LW_FALSE);LW_CPU_GET(ulCPUId)->CPU_iIPIPend.counter = 0; /* 清除所有中断标志 */
#endif /* LW_CFG_SMP_EN > 0 */
}#endif /* LW_CFG_SMP_EN > 0 */
/*********************************************************************************************************
** 函数名称: __miscPrimarySmpInit
** 功能描述: 与 SMP 有关的全局变量初始化
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static VOID __miscPrimarySmpInit (VOID)
{REGISTER INT i;
#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)ULONG ulMaxPhyId = 0;
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */PLW_CLASS_CPU pcpu;for (i = 0; i < LW_CFG_MAX_PROCESSORS; i++) {pcpu = LW_CPU_GET(i);LW_CAND_TCB(pcpu) = LW_NULL; /* 候选运行表为空 */LW_CAND_ROT(pcpu) = LW_FALSE; /* 没有优先级卷绕 */pcpu->CPU_ulCPUId = (ULONG)i;pcpu->CPU_iKernelCounter = 1; /* 初始化 1, 当前不允许调度 */#if LW_CFG_SMP_EN > 0LW_CPU_ONLY_AFFINITY_SET(pcpu, LW_FALSE);
#if LW_CFG_CACHE_EN > 0pcpu->CPU_bCacheBarrier = LW_FALSE;
#endif /* LW_CFG_CACHE_EN > 0 */pcpu->CPU_ulIPIVector = __ARCH_ULONG_MAX; /* 目前不确定核间中断向量 */LW_SPIN_INIT(&pcpu->CPU_slIpi); /* 初始化 CPU spinlock */
#endif /* LW_CFG_SMP_EN > 0 */}#if (LW_CFG_SMP_EN > 0) && (LW_CFG_CPU_ARCH_SMT > 0)LW_CPU_FOREACH (i) {pcpu = LW_CPU_GET(i);pcpu->CPU_ulPhyId = bspCpuLogic2Physical((ULONG)i); /* 获得物理 CPU ID */_BugFormat(pcpu->CPU_ulPhyId >= LW_NCPUS, LW_TRUE, "Physical CPU ID error: %lu\r\n", pcpu->CPU_ulPhyId);if (ulMaxPhyId < pcpu->CPU_ulPhyId) {ulMaxPhyId = pcpu->CPU_ulPhyId;}}_K_ulNPhyCpus = ulMaxPhyId + 1; /* 统计物理 CPU 个数 */
#endif /* LW_CFG_CPU_ARCH_SMT > 0 */
}
/*********************************************************************************************************
** 函数名称: __miscSecondarySmpInit
** 功能描述: 与 SMP 有关的全局变量初始化
** 输 入 : ulCPUId CPU ID
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0static VOID __miscSecondarySmpInit (ULONG ulCPUId)
{PLW_CLASS_CPU pcpu = LW_CPU_GET(ulCPUId);LW_CAND_TCB(pcpu) = LW_NULL; /* 候选运行表为空 */LW_CAND_ROT(pcpu) = LW_FALSE; /* 没有优先级卷绕 */pcpu->CPU_iKernelCounter = 1; /* 初始化 1, 当前不允许调度 */pcpu->CPU_ulIPIVector = __ARCH_ULONG_MAX; /* 目前不确定核间中断向量 */LW_SPIN_INIT(&pcpu->CPU_slIpi); /* 初始化 CPU spinlock */
}#endif /* LW_CFG_SMP_EN > 0 */
/*********************************************************************************************************
** 函数名称: _GlobalPrimaryInit
** 功能描述: 初始化零散全局变量
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID _GlobalPrimaryInit (VOID)
{LW_SYS_STATUS_SET(LW_SYS_STATUS_INIT); /* 系统状态为初始化状态 *//** 内核关键性自旋锁初始化*/LW_SPIN_INIT(&_K_klKernel.KERN_slLock); /* 初始化内核自旋锁 */LW_SPIN_INIT(&_K_slcaAtomic.SLCA_sl); /* 初始化原子操作自旋锁 *//** 内核关键性数据结构初始化*/__cpuPrimaryInit(); /* CPU 结构初始化 */__interPrimaryStackInit(); /* 首先初始化中断堆栈 */__miscPrimarySmpInit(); /* SMP 相关初始化 *//** 内核关键性状态变量初始化*/_K_atomic64KernelTime.counter = 0;#if LW_CFG_THREAD_CPU_USAGE_CHK_EN > 0_K_ulCPUUsageTicks = 1ul; /* 避免除 0 错误 */_K_ulCPUUsageKernelTicks = 0ul;
#endif_K_usThreadCounter = 0; /* 线程数量 */_K_plineTCBHeader = LW_NULL; /* TCB 管理链表头 */_K_ulNotRunError = 0ul; /* 系统未启动时错误存放变量 */__WAKEUP_INIT(&_K_wuDelay, LW_NULL, LW_NULL);
#if LW_CFG_SOFTWARE_WATCHDOG_EN > 0__WAKEUP_INIT(&_K_wuWatchDog, LW_NULL, LW_NULL);
#endif /* LW_CFG_SOFTWARE_WATCHDOG_EN */#if LW_CFG_THREAD_CPU_USAGE_CHK_EN > 0__LW_TICK_CPUUSAGE_DISABLE(); /* 关闭 CPU 利用率测试 */
#endif /* LW_CFG_THREAD_CPU_USAGE_... */
}
/*********************************************************************************************************
** 函数名称: _GlobalSecondaryInit
** 功能描述: 初始化零散全局变量
** 输 入 : NONE
** 输 出 : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0VOID _GlobalSecondaryInit (VOID)
{ULONG ulCPUId = LW_CPU_GET_CUR_ID();__cpuSecondaryInit(ulCPUId); /* CPU 结构初始化 */__interSecondaryStackInit(ulCPUId); /* 首先初始化中断堆栈 */__miscSecondarySmpInit(ulCPUId); /* SMP 相关初始化 */
}#endif
/*********************************************************************************************************END
*********************************************************************************************************/
这篇关于SylixOS内核全局变量的定义、声明与初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!