软定时器主文件 更多...
结构体 | |
struct | SwtmrRunqueue |
函数 | |
STATIC INLINE VOID | SwtmrDelete (SWTMR_CTRL_S *swtmr) |
STATIC INLINE UINT64 | SwtmrToStart (SWTMR_CTRL_S *swtmr, UINT16 cpuid) |
LITE_OS_SEC_BSS | SPIN_LOCK_INIT (g_swtmrSpin) |
初始化软时钟自旋锁,只有SMP情况才需要,只要是自旋锁都是用于CPU多核的同步 更多... | |
BOOL | OsSwtmrDebugDataUsed (UINT32 swtmrID) |
UINT32 | OsSwtmrDebugDataGet (UINT32 swtmrID, SwtmrDebugData *data, UINT32 len, UINT8 *mode) |
STATIC VOID | SwtmrDebugDataInit (VOID) |
STATIC INLINE VOID | SwtmrDebugDataUpdate (SWTMR_CTRL_S *swtmr, UINT32 ticks, UINT32 times) |
STATIC INLINE VOID | SwtmrDebugDataStart (SWTMR_CTRL_S *swtmr, UINT16 cpuid) |
STATIC INLINE VOID | SwtmrDebugWaitTimeCalculate (UINT32 swtmrID, SwtmrHandlerItemPtr swtmrHandler) |
STATIC INLINE VOID | SwtmrDebugDataClear (UINT32 swtmrID) |
STATIC INLINE VOID | SwtmrHandler (SwtmrHandlerItemPtr swtmrHandle) |
STATIC INLINE VOID | SwtmrWake (SwtmrRunqueue *srq, UINT64 startTime, SortLinkList *sortList) |
STATIC INLINE VOID | ScanSwtmrTimeList (SwtmrRunqueue *srq) |
STATIC VOID | SwtmrTask (VOID) |
软时钟的入口函数,拥有任务的最高优先级 0 级! 更多... | |
STATIC UINT32 | SwtmrTaskCreate (UINT16 cpuid, UINT32 *swtmrTaskID) |
创建软时钟任务,每个cpu core都可以拥有自己的软时钟任务 更多... | |
UINT32 | OsSwtmrTaskIDGetByCpuid (UINT16 cpuid) |
BOOL | OsIsSwtmrTask (const LosTaskCB *taskCB) |
LITE_OS_SEC_TEXT_INIT VOID | OsSwtmrRecycle (UINT32 processID) |
回收指定进程的软时钟 更多... | |
STATIC UINT32 | SwtmrBaseInit (VOID) |
软时钟初始化 ,注意函数在多CPU情况下会执行多次 更多... | |
LITE_OS_SEC_TEXT_INIT UINT32 | OsSwtmrInit (VOID) |
STATIC INLINE VOID | FindIdleSwtmrRunqueue (UINT16 *idleCpuid) |
STATIC INLINE VOID | AddSwtmr2TimeList (SortLinkList *node, UINT64 responseTime, UINT16 cpuid) |
STATIC INLINE VOID | DeSwtmrFromTimeList (SortLinkList *node) |
STATIC VOID | SwtmrAdjustCheck (UINT16 cpuid, UINT64 responseTime) |
STATIC INLINE VOID | SwtmrStart (SWTMR_CTRL_S *swtmr) |
STATIC INLINE VOID | SwtmrRestart (UINT64 startTime, SortLinkList *sortList, UINT16 cpuid) |
VOID | OsSwtmrResponseTimeReset (UINT64 startTime) |
STATIC INLINE BOOL | SwtmrRunqueueFind (SortLinkAttribute *swtmrSortLink, SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg) |
STATIC BOOL | SwtmrTimeListFind (SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg) |
BOOL | OsSwtmrWorkQueueFind (SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg) |
LITE_OS_SEC_TEXT UINT32 | OsSwtmrGetNextTimeout (VOID) |
Scan a software timer. 更多... | |
STATIC VOID | SwtmrStop (SWTMR_CTRL_S *swtmr) |
LITE_OS_SEC_TEXT STATIC UINT32 | OsSwtmrTimeGet (const SWTMR_CTRL_S *swtmr) |
LITE_OS_SEC_TEXT_INIT UINT32 | LOS_SwtmrCreate (UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg) |
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_SwtmrStart (UINT16 swtmrID) |
接口函数 启动定时器 参数定时任务ID 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_SwtmrStop (UINT16 swtmrID) |
接口函数 停止定时器 参数定时任务ID 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_SwtmrTimeGet (UINT16 swtmrID, UINT32 *tick) |
接口函数 获得软件定时器剩余Tick数 通过 *tick 带走 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_SwtmrDelete (UINT16 swtmrID) |
接口函数 删除定时器 更多... | |
变量 | |
LITE_OS_SEC_BSS SWTMR_CTRL_S * | g_swtmrCBArray = NULL |
LITE_OS_SEC_BSS UINT8 * | g_swtmrHandlerPool = NULL |
LITE_OS_SEC_BSS LOS_DL_LIST | g_swtmrFreeList |
STATIC SwtmrRunqueue | g_swtmrRunqueue [LOSCFG_KERNEL_CORE_NUM] |
STATIC SwtmrDebugData * | g_swtmrDebugData = NULL |
软定时器主文件
基本概念 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick数后,会触发用户自定义的回调函数。 硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此为了满足用户需求,提供更多的定时器, 软件定时器功能,支持如下特性: 创建软件定时器。 启动软件定时器。 停止软件定时器。 删除软件定时器。 获取软件定时器剩余Tick数。 可配置支持的软件定时器个数。 运作机制 软件定时器是系统资源,在模块初始化的时候已经分配了一块连续内存。 软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则, 先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先触发的准则。 软件定时器以Tick为基本计时单位,当创建并启动一个软件定时器时,Huawei LiteOS会根据 当前系统Tick时间及设置的定时时长确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。 当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,检查是否有定时器超时, 若有则将超时的定时器记录下来。Tick中断处理函数结束后,软件定时器任务(优先级为最高) 被唤醒,在该任务中调用已经记录下来的定时器的回调函数。 定时器状态 OS_SWTMR_STATUS_UNUSED(定时器未使用) 系统在定时器模块初始化时,会将系统中所有定时器资源初始化成该状态。 OS_SWTMR_STATUS_TICKING(定时器处于计数状态) 在定时器创建后调用LOS_SwtmrStart接口启动,定时器将变成该状态,是定时器运行时的状态。 OS_SWTMR_STATUS_CREATED(定时器创建后未启动,或已停止) 定时器创建后,不处于计数状态时,定时器将变成该状态。 软件定时器提供了三类模式: 单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动删除。 周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动停止定时器,否则将永远持续执行下去。 单次触发定时器,但这类定时器超时触发后不会自动删除,需要调用定时器删除接口删除定时器。 使用场景 创建一个单次触发的定时器,超时后执行用户自定义的回调函数。 创建一个周期性触发的定时器,超时后执行用户自定义的回调函数。 软件定时器的典型开发流程 通过make menuconfig配置软件定时器 创建定时器LOS_SwtmrCreate,设置定时器的定时时长、定时器模式、超时后的回调函数。 启动定时器LOS_SwtmrStart。 获得软件定时器剩余Tick数LOS_SwtmrTimeGet。 停止定时器LOS_SwtmrStop。 删除定时器LOS_SwtmrDelete。 注意事项 软件定时器的回调函数中不应执行过多操作,不建议使用可能引起任务挂起或者阻塞的接口或操作, 如果使用会导致软件定时器响应不及时,造成的影响无法确定。 软件定时器使用了系统的一个队列和一个任务资源。软件定时器任务的优先级设定为0,且不允许修改 。 系统可配置的软件定时器个数是指:整个系统可使用的软件定时器总个数,并非用户可使用的软件定时器个数。 例如:系统多占用一个软件定时器,那么用户能使用的软件定时器资源就会减少一个。 创建单次不自删除属性的定时器,用户需要自行调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。 软件定时器的定时精度与系统Tick时钟的周期有关。
在文件 los_swtmr.c 中定义.
STATIC INLINE VOID AddSwtmr2TimeList | ( | SortLinkList * | node, |
UINT64 | responseTime, | ||
UINT16 | cpuid | ||
) |
在文件 los_swtmr.c 第 491 行定义.
STATIC INLINE VOID DeSwtmrFromTimeList | ( | SortLinkList * | node | ) |
在文件 los_swtmr.c 第 497 行定义.
STATIC INLINE VOID FindIdleSwtmrRunqueue | ( | UINT16 * | idleCpuid | ) |
在文件 los_swtmr.c 第 474 行定义.
在文件 los_swtmr.c 第 383 行定义.
UINT32 OsSwtmrDebugDataGet | ( | UINT32 | swtmrID, |
SwtmrDebugData * | data, | ||
UINT32 | len, | ||
UINT8 * | mode | ||
) |
在文件 los_swtmr.c 第 142 行定义.
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout | ( | VOID | ) |
Scan a software timer.
None. |
None. |
在文件 los_swtmr.c 第 675 行定义.
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit | ( | VOID | ) |
在文件 los_swtmr.c 第 441 行定义.
LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle | ( | UINT32 | processID | ) |
回收指定进程的软时钟
在文件 los_swtmr.c 第 391 行定义.
VOID OsSwtmrResponseTimeReset | ( | UINT64 | startTime | ) |
在文件 los_swtmr.c 第 610 行定义.
在文件 los_swtmr.c 第 378 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet | ( | const SWTMR_CTRL_S * | swtmr | ) |
在文件 los_swtmr.c 第 702 行定义.
BOOL OsSwtmrWorkQueueFind | ( | SCHED_TL_FIND_FUNC | checkFunc, |
UINTPTR | arg | ||
) |
在文件 los_swtmr.c 第 661 行定义.
STATIC INLINE VOID ScanSwtmrTimeList | ( | SwtmrRunqueue * | srq | ) |
在文件 los_swtmr.c 第 282 行定义.
LITE_OS_SEC_BSS SPIN_LOCK_INIT | ( | g_swtmrSpin | ) |
初始化软时钟自旋锁,只有SMP情况才需要,只要是自旋锁都是用于CPU多核的同步
在文件 los_swtmr.c 第 509 行定义.
STATIC UINT32 SwtmrBaseInit | ( | VOID | ) |
软时钟初始化 ,注意函数在多CPU情况下会执行多次
在文件 los_swtmr.c 第 400 行定义.
STATIC INLINE VOID SwtmrDebugDataClear | ( | UINT32 | swtmrID | ) |
STATIC VOID SwtmrDebugDataInit | ( | VOID | ) |
STATIC INLINE VOID SwtmrDebugDataStart | ( | SWTMR_CTRL_S * | swtmr, |
UINT16 | cpuid | ||
) |
STATIC INLINE VOID SwtmrDebugDataUpdate | ( | SWTMR_CTRL_S * | swtmr, |
UINT32 | ticks, | ||
UINT32 | times | ||
) |
STATIC INLINE VOID SwtmrDebugWaitTimeCalculate | ( | UINT32 | swtmrID, |
SwtmrHandlerItemPtr | swtmrHandler | ||
) |
STATIC INLINE VOID SwtmrDelete | ( | SWTMR_CTRL_S * | swtmr | ) |
在文件 los_swtmr.c 第 590 行定义.
STATIC INLINE VOID SwtmrHandler | ( | SwtmrHandlerItemPtr | swtmrHandle | ) |
STATIC INLINE VOID SwtmrRestart | ( | UINT64 | startTime, |
SortLinkList * | sortList, | ||
UINT16 | cpuid | ||
) |
在文件 los_swtmr.c 第 599 行定义.
STATIC INLINE BOOL SwtmrRunqueueFind | ( | SortLinkAttribute * | swtmrSortLink, |
SCHED_TL_FIND_FUNC | checkFunc, | ||
UINTPTR | arg | ||
) |
STATIC INLINE VOID SwtmrStart | ( | SWTMR_CTRL_S * | swtmr | ) |
在文件 los_swtmr.c 第 571 行定义.
STATIC VOID SwtmrStop | ( | SWTMR_CTRL_S * | swtmr | ) |
在文件 los_swtmr.c 第 690 行定义.
STATIC VOID SwtmrTask | ( | VOID | ) |
软时钟的入口函数,拥有任务的最高优先级 0 级!
在文件 los_swtmr.c 第 325 行定义.
创建软时钟任务,每个cpu core都可以拥有自己的软时钟任务
在文件 los_swtmr.c 第 356 行定义.
STATIC BOOL SwtmrTimeListFind | ( | SCHED_TL_FIND_FUNC | checkFunc, |
UINTPTR | arg | ||
) |
在文件 los_swtmr.c 第 650 行定义.
STATIC UINT64 SwtmrToStart | ( | SWTMR_CTRL_S * | swtmr, |
UINT16 | cpuid | ||
) |
在文件 los_swtmr.c 第 538 行定义.
STATIC INLINE VOID SwtmrWake | ( | SwtmrRunqueue * | srq, |
UINT64 | startTime, | ||
SortLinkList * | sortList | ||
) |
在文件 los_swtmr.c 第 248 行定义.
LITE_OS_SEC_BSS SWTMR_CTRL_S* g_swtmrCBArray = NULL |
First address in Timer memory space
定时器池
在文件 los_swtmr.c 第 112 行定义.
STATIC SwtmrDebugData* g_swtmrDebugData = NULL |
在文件 los_swtmr.c 第 131 行定义.
LITE_OS_SEC_BSS LOS_DL_LIST g_swtmrFreeList |
Free list of Software Timer
空闲定时器链表
在文件 los_swtmr.c 第 114 行定义.
LITE_OS_SEC_BSS UINT8* g_swtmrHandlerPool = NULL |
Pool of Swtmr Handler
用于注册软时钟的回调函数
在文件 los_swtmr.c 第 113 行定义.
STATIC SwtmrRunqueue g_swtmrRunqueue[LOSCFG_KERNEL_CORE_NUM] |
在文件 los_swtmr.c 第 127 行定义.