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_handler

    PC:
    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是否可以在使用时规避?

    谢谢~



    1. 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定时器中有调用。



  • @kkFR8018运行时Crash, 请问有什么建议 中说:

    请问这是一个和os_time

    ke_timer_init 和os timer 有关, 不是硬件timer. 是不是在执行比较耗时的操作?应该是app层软件应用的问题.



  • @kawhiFR8018运行时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一次, 会不会循环执行了?