LiteOS内核源码分析系列一(续) -数据结构之CPU核信息结构体Percpu

举报
zhushy 发表于 2021/03/30 19:27:21 2021/03/30
【摘要】 LiteOS提供一个结构体Percpu来记录每一个CPU的相关信息,包含任务排序链表,定时器排序刘安邦,锁任务调度标记、请求调度标记等。本文我们来一起学习下LiteOS``CPU核信息结构体Percpu的源代码。

LiteOS内核源码分析系列一 -数据结构之CPU核信息结构体Percpu

LiteOS提供一个结构体Percpu来记录每一个CPU的相关信息,包含任务排序链表,定时器排序刘安邦,锁任务调度标记、请求调度标记等。本文我们来一起学习下LiteOS``CPU核信息结构体Percpu的源代码。文中所涉及的源代码,均可以在LiteOS开源站点https://gitee.com/LiteOS/LiteOS 获取。相关源代码文件包括私有头文件kernel\base\include\los_percpu_pri.hC源代码文件kernel\base\los_percpu.c


接下来,我们看下结构体Percpu,及其相关的内联函数的源代码。

1.1 CPU核信息结构体Percpu定义

在文件kernel\base\include\los_percpu_pri.h定义的CPU核信息结构体Percpu,源代码如下,结构体成员的解释见注释部分。

typedef struct {
    SortLinkAttribute taskSortLink;             /* 任务的排序链表 */
#ifdef LOSCFG_BASE_CORE_SWTMR
    SortLinkAttribute swtmrSortLink;            /* 软件定时器排序链表 */
#endif

    UINT32 idleTaskId;                          /* idle空闲任务Id*/
    UINT32 taskLockCnt;                         /* 锁任务调度标记 */
    UINT32 swtmrHandlerQueue;                   /* 软件定时器队列Id */
    UINT32 swtmrTaskId;                         /* 软件定时器任务Id */

    UINT32 schedFlag;                           /* 请求调度标记 */
#ifdef LOSCFG_KERNEL_SMP
    UINT32 excFlag;                             /* cpu halt或exc异常标记 */
#ifdef LOSCFG_KERNEL_SMP_CALL
    LOS_DL_LIST funcLink;                       /* mp函数调用双向链表*/
#endif
#endif
} Percpu;

另外提供了2个内联函数,供调用当前CPU核或指定CPU核的Percpu结构体变量。其中g_percpu在文件kernel\base\los_percpu.c中定义。

STATIC INLINE Percpu *OsPercpuGet(VOID)
{
    return &g_percpu[ArchCurrCpuid()];
}

STATIC INLINE Percpu *OsPercpuGetByID(UINT32 cpuid)
{
    return &g_percpu[cpuid];
}

小结

本文带领大家一起剖析了LiteOS CPU核信息结构体Percpu的源代码,代码非常简单。感谢阅读,如有任何问题、建议,都可以留言给我们: https://gitee.com/LiteOS/LiteOS/issues 。为了更容易找到LiteOS代码仓,建议访问 https://gitee.com/LiteOS/LiteOS ,关注Watch、点赞Star、并Fork到自己账户下,如下图,谢谢。

LOS_STAR

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。