@ -1,4 +1,67 @@
/*
/*!
* @ file los_swtmr . c
* @ brief 软 定 时 器 主 文 件
* @ details
* @ attention @ verbatim
基 本 概 念
软 件 定 时 器 , 是 基 于 系 统 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 时 钟 的 周 期 有 关 。
@ endverbatim
以 上 内 容 整 理 自 CSDN
*/ /*
* Copyright ( c ) 2013 - 2019 Huawei Technologies Co . , Ltd . All rights reserved .
* Copyright ( c ) 2013 - 2019 Huawei Technologies Co . , Ltd . All rights reserved .
* Copyright ( c ) 2020 - 2021 Huawei Device Co . , Ltd . All rights reserved .
* Copyright ( c ) 2020 - 2021 Huawei Device Co . , Ltd . All rights reserved .
*
*
@ -54,9 +117,9 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_swtmrSpin);
LITE_OS_SEC_TEXT VOID OsSwtmrTask ( VOID )
LITE_OS_SEC_TEXT VOID OsSwtmrTask ( VOID )
{
{
SwtmrHandlerItemPtr swtmrHandlePtr = NULL ;
SwtmrHandlerItemPtr swtmrHandlePtr = NULL ; ///< 初始化软时钟自旋锁,只有SMP情况才需要,只要是自旋锁都是用于CPU多核的同步
SwtmrHandlerItem swtmrHandle ;
SwtmrHandlerItem swtmrHandle ; ///< 持有软时钟自旋锁
UINT32 ret , swtmrHandlerQueue ;
UINT32 ret , swtmrHandlerQueue ; ///< 释放软时钟自旋锁
swtmrHandlerQueue = OsPercpuGet ( ) - > swtmrHandlerQueue ;
swtmrHandlerQueue = OsPercpuGet ( ) - > swtmrHandlerQueue ;
for ( ; ; ) {
for ( ; ; ) {
@ -71,23 +134,24 @@ LITE_OS_SEC_TEXT VOID OsSwtmrTask(VOID)
}
}
}
}
}
}
///创建软时钟任务,每个cpu core都可以拥有自己的软时钟任务
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate ( VOID )
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate ( VOID )
{
{
UINT32 ret , swtmrTaskID ;
UINT32 ret , swtmrTaskID ;
TSK_INIT_PARAM_S swtmrTask ;
TSK_INIT_PARAM_S swtmrTask ;
UINT32 cpuid = ArchCurrCpuid ( ) ;
UINT32 cpuid = ArchCurrCpuid ( ) ;
( VOID ) memset_s ( & swtmrTask , sizeof ( TSK_INIT_PARAM_S ) , 0 , sizeof ( TSK_INIT_PARAM_S ) ) ;
( VOID ) memset_s ( & swtmrTask , sizeof ( TSK_INIT_PARAM_S ) , 0 , sizeof ( TSK_INIT_PARAM_S ) ) ; //清0
swtmrTask . pfnTaskEntry = ( TSK_ENTRY_FUNC ) OsSwtmrTask ;
swtmrTask . pfnTaskEntry = ( TSK_ENTRY_FUNC ) OsSwtmrTask ; //入口函数
swtmrTask . uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE ;
swtmrTask . uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE ; //16K默认内核任务栈
swtmrTask . pcName = " Swt_Task " ;
swtmrTask . pcName = " Swt_Task " ; //任务名称
swtmrTask . usTaskPrio = 0 ;
swtmrTask . usTaskPrio = 0 ;
swtmrTask . uwResved = LOS_TASK_STATUS_DETACHED ;
swtmrTask . uwResved = LOS_TASK_STATUS_DETACHED ;
# ifdef LOSCFG_KERNEL_SMP
# ifdef LOSCFG_KERNEL_SMP
swtmrTask . usCpuAffiMask = CPUID_TO_AFFI_MASK ( cpuid ) ;
swtmrTask . usCpuAffiMask = CPUID_TO_AFFI_MASK ( cpuid ) ; //交给当前CPU执行这个任务
# endif
# endif
ret = LOS_TaskCreate ( & swtmrTaskID , & swtmrTask ) ;
ret = LOS_TaskCreate ( & swtmrTaskID , & swtmrTask ) ; //创建任务并申请调度
if ( ret = = LOS_OK ) {
if ( ret = = LOS_OK ) {
g_percpu [ cpuid ] . swtmrTaskID = swtmrTaskID ;
g_percpu [ cpuid ] . swtmrTaskID = swtmrTaskID ;
OS_TCB_FROM_TID ( swtmrTaskID ) - > taskStatus | = OS_TASK_FLAG_SYSTEM_TASK ;
OS_TCB_FROM_TID ( swtmrTaskID ) - > taskStatus | = OS_TASK_FLAG_SYSTEM_TASK ;
@ -95,7 +159,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID)
return ret ;
return ret ;
}
}
///回收指定进程的软时钟
LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle ( UINT32 processID )
LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle ( UINT32 processID )
{
{
for ( UINT16 index = 0 ; index < LOSCFG_BASE_CORE_SWTMR_LIMIT ; index + + ) {
for ( UINT16 index = 0 ; index < LOSCFG_BASE_CORE_SWTMR_LIMIT ; index + + ) {
@ -104,7 +168,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle(UINT32 processID)
}
}
}
}
}
}
///软时钟初始化 ,注意函数在多CPU情况下会执行多次
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit ( VOID )
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit ( VOID )
{
{
UINT32 size ;
UINT32 size ;
@ -121,16 +185,15 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
goto ERROR ;
goto ERROR ;
}
}
( VOID ) memset_s ( swtmr , size , 0 , size ) ;
( VOID ) memset_s ( swtmr , size , 0 , size ) ; //清0
g_swtmrCBArray = swtmr ;
g_swtmrCBArray = swtmr ; //软时钟
LOS_ListInit ( & g_swtmrFreeList ) ;
LOS_ListInit ( & g_swtmrFreeList ) ; //初始化空闲链表
for ( index = 0 ; index < LOSCFG_BASE_CORE_SWTMR_LIMIT ; index + + , swtmr + + ) {
for ( index = 0 ; index < LOSCFG_BASE_CORE_SWTMR_LIMIT ; index + + , swtmr + + ) {
swtmr - > usTimerID = index ;
swtmr - > usTimerID = index ; //按顺序赋值
LOS_ListTailInsert ( & g_swtmrFreeList , & swtmr - > stSortList . sortLinkNode ) ;
LOS_ListTailInsert ( & g_swtmrFreeList , & swtmr - > stSortList . sortLinkNode ) ; //通过sortLinkNode将节点挂到空闲链表
}
}
//想要用静态内存池管理,就必须要使用LOS_MEMBOX_SIZE来计算申请的内存大小,因为需要点前缀内存承载头部信息.
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 ) {
if ( g_swtmrHandlerPool = = NULL ) {
ret = LOS_ERRNO_SWTMR_NO_MEMORY ;
ret = LOS_ERRNO_SWTMR_NO_MEMORY ;
@ -314,7 +377,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr)
{
{
return OsSortLinkGetTargetExpireTime ( & swtmr - > stSortList ) ;
return OsSortLinkGetTargetExpireTime ( & swtmr - > stSortList ) ;
}
}
///创建定时器, 设置定时器的定时时长、定时器模式、回调函数, 并返回定时器ID
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate ( UINT32 interval ,
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate ( UINT32 interval ,
UINT8 mode ,
UINT8 mode ,
SWTMR_PROC_FUNC handler ,
SWTMR_PROC_FUNC handler ,
@ -354,19 +417,19 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
SWTMR_UNLOCK ( intSave ) ;
SWTMR_UNLOCK ( intSave ) ;
swtmr - > uwOwnerPid = OsCurrProcessGet ( ) - > processID ;
swtmr - > uwOwnerPid = OsCurrProcessGet ( ) - > processID ;
swtmr - > pfnHandler = handler ;
swtmr - > pfnHandler = handler ; //时间到了的回调函数
swtmr - > ucMode = mode ;
swtmr - > ucMode = mode ; //定时器模式
swtmr - > uwOverrun = 0 ;
swtmr - > uwOverrun = 0 ;
swtmr - > uwInterval = interval ;
swtmr - > uwInterval = interval ; //周期性超时间隔
swtmr - > uwExpiry = interval ;
swtmr - > uwExpiry = interval ; //一次性超时间隔
swtmr - > uwArg = arg ;
swtmr - > uwArg = arg ; //回调函数的参数
swtmr - > ucState = OS_SWTMR_STATUS_CREATED ;
swtmr - > ucState = OS_SWTMR_STATUS_CREATED ; //已创建状态
SET_SORTLIST_VALUE ( & swtmr - > stSortList , OS_SORT_LINK_INVALID_TIME ) ;
SET_SORTLIST_VALUE ( & swtmr - > stSortList , OS_SORT_LINK_INVALID_TIME ) ;
* swtmrID = swtmr - > usTimerID ;
* swtmrID = swtmr - > usTimerID ;
OsHookCall ( LOS_HOOK_TYPE_SWTMR_CREATE , swtmr ) ;
OsHookCall ( LOS_HOOK_TYPE_SWTMR_CREATE , swtmr ) ;
return LOS_OK ;
return LOS_OK ;
}
}
///接口函数 启动定时器 参数定时任务ID
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart ( UINT16 swtmrID )
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart ( UINT16 swtmrID )
{
{
SWTMR_CTRL_S * swtmr = NULL ;
SWTMR_CTRL_S * swtmr = NULL ;
@ -379,24 +442,24 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
}
}
swtmrCBID = swtmrID % LOSCFG_BASE_CORE_SWTMR_LIMIT ;
swtmrCBID = swtmrID % LOSCFG_BASE_CORE_SWTMR_LIMIT ;
swtmr = g_swtmrCBArray + swtmrCBID ;
swtmr = g_swtmrCBArray + swtmrCBID ; //获取定时器控制结构体
SWTMR_LOCK ( intSave ) ;
SWTMR_LOCK ( intSave ) ;
if ( swtmr - > usTimerID ! = swtmrID ) {
if ( swtmr - > usTimerID ! = swtmrID ) { //ID必须一样
SWTMR_UNLOCK ( intSave ) ;
SWTMR_UNLOCK ( intSave ) ;
return LOS_ERRNO_SWTMR_ID_INVALID ;
return LOS_ERRNO_SWTMR_ID_INVALID ;
}
}
switch ( swtmr - > ucState ) {
switch ( swtmr - > ucState ) { //判断定时器状态
case OS_SWTMR_STATUS_UNUSED :
case OS_SWTMR_STATUS_UNUSED :
ret = LOS_ERRNO_SWTMR_NOT_CREATED ;
ret = LOS_ERRNO_SWTMR_NOT_CREATED ;
break ;
break ;
/*
/* 如果定时器的状态为启动中,应先停止定时器再重新启动
* If the status of swtmr is timing , it should stop the swtmr first ,
* If the status of swtmr is timing , it should stop the swtmr first ,
* then start the swtmr again .
* then start the swtmr again .
*/
*/
case OS_SWTMR_STATUS_TICKING :
case OS_SWTMR_STATUS_TICKING : //正在计数的定时器
OsSwtmrStop ( swtmr ) ;
OsSwtmrStop ( swtmr ) ; //先停止定时器,注意这里没有break;,在OsSwtmrStop中状态将会回到了OS_SWTMR_STATUS_CREATED 接下来就是执行启动了
/* fall-through */
/* fall-through */
case OS_SWTMR_STATUS_CREATED :
case OS_SWTMR_STATUS_CREATED :
swtmr - > startTime = OsGetCurrSchedTimeCycle ( ) ;
swtmr - > startTime = OsGetCurrSchedTimeCycle ( ) ;
@ -411,7 +474,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
OsHookCall ( LOS_HOOK_TYPE_SWTMR_START , swtmr ) ;
OsHookCall ( LOS_HOOK_TYPE_SWTMR_START , swtmr ) ;
return ret ;
return ret ;
}
}
///接口函数 停止定时器 参数定时任务ID
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop ( UINT16 swtmrID )
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop ( UINT16 swtmrID )
{
{
SWTMR_CTRL_S * swtmr = NULL ;
SWTMR_CTRL_S * swtmr = NULL ;
@ -424,7 +487,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
}
}
swtmrCBID = swtmrID % LOSCFG_BASE_CORE_SWTMR_LIMIT ;
swtmrCBID = swtmrID % LOSCFG_BASE_CORE_SWTMR_LIMIT ;
swtmr = g_swtmrCBArray + swtmrCBID ;
swtmr = g_swtmrCBArray + swtmrCBID ; //获取定时器控制结构体
SWTMR_LOCK ( intSave ) ;
SWTMR_LOCK ( intSave ) ;
if ( swtmr - > usTimerID ! = swtmrID ) {
if ( swtmr - > usTimerID ! = swtmrID ) {
@ -432,15 +495,15 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
return LOS_ERRNO_SWTMR_ID_INVALID ;
return LOS_ERRNO_SWTMR_ID_INVALID ;
}
}
switch ( swtmr - > ucState ) {
switch ( swtmr - > ucState ) { //判断定时器状态
case OS_SWTMR_STATUS_UNUSED :
case OS_SWTMR_STATUS_UNUSED :
ret = LOS_ERRNO_SWTMR_NOT_CREATED ;
ret = LOS_ERRNO_SWTMR_NOT_CREATED ; //返回没有创建
break ;
break ;
case OS_SWTMR_STATUS_CREATED :
case OS_SWTMR_STATUS_CREATED :
ret = LOS_ERRNO_SWTMR_NOT_STARTED ;
ret = LOS_ERRNO_SWTMR_NOT_STARTED ; //返回没有开始
break ;
break ;
case OS_SWTMR_STATUS_TICKING :
case OS_SWTMR_STATUS_TICKING : / 正 在 计 数
Os SwtmrStop( swtmr ) ;
SwtmrStop( swtmr ) ; //执行正在停止定时器操作
break ;
break ;
default :
default :
ret = LOS_ERRNO_SWTMR_STATUS_INVALID ;
ret = LOS_ERRNO_SWTMR_STATUS_INVALID ;
@ -451,7 +514,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
OsHookCall ( LOS_HOOK_TYPE_SWTMR_STOP , swtmr ) ;
OsHookCall ( LOS_HOOK_TYPE_SWTMR_STOP , swtmr ) ;
return ret ;
return ret ;
}
}
///接口函数 获得软件定时器剩余Tick数 通过 *tick 带走
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet ( UINT16 swtmrID , UINT32 * tick )
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet ( UINT16 swtmrID , UINT32 * tick )
{
{
SWTMR_CTRL_S * swtmr = NULL ;
SWTMR_CTRL_S * swtmr = NULL ;
@ -492,7 +555,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrID, UINT32 *tick)
SWTMR_UNLOCK ( intSave ) ;
SWTMR_UNLOCK ( intSave ) ;
return ret ;
return ret ;
}
}
///接口函数 删除定时器
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete ( UINT16 swtmrID )
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete ( UINT16 swtmrID )
{
{
SWTMR_CTRL_S * swtmr = NULL ;
SWTMR_CTRL_S * swtmr = NULL ;
@ -517,7 +580,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID)
case OS_SWTMR_STATUS_UNUSED :
case OS_SWTMR_STATUS_UNUSED :
ret = LOS_ERRNO_SWTMR_NOT_CREATED ;
ret = LOS_ERRNO_SWTMR_NOT_CREATED ;
break ;
break ;
case OS_SWTMR_STATUS_TICKING :
case OS_SWTMR_STATUS_TICKING : //正在计数就先停止再删除,这里没有break;
OsSwtmrStop ( swtmr ) ;
OsSwtmrStop ( swtmr ) ;
/* fall-through */
/* fall-through */
case OS_SWTMR_STATUS_CREATED :
case OS_SWTMR_STATUS_CREATED :