LiteOS使用不当导致软件定时器无响应问题

29 篇文章 4 订阅
8 篇文章 2 订阅

现象

系统最先创建的软件定时器无响应,但是任务可以正常调度。

解决

可能原因:

  1. 软件定时器初始化未正确完成。
  2. 软件定时器的创建或注册过程中出现错误。
  3. 软件定时器被错误地删除或释放。
  4. 系统中存在线程竞争问题,导致定时器列表在访问时出现不一致状态。
  5. 系统资源不足,无法为定时器分配必要的内存。

LiteOS使用链表管理软件定时器,其中m_pstSwtmrSortList为计数链表,用来记录已经创建或者处于运行中的软件定时器,m_pstSwtmrFreeList为空闲的软件定时器链表。

调试发现,m_pstSwtmrSortList在软件定时器计数未到达之前变成了NULL,导致osSwtmrScan函数没有正常执行,表现出来的就是软件定时器无响应。

通过跟踪m_pstSwtmrSortList的变化过程,发现问题代码如下:

UINT32 uwRet = LOS_OK,tick = 0;
uwRet = LOS_SwtmrTimeGet(xxx_Swtmr_Handle,&tick);
if((uwRet == LOS_OK) && (tick > 0))
{
	LOS_SwtmrDelete(AteSuspend_Swtmr_Handle);
}

xxx_Swtmr是一个单次定时器,本意是通过LOS_SwtmrTimeGet函数判断软件定时器是否处于运行状态,如果处于运行状态,那么就删除这个定时器。问题就出现在LOS_SwtmrTimeGet上面。xxx_Swtmr是在需要使用的时候才会使用LOS_SwtmrCreate创建同时使用LOS_SwtmrStart开始,句柄xxx_Swtmr_Handle定义的全局变量,会自动的被初始化为0。

系统最先创建的软件定时器句柄为0,当上面代码段被执行的时候xxx_Swtmr还没有创建,xxx_Swtmr_Handle的值为0,使用LOS_SwtmrTimeGet函数和LOS_SwtmrDelete函数的时候由于定时器句柄0有效,返回结果为LOS_OK,因此误的处理了另一个软件定时器。

综上,产生这种问题的原因是软件定时器被错误地删除或释放。

解决

在不改变LiteOS源码的情况下:

  1. 未创建的软件定时器句柄定义为大于LOSCFG_BASE_CORE_SWTMR_LIMIT的值,这样LOS_SwtmrTimeGet函数返回结果为LOS_ERRNO_SWTMR_ID_INVALID。
  2. 系统开始时创建一个周期性软件定时器,确保句柄0被占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值