FR8018运行时Crash, 请问有什么建议
-
你好,在我们的项目中,客户反馈设备会有假死的情况;
经过长时间的测试,发现会有某个地方长时间占用cpu,导致空闲任务os_user_loop_event_set(&loop_callback)
执行的时间间隔会大于1秒(在程序中做了打印,超过时间间隔打印log);
这种情况下的直观现象:用于处理串口数据的软件定时器(os_timer)不能被执行。
在找问题过程中,长时间放置(根据log大概50分钟),MCU重启了,重启时打印的PC LR值如下:
[14:16:15.004]收←◆Crash, dump regs:
PC = 0x000036DC
LR = 0x0000AB33根据LR PC值,发现应该时ROM里的内容,根据sdk里的syscall.txt文件定位问题,大概是:
LR:
0x0000aa09 T ke_time
0x0000aa45 T ke_timer_active
0x0000aa6d T ke_timer_adjust_all
0x0000aa85 T ke_timer_clear
0x0000aaed T ke_timer_init
0x0000ab4d T ke_timer_set
0x0000abf9 T ll_channel_map_ind_handlerPC:
0x000035ff T co_list_init
0x00003607 T co_list_insert_after
0x00003631 T co_list_insert_before
0x00003659 T co_list_merge
0x00003671 T co_list_pool_init
0x000036d5 T co_list_pop_front
0x000036e9 T co_list_push_back
0x000036fd T co_list_push_back_sublist根据这些信息,不知道是不是和os_timer相关。
另外查看了SDK的代码提交记录,发现有关于修复os_timer issue的描述:
- commit 64ad073d946960eb486245ce25d15067be3e9514
| Author: owen owen@freqchip.com
| AuthorDate: Thu Nov 25 10:39:47 2021 +0800
| Commit: owen owen@freqchip.com
| CommitDate: Thu Nov 25 10:39:47 2021 +0800
|
| synchronize with internal version d235a6b
| 1. fix packet transfer failed in secure connection pairing procedure.
| 2. support l2cap lecb channel
| 3. fix os_timer issues
|
我们使用的SDK版本:SDK Compiled: Nov 23 2020 09:49:26
考虑到可能存在的兼容问题,目前没有升级SDK,基于之前的代码升级新SDK会比较麻烦请问有什么建议,来定位问题,如果是os_timer的问题,可能的原因是什么,如果不升级SDK是否可以在使用时规避?
谢谢~
- commit 64ad073d946960eb486245ce25d15067be3e9514
-
- ke_timer_init , 是不是多次初始化了. 2.sdk版本好旧了, 建议升级
-
ke_timer_init 这个是sdk里面的,应用程序并没有调用,请问这是一个和os_timer相关的,还是硬件定时器相关的?
进一步调试发现os_timer有概率不会执行,使用os_timer_start(&test_timer, 100, false);
启用os_timer,根据log发现会有没有执行的情况,请问可能原因?os_timer_start 没有成功?另外根据论坛及SDK相关demo,推测应该是使用FreeRTOS, 那么根据FreeRTOS相关,
软件定时器Start是有区分在中断中使用的 和非中断的;那么os_timer_start是可以在中断中调用的吗?目前是在Timer0定时器中有调用。
-
@kk 在 FR8018运行时Crash, 请问有什么建议 中说:
请问这是一个和os_time
ke_timer_init 和os timer 有关, 不是硬件timer. 是不是在执行比较耗时的操作?应该是app层软件应用的问题.
-
@kawhi 在 FR8018运行时Crash, 请问有什么建议 中说:
是不是在执行比较耗时的操作
这个目前还在排查是否有异常情况导致占用时间较长;
因为Crash的问题优化后这几天测试没复现;
目前有个比较奇怪的问题,
如上次所说: os_timer_start启动一个单次定时器os_timer_start(&xxx_timer, 100, false);
有时候定时器函数没有被执行,导致应用程序的一些流程没有执行,从而影响了正常的业务逻辑;请问os_timer_start() 启动软件定时器,为什么会有不执行的情况? 如上次所说,在timer0中断 和 非中断中有调用;
中断中尝试了关中断调用os_timer_start(), 测试几小时后还是会出现。
GLOBAL_INT_DISABLE();
os_timer_start(&xxx_timer, 100, false);
GLOBAL_INT_RESTORE();尝试了os_timer_start()之前先调用os_timer_stop(),测试后也没有解决问题。
是因为os_timer_start()没有执行成功吗?而os_timer_start()这些API都没有返回值,如何判断是否成功?
是否也是有像FreeRTOS那样,如果不能将timer添加到定时list就会失败?以上有什么建议? Thanks~
-
有没有可能是代码没执行到?
-
@kawhi
可以确定os_timer_start()有执行到,在os_timer_start()后添加了打印log;
可以发现每次出现问题都是打印了log,没有看到进入os_timer function的log;
-
@kawhi
另外,拉取最新的sdk,测试几个小时候有同样的问题
-
os_timer_start 前os_timer_stop一次, 会不会循环执行了?