SylixOS内核全局变量的定义、声明与初始化

2023-11-03 06:18

本文主要是介绍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内核全局变量的定义、声明与初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336176

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Ubuntu22.04回退系统内核

文章目录 起因回退操作卸载内核禁止内核升级 起因 最近因为系统内核自动升级,导致显卡驱动检测不到,炼丹环境被破坏。无奈只能重装驱动,于是跟着手册操作发现驱动要求的是内核版本是5.15.0-25-generic,而我通过uname -r发现这时候的内核版本是6.8.0-40-generic,看来只能回退了。 我搜索了网上很多的文章,没有一篇文章能够完全解决这个问题,所以在我多次尝

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name