Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
berryhaxby
注释鸿蒙内核源码
提交
8a9b0635
注释鸿蒙内核源码
项目概览
berryhaxby
/
注释鸿蒙内核源码
与 Fork 源项目一致
Fork自
鸿蒙内核源码分析 / 注释鸿蒙内核源码
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
注释鸿蒙内核源码
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8a9b0635
编写于
10月 25, 2020
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
鸿蒙源码分析系列篇
https://blog.csdn.net/kuangyufei
https://my.oschina.net/u/3751245
上级
9e466f5e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
89 addition
and
89 deletion
+89
-89
kernel/base/core/los_sortlink.c
kernel/base/core/los_sortlink.c
+2
-2
kernel/base/core/los_swtmr.c
kernel/base/core/los_swtmr.c
+79
-79
kernel/base/core/los_tick.c
kernel/base/core/los_tick.c
+5
-5
kernel/base/include/los_sortlink_pri.h
kernel/base/include/los_sortlink_pri.h
+3
-3
未找到文件。
kernel/base/core/los_sortlink.c
浏览文件 @
8a9b0635
...
...
@@ -38,7 +38,7 @@
extern
"C"
{
#endif
#endif
/* __cplusplus */
//排序链表,这是通用处理函数
LITE_OS_SEC_TEXT_INIT
UINT32
OsSortLinkInit
(
SortLinkAttribute
*
sortLinkHeader
)
{
UINT32
size
;
...
...
@@ -46,7 +46,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
UINT32
index
;
size
=
sizeof
(
LOS_DL_LIST
)
<<
OS_TSK_SORTLINK_LOGLEN
;
listObject
=
(
LOS_DL_LIST
*
)
LOS_MemAlloc
(
m_aucSysMem0
,
size
);
/* system resident resource */
listObject
=
(
LOS_DL_LIST
*
)
LOS_MemAlloc
(
m_aucSysMem0
,
size
);
/* system resident resource */
//常驻内存
if
(
listObject
==
NULL
)
{
return
LOS_NOK
;
}
...
...
kernel/base/core/los_swtmr.c
浏览文件 @
8a9b0635
...
...
@@ -47,58 +47,58 @@ extern "C" {
#endif
/* LOSCFG_BASE_CORE_SWTMR_LIMIT <= 0 */
LITE_OS_SEC_BSS
SWTMR_CTRL_S
*
g_swtmrCBArray
=
NULL
;
/* First address in Timer memory space */
LITE_OS_SEC_BSS
UINT8
*
g_swtmrHandlerPool
=
NULL
;
/* Pool of Swtmr Handler */
LITE_OS_SEC_BSS
UINT8
*
g_swtmrHandlerPool
=
NULL
;
/* Pool of Swtmr Handler */
//用于注册软时钟的回调函数
LITE_OS_SEC_BSS
LOS_DL_LIST
g_swtmrFreeList
;
/* Free list of Software Timer */
/* spinlock for swtmr module, only available on SMP mode */
LITE_OS_SEC_BSS
SPIN_LOCK_INIT
(
g_swtmrSpin
);
#define SWTMR_LOCK(state) LOS_SpinLockSave(&g_swtmrSpin, &(state))
#define SWTMR_UNLOCK(state) LOS_SpinUnlockRestore(&g_swtmrSpin, (state))
LITE_OS_SEC_BSS
SPIN_LOCK_INIT
(
g_swtmrSpin
);
//初始化软时钟自旋锁,只有SMP情况才需要,只要是自旋锁都是用于CPU多核的同步
#define SWTMR_LOCK(state) LOS_SpinLockSave(&g_swtmrSpin, &(state))
//持有软时钟自旋锁
#define SWTMR_UNLOCK(state) LOS_SpinUnlockRestore(&g_swtmrSpin, (state))
//释放软时钟自旋锁
//软时钟的入口函数,拥有任务的最高优先级 0 级!
LITE_OS_SEC_TEXT
VOID
OsSwtmrTask
(
VOID
)
{
SwtmrHandlerItemPtr
swtmrHandlePtr
=
NULL
;
SwtmrHandlerItem
swtmrHandle
;
UINT32
ret
,
swtmrHandlerQueue
;
swtmrHandlerQueue
=
OsPercpuGet
()
->
swtmrHandlerQueue
;
for
(;;)
{
ret
=
LOS_QueueRead
(
swtmrHandlerQueue
,
&
swtmrHandlePtr
,
sizeof
(
CHAR
*
),
LOS_WAIT_FOREVER
);
swtmrHandlerQueue
=
OsPercpuGet
()
->
swtmrHandlerQueue
;
//获取定时器超时队列
for
(;;)
{
//死循环获取队列item,一直读干净为止
ret
=
LOS_QueueRead
(
swtmrHandlerQueue
,
&
swtmrHandlePtr
,
sizeof
(
CHAR
*
),
LOS_WAIT_FOREVER
);
//一个一个读队列
if
((
ret
==
LOS_OK
)
&&
(
swtmrHandlePtr
!=
NULL
))
{
swtmrHandle
.
handler
=
swtmrHandlePtr
->
handler
;
swtmrHandle
.
arg
=
swtmrHandlePtr
->
arg
;
(
VOID
)
LOS_MemboxFree
(
g_swtmrHandlerPool
,
swtmrHandlePtr
);
swtmrHandle
.
handler
=
swtmrHandlePtr
->
handler
;
//超时中断处理函数,也称回调函数
swtmrHandle
.
arg
=
swtmrHandlePtr
->
arg
;
//回调函数的参数
(
VOID
)
LOS_MemboxFree
(
g_swtmrHandlerPool
,
swtmrHandlePtr
);
//静态释放内存,注意在鸿蒙内核只有软时钟注册用到了静态内存
if
(
swtmrHandle
.
handler
!=
NULL
)
{
swtmrHandle
.
handler
(
swtmrHandle
.
arg
);
swtmrHandle
.
handler
(
swtmrHandle
.
arg
);
//回调函数处理函数
}
}
}
}
//创建软时钟任务,每个cpu core都可以拥有自己的软时钟任务
LITE_OS_SEC_TEXT_INIT
UINT32
OsSwtmrTaskCreate
(
VOID
)
{
UINT32
ret
,
swtmrTaskID
;
TSK_INIT_PARAM_S
swtmrTask
;
UINT32
cpuid
=
ArchCurrCpuid
();
UINT32
cpuid
=
ArchCurrCpuid
();
//获取当前CPU id
(
VOID
)
memset_s
(
&
swtmrTask
,
sizeof
(
TSK_INIT_PARAM_S
),
0
,
sizeof
(
TSK_INIT_PARAM_S
));
swtmrTask
.
pfnTaskEntry
=
(
TSK_ENTRY_FUNC
)
OsSwtmrTask
;
swtmrTask
.
uwStackSize
=
LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE
;
swtmrTask
.
pcName
=
"Swt_Task"
;
swtmrTask
.
usTaskPrio
=
0
;
swtmrTask
.
uwResved
=
LOS_TASK_STATUS_DETACHED
;
swtmrTask
.
pfnTaskEntry
=
(
TSK_ENTRY_FUNC
)
OsSwtmrTask
;
//入口函数
swtmrTask
.
uwStackSize
=
LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE
;
//16K默认内核任务栈
swtmrTask
.
pcName
=
"Swt_Task"
;
//任务名称
swtmrTask
.
usTaskPrio
=
0
;
//哇塞! 逮到一个最高优先级的任务
swtmrTask
.
uwResved
=
LOS_TASK_STATUS_DETACHED
;
//分离模式
#if (LOSCFG_KERNEL_SMP == YES)
swtmrTask
.
usCpuAffiMask
=
CPUID_TO_AFFI_MASK
(
cpuid
);
swtmrTask
.
usCpuAffiMask
=
CPUID_TO_AFFI_MASK
(
cpuid
);
//交给当前CPU执行这个任务
#endif
ret
=
LOS_TaskCreate
(
&
swtmrTaskID
,
&
swtmrTask
);
ret
=
LOS_TaskCreate
(
&
swtmrTaskID
,
&
swtmrTask
);
//创建任务并申请调度
if
(
ret
==
LOS_OK
)
{
g_percpu
[
cpuid
].
swtmrTaskID
=
swtmrTaskID
;
OS_TCB_FROM_TID
(
swtmrTaskID
)
->
taskStatus
|=
OS_TASK_FLAG_SYSTEM_TASK
;
g_percpu
[
cpuid
].
swtmrTaskID
=
swtmrTaskID
;
//全局变量记录 软时钟任务ID
OS_TCB_FROM_TID
(
swtmrTaskID
)
->
taskStatus
|=
OS_TASK_FLAG_SYSTEM_TASK
;
//告知这是一个系统任务
}
return
ret
;
}
//软时钟回收
LITE_OS_SEC_TEXT_INIT
VOID
OsSwtmrRecycle
(
UINT32
processID
)
{
for
(
UINT16
index
=
0
;
index
<
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
index
++
)
{
...
...
@@ -107,7 +107,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle(UINT32 processID)
}
}
}
//软时钟初始化
LITE_OS_SEC_TEXT_INIT
UINT32
OsSwtmrInit
(
VOID
)
{
UINT32
size
;
...
...
@@ -117,44 +117,44 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
UINT32
swtmrHandlePoolSize
;
UINT32
cpuid
=
ArchCurrCpuid
();
if
(
cpuid
==
0
)
{
size
=
sizeof
(
SWTMR_CTRL_S
)
*
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
swtmr
=
(
SWTMR_CTRL_S
*
)
LOS_MemAlloc
(
m_aucSysMem0
,
size
);
/* system resident resource */
size
=
sizeof
(
SWTMR_CTRL_S
)
*
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
//申请软时钟内存大小
swtmr
=
(
SWTMR_CTRL_S
*
)
LOS_MemAlloc
(
m_aucSysMem0
,
size
);
/* system resident resource */
//常驻内存
if
(
swtmr
==
NULL
)
{
return
LOS_ERRNO_SWTMR_NO_MEMORY
;
}
(
VOID
)
memset_s
(
swtmr
,
size
,
0
,
size
);
g_swtmrCBArray
=
swtmr
;
LOS_ListInit
(
&
g_swtmrFreeList
);
(
VOID
)
memset_s
(
swtmr
,
size
,
0
,
size
);
//清0
g_swtmrCBArray
=
swtmr
;
//软时钟
LOS_ListInit
(
&
g_swtmrFreeList
);
//初始化空闲链表
for
(
index
=
0
;
index
<
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
index
++
,
swtmr
++
)
{
swtmr
->
usTimerID
=
index
;
LOS_ListTailInsert
(
&
g_swtmrFreeList
,
&
swtmr
->
stSortList
.
sortLinkNode
);
swtmr
->
usTimerID
=
index
;
//按顺序赋值
LOS_ListTailInsert
(
&
g_swtmrFreeList
,
&
swtmr
->
stSortList
.
sortLinkNode
);
//用sortLinkNode把结构体全部 挂到空闲链表
}
//用于软时钟注册的内存为何要用静态内存申请? 请大家想想这个问题
swtmrHandlePoolSize
=
LOS_MEMBOX_SIZE
(
sizeof
(
SwtmrHandlerItem
),
OS_SWTMR_HANDLE_QUEUE_SIZE
);
//申请静态内存
swtmrHandlePoolSize
=
LOS_MEMBOX_SIZE
(
sizeof
(
SwtmrHandlerItem
),
OS_SWTMR_HANDLE_QUEUE_SIZE
);
g_swtmrHandlerPool
=
(
UINT8
*
)
LOS_MemAlloc
(
m_aucSysMem1
,
swtmrHandlePoolSize
);
/* system resident resource */
g_swtmrHandlerPool
=
(
UINT8
*
)
LOS_MemAlloc
(
m_aucSysMem1
,
swtmrHandlePoolSize
);
/* system resident resource */
//常驻内存
if
(
g_swtmrHandlerPool
==
NULL
)
{
return
LOS_ERRNO_SWTMR_NO_MEMORY
;
}
ret
=
LOS_MemboxInit
(
g_swtmrHandlerPool
,
swtmrHandlePoolSize
,
sizeof
(
SwtmrHandlerItem
));
ret
=
LOS_MemboxInit
(
g_swtmrHandlerPool
,
swtmrHandlePoolSize
,
sizeof
(
SwtmrHandlerItem
));
//初始化软时钟注册池
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_SWTMR_HANDLER_POOL_NO_MEM
;
}
}
ret
=
LOS_QueueCreate
(
NULL
,
OS_SWTMR_HANDLE_QUEUE_SIZE
,
&
g_percpu
[
cpuid
].
swtmrHandlerQueue
,
0
,
sizeof
(
CHAR
*
));
ret
=
LOS_QueueCreate
(
NULL
,
OS_SWTMR_HANDLE_QUEUE_SIZE
,
&
g_percpu
[
cpuid
].
swtmrHandlerQueue
,
0
,
sizeof
(
CHAR
*
));
//为当前CPU core 创建软时钟队列
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED
;
}
ret
=
OsSwtmrTaskCreate
();
ret
=
OsSwtmrTaskCreate
();
//创建软时钟任务,统一处理队列
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_SWTMR_TASK_CREATE_FAILED
;
}
ret
=
OsSortLinkInit
(
&
g_percpu
[
cpuid
].
swtmrSortLink
);
ret
=
OsSortLinkInit
(
&
g_percpu
[
cpuid
].
swtmrSortLink
);
//排序初始化,为啥要排序因为每个定时器的时间不一样,鸿蒙把用时短的排在前面
if
(
ret
!=
LOS_OK
)
{
return
LOS_ERRNO_SWTMR_SORTLINK_CREATE_FAILED
;
}
...
...
@@ -194,22 +194,22 @@ LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr)
STATIC
INLINE
VOID
OsSwtmrDelete
(
SWTMR_CTRL_S
*
swtmr
)
{
/* insert to free list */
LOS_ListTailInsert
(
&
g_swtmrFreeList
,
&
swtmr
->
stSortList
.
sortLinkNode
);
swtmr
->
ucState
=
OS_SWTMR_STATUS_UNUSED
;
swtmr
->
uwOwnerPid
=
0
;
LOS_ListTailInsert
(
&
g_swtmrFreeList
,
&
swtmr
->
stSortList
.
sortLinkNode
);
//直接插入空闲链表中,回收再利用
swtmr
->
ucState
=
OS_SWTMR_STATUS_UNUSED
;
//又干净着呢
swtmr
->
uwOwnerPid
=
0
;
//谁拥有这个定时器? 是 0号进程, 0号进程出来了,竟然是虚拟的一个进程.用于这类缓冲使用.
}
/*
* Description: Tick interrupt interface module of software timer
* Return : LOS_OK on success or error code on failure
*/
LITE_OS_SEC_TEXT
VOID
OsSwtmrScan
(
VOID
)
*/
//OsSwtmrScan 由系统时钟中断处理函数调用
LITE_OS_SEC_TEXT
VOID
OsSwtmrScan
(
VOID
)
//扫描定时器,如果碰到超时的,就放入超时队列
{
SortLinkList
*
sortList
=
NULL
;
SWTMR_CTRL_S
*
swtmr
=
NULL
;
SwtmrHandlerItemPtr
swtmrHandler
=
NULL
;
LOS_DL_LIST
*
listObject
=
NULL
;
SortLinkAttribute
*
swtmrSortLink
=
&
OsPercpuGet
()
->
swtmrSortLink
;
SortLinkAttribute
*
swtmrSortLink
=
&
OsPercpuGet
()
->
swtmrSortLink
;
//拿到当前CPU的定时器链表
swtmrSortLink
->
cursor
=
(
swtmrSortLink
->
cursor
+
1
)
&
OS_TSK_SORTLINK_MASK
;
listObject
=
swtmrSortLink
->
sortLink
+
swtmrSortLink
->
cursor
;
...
...
@@ -319,7 +319,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr)
return
OsSortLinkGetTargetExpireTime
(
sortLinkHeader
,
&
swtmr
->
stSortList
);
}
//接口函数 创建一个定时器
LITE_OS_SEC_TEXT_INIT
UINT32
LOS_SwtmrCreate
(
UINT32
interval
,
UINT8
mode
,
SWTMR_PROC_FUNC
handler
,
...
...
@@ -348,7 +348,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
}
SWTMR_LOCK
(
intSave
);
if
(
LOS_ListEmpty
(
&
g_swtmrFreeList
))
{
if
(
LOS_ListEmpty
(
&
g_swtmrFreeList
))
{
//空闲链表不能为空
SWTMR_UNLOCK
(
intSave
);
return
LOS_ERRNO_SWTMR_MAXSIZE
;
}
...
...
@@ -358,7 +358,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
LOS_ListDelete
(
LOS_DL_LIST_FIRST
(
&
g_swtmrFreeList
));
SWTMR_UNLOCK
(
intSave
);
swtmr
->
uwOwnerPid
=
OsCurrProcessGet
()
->
processID
;
swtmr
->
uwOwnerPid
=
OsCurrProcessGet
()
->
processID
;
//定时器进程归属设定
swtmr
->
pfnHandler
=
handler
;
swtmr
->
ucMode
=
mode
;
swtmr
->
ucOverrun
=
0
;
...
...
@@ -371,7 +371,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
return
LOS_OK
;
}
//接口函数 启动定时器 参数定时任务ID
LITE_OS_SEC_TEXT
UINT32
LOS_SwtmrStart
(
UINT16
swtmrID
)
{
SWTMR_CTRL_S
*
swtmr
=
NULL
;
...
...
@@ -384,27 +384,27 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
}
SWTMR_LOCK
(
intSave
);
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
//取模
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
//获取定时器控制结构体
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
//ID必须一样
SWTMR_UNLOCK
(
intSave
);
return
LOS_ERRNO_SWTMR_ID_INVALID
;
}
switch
(
swtmr
->
ucState
)
{
switch
(
swtmr
->
ucState
)
{
//判断定时器状态
case
OS_SWTMR_STATUS_UNUSED
:
ret
=
LOS_ERRNO_SWTMR_NOT_CREATED
;
break
;
/*
/*
如果定时器的状态为启动中,应先停止定时器再重新启动
* If the status of swtmr is timing, it should stop the swtmr first,
* then start the swtmr again.
*/
case
OS_SWTMR_STATUS_TICKING
:
OsSwtmrStop
(
swtmr
);
case
OS_SWTMR_STATUS_TICKING
:
//正在计数的定时器
OsSwtmrStop
(
swtmr
);
//先停止定时器,注意这里没有break;,在OsSwtmrStop中状态将会回到了OS_SWTMR_STATUS_CREATED 接下来就是执行启动了
/* fall-through */
case
OS_SWTMR_STATUS_CREATED
:
OsSwtmrStart
(
swtmr
);
case
OS_SWTMR_STATUS_CREATED
:
//已经创建好了
OsSwtmrStart
(
swtmr
);
//启动定时器
break
;
default:
ret
=
LOS_ERRNO_SWTMR_STATUS_INVALID
;
...
...
@@ -414,7 +414,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
SWTMR_UNLOCK
(
intSave
);
return
ret
;
}
//接口函数 停止定时器 参数定时任务ID
LITE_OS_SEC_TEXT
UINT32
LOS_SwtmrStop
(
UINT16
swtmrID
)
{
SWTMR_CTRL_S
*
swtmr
=
NULL
;
...
...
@@ -427,23 +427,23 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
}
SWTMR_LOCK
(
intSave
);
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
//取模
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
//获取定时器控制结构体
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
//ID必须一样
SWTMR_UNLOCK
(
intSave
);
return
LOS_ERRNO_SWTMR_ID_INVALID
;
}
switch
(
swtmr
->
ucState
)
{
switch
(
swtmr
->
ucState
)
{
//判断定时器状态
case
OS_SWTMR_STATUS_UNUSED
:
ret
=
LOS_ERRNO_SWTMR_NOT_CREATED
;
ret
=
LOS_ERRNO_SWTMR_NOT_CREATED
;
//返回没有创建
break
;
case
OS_SWTMR_STATUS_CREATED
:
ret
=
LOS_ERRNO_SWTMR_NOT_STARTED
;
ret
=
LOS_ERRNO_SWTMR_NOT_STARTED
;
//返回没有开始
break
;
case
OS_SWTMR_STATUS_TICKING
:
OsSwtmrStop
(
swtmr
);
case
OS_SWTMR_STATUS_TICKING
:
//正在计数
OsSwtmrStop
(
swtmr
);
//执行正在停止定时器操作
break
;
default:
ret
=
LOS_ERRNO_SWTMR_STATUS_INVALID
;
...
...
@@ -453,7 +453,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
SWTMR_UNLOCK
(
intSave
);
return
ret
;
}
//接口函数 获取定时器的时间 通过 *tick 带走
LITE_OS_SEC_TEXT
UINT32
LOS_SwtmrTimeGet
(
UINT16
swtmrID
,
UINT32
*
tick
)
{
SWTMR_CTRL_S
*
swtmr
=
NULL
;
...
...
@@ -470,10 +470,10 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrID, UINT32 *tick)
}
SWTMR_LOCK
(
intSave
);
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
//取模
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
//获取定时器控制结构体
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
//ID必须一样
SWTMR_UNLOCK
(
intSave
);
return
LOS_ERRNO_SWTMR_ID_INVALID
;
}
...
...
@@ -484,8 +484,8 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrID, UINT32 *tick)
case
OS_SWTMR_STATUS_CREATED
:
ret
=
LOS_ERRNO_SWTMR_NOT_STARTED
;
break
;
case
OS_SWTMR_STATUS_TICKING
:
*
tick
=
OsSwtmrTimeGet
(
swtmr
);
case
OS_SWTMR_STATUS_TICKING
:
//正在计数的定时器
*
tick
=
OsSwtmrTimeGet
(
swtmr
);
//获取
break
;
default:
ret
=
LOS_ERRNO_SWTMR_STATUS_INVALID
;
...
...
@@ -494,7 +494,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrID, UINT32 *tick)
SWTMR_UNLOCK
(
intSave
);
return
ret
;
}
//接口函数 删除定时器
LITE_OS_SEC_TEXT
UINT32
LOS_SwtmrDelete
(
UINT16
swtmrID
)
{
SWTMR_CTRL_S
*
swtmr
=
NULL
;
...
...
@@ -507,10 +507,10 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID)
}
SWTMR_LOCK
(
intSave
);
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
swtmrCBID
=
swtmrID
%
LOSCFG_BASE_CORE_SWTMR_LIMIT
;
//取模
swtmr
=
g_swtmrCBArray
+
swtmrCBID
;
//获取定时器控制结构体
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
if
(
swtmr
->
usTimerID
!=
swtmrID
)
{
//ID必须一样
SWTMR_UNLOCK
(
intSave
);
return
LOS_ERRNO_SWTMR_ID_INVALID
;
}
...
...
@@ -519,10 +519,10 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID)
case
OS_SWTMR_STATUS_UNUSED
:
ret
=
LOS_ERRNO_SWTMR_NOT_CREATED
;
break
;
case
OS_SWTMR_STATUS_TICKING
:
case
OS_SWTMR_STATUS_TICKING
:
//正在计数就先停止
OsSwtmrStop
(
swtmr
);
/* fall-through */
case
OS_SWTMR_STATUS_CREATED
:
case
OS_SWTMR_STATUS_CREATED
:
//再删除定时器
OsSwtmrDelete
(
swtmr
);
break
;
default:
...
...
kernel/base/core/los_tick.c
浏览文件 @
8a9b0635
...
...
@@ -46,9 +46,9 @@ extern "C" {
#endif
/* __cplusplus */
#endif
/* __cplusplus */
LITE_OS_SEC_BSS
volatile
UINT64
g_tickCount
[
LOSCFG_KERNEL_CORE_NUM
]
=
{
0
};
LITE_OS_SEC_BSS
volatile
UINT64
g_tickCount
[
LOSCFG_KERNEL_CORE_NUM
]
=
{
0
};
//tick计数器,系统一旦启动,一直在++, 为防止溢出,这是一个 UINT64 的变量
LITE_OS_SEC_DATA_INIT
UINT32
g_sysClock
;
LITE_OS_SEC_DATA_INIT
UINT32
g_tickPerSecond
;
LITE_OS_SEC_DATA_INIT
UINT32
g_tickPerSecond
;
//每秒Tick数,鸿蒙默认是每秒100次,即:10ms
LITE_OS_SEC_BSS
DOUBLE
g_cycle2NsScale
;
/* spinlock for task module */
...
...
@@ -56,13 +56,13 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_tickSpin);
/*
* Description : Tick interruption handler
*/
*/
//系统时钟中断处理函数 ,鸿蒙是 10ms触发一次
LITE_OS_SEC_TEXT
VOID
OsTickHandler
(
VOID
)
{
UINT32
intSave
;
TICK_LOCK
(
intSave
);
g_tickCount
[
ArchCurrCpuid
()]
++
;
g_tickCount
[
ArchCurrCpuid
()]
++
;
//当前CPU核 计数器
TICK_UNLOCK
(
intSave
);
#ifdef LOSCFG_KERNEL_VDSO
...
...
@@ -82,7 +82,7 @@ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
OsTaskScan
();
/* task timeout scan */
//任务扫描
#if (LOSCFG_BASE_CORE_SWTMR == YES)
OsSwtmrScan
();
//
软时钟扫描
OsSwtmrScan
();
//
定时器扫描,看是否有超时的定时器
#endif
}
...
...
kernel/base/include/los_sortlink_pri.h
浏览文件 @
8a9b0635
...
...
@@ -48,7 +48,7 @@ extern "C" {
* ------------------------------------------
* |<-High Bits->|<---------Low Bits--------->|
*
* Low Bits : circles
* Low Bits : circles
* High Bits : sortlink index
*/
#define OS_TSK_HIGH_BITS 3U
...
...
@@ -86,8 +86,8 @@ typedef struct {
}
SortLinkList
;
typedef
struct
{
LOS_DL_LIST
*
sortLink
;
UINT16
cursor
;
LOS_DL_LIST
*
sortLink
;
//排序双循环链表
UINT16
cursor
;
//游标
UINT16
reserved
;
}
SortLinkAttribute
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录