los_percpu_pri.h 4.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/*
 * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
 * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
 *    of conditions and the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without specific prior written
 *    permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _LOS_PERCPU_PRI_H
#define _LOS_PERCPU_PRI_H

#include "los_base.h"
#include "los_hw_cpu.h"
37
#include "los_spinlock.h"
38 39 40 41 42 43 44 45
#include "los_sortlink_pri.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */

46
#ifdef LOSCFG_KERNEL_SMP
47 48 49
/*! \enum

*/
50
typedef enum {
51 52 53
    CPU_RUNNING = 0,   ///< cpu is running | CPU正在运行状态
    CPU_HALT,          ///< cpu in the halt | CPU处于暂停状态
    CPU_EXC            ///< cpu in the exc | CPU处于异常状态
54 55
} ExcFlag;
#endif
56

57
/*! \struct  内核对cpu的描述, per-CPU变量是linux系统一个非常有趣的特性,它为系统中的每个处理器都分配了该变量的副本。
58 59
 * 这样做的好处是,在多处理器系统中,当处理器操作属于它的变量副本时,不需要考虑与其他处理器的竞争的问题,
 */
60
typedef struct {
61
    SortLinkAttribute taskSortLink;             /*! task sort link | 挂等待和延时的任务,这些任务从任务就绪队列中来,等待最后CPU执行 */
62 63 64 65
    SPIN_LOCK_S       taskSortLinkSpin;      ///<  task sort link spin lock | 操作taskSortLink链表的自旋锁
    SortLinkAttribute swtmrSortLink;         ///<  swtmr sort link | 挂还没到时间的定时器	
    SPIN_LOCK_S       swtmrSortLinkSpin;     ///<  swtmr sort link spin lock |* 操作swtmrSortLink链表的自旋锁
    UINT64            responseTime;          ///<  Response time for current nuclear Tick interrupts | 当前CPU核 Tick 中断的响应时间
66 67
    UINT64            tickStartTime;         ///<  The time when the tick interrupt starts processing | 开始处理tick中断的时间
    UINT32            responseID;            ///<  The response ID of the current nuclear TICK interrupt | 当前CPU核TICK中断的响应任务ID
68 69 70 71 72 73
    UINTPTR           runProcess;            ///<  The address of the process control block pointer to which the current kernel is running | 当前进程控制块地址
    UINT32 idleTaskID;                          ///<  idle task id | 每个CPU都有一个空闲任务 见于 OsIdleTaskCreate
    UINT32 taskLockCnt;                         ///<  task lock flag | 任务锁的数量,当 > 0 的时候,需要重新调度了
    UINT32 swtmrHandlerQueue;                   ///<  software timer timeout queue id | 软时钟超时队列句柄
    UINT32 swtmrTaskID;                         ///<  software timer task id | 软时钟任务ID
    UINT32 schedFlag;                           ///<  pending scheduler flag | 调度标识 INT_NO_RESCH INT_PEND_RESCH
74
#ifdef LOSCFG_KERNEL_SMP
75
    UINT32            excFlag;               ///<  cpu halt or exc flag | cpu 停止或 异常 标志
76
#ifdef LOSCFG_KERNEL_SMP_CALL
77
    LOS_DL_LIST       funcLink;              ///<  mp function call link | 回调函数
78
#endif
79 80 81
#endif
} Percpu;

82 83 84
/*! the kernel per-cpu structure | 每个cpu的内核描述符 */
extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM];
/*! 获得当前运行CPU的信息 */
85 86 87 88
STATIC INLINE Percpu *OsPercpuGet(VOID)
{
    return &g_percpu[ArchCurrCpuid()];	
}
89
/*! 获得参数CPU的信息 */
90 91 92 93 94 95 96 97 98 99 100 101
STATIC INLINE Percpu *OsPercpuGetByID(UINT32 cpuid)
{
    return &g_percpu[cpuid];
}

#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */

#endif /* _LOS_PERCPU_PRI_H */