This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2642R: jumpToPrgEntry()概率性卡死,死机,或挂起

Part Number: CC2642R
Other Parts Discussed in Thread: UNIFLASH

我们的CC2642R程序由一个自编写的从0x0000从执行的boot程序,默认情况下它会检查一个flash存储的标志,然后跳转到app. 在跳转之前,我们会专门设置一个即将跳转标识,保证jumpToPrgEntry(FIRMWARE_START_MEMORY_ADDRESS)会被执行.

完全相同的程序, (boot+app)现在在3个样品上进行测试,其中一个样品出现概率性jumpToPrgEntry(FIRMWARE_START_MEMORY_ADDRESS)失败并卡死,死机,(测试20次,会有10次左右卡死,无蓝牙信号) 经仔细检查代码,确认该函数一定会被执行,但相同的代码在

(boot+app)在另外2个硬件上并无发现(也同样进行20次以上测试),每次都能正常跳到app

每次执行的测试都是上电测试,无debug线,无其它动作

请问可能是哪种情况导致jumpToPrgEntry()失效并卡死?

  • 您好,

    我们无法马上判断是软件或者硬件的问题。

    请问您是使用了您的客制化PCB板吗?如果是的话您可以去做一个硬件审查(链接)。

    您有使用到相应的SDK或者例程吗?可以把相应代码贴上来方便我们查找问题。

  • PCB样件是我们硬件部门设计的,设计期间,也请了TI支持人员的审查. 我的SDK版本为simplelink_cc13xx_cc26xx_sdk_5_40_00_40,目前,经过长期的开发和测试期间,在官方开发板(cc2652开发板)上也多次出现过,频率不高,在目前有限的样件中,至少2个不同的样件上出现了该

    CC2642R: jumpToPrgEntry()概率性卡死的问题,今天上午测试中又出现了一次,特来寻求答案


  • void jumpToPrgEntry(uint32_t prgEntry){
    #if defined(__TI_COMPILER_VERSION__) || defined(__clang__)
    static uint32_t temp;
    temp = prgEntry;
    // Reset the stack pointer,
    temp +=4;
    asm(" LDR SP, [R0, #0x0] ");
    ((void (*)(void))(*((uint32_t*)temp)))();
    #endif
    }

    这是我使用的jump函数,来自官方例程.

  • 您好,

    为更加有效地解决您的问题,我需要询问更了解这款芯片的TI资深工程师,再为您解答,一旦得到回复会立即回复给您。

    感谢您的理解。

  • 您好,

    我们还有一些问题需要咨询您:

    1. 您测试的三个样品是否使用相同的硬件设计?
    2. 重新烧写设备是否真的可以解决问题?
    3. 您能把每个单元的内存内容转存出来比较一下吗? (您可以使用 Uniflash 来执行此操作)
    4. 您能否具体说明如何评估是否有蓝牙信号?
    5. 在执行the out of the box 的simple_peripheral example时,您是否能可靠地在存在故障单元上获取蓝牙信号?

    同时,我们需要了解问题发生时发生的情况。例如,您可以在问题发生后连接调试器并验证 SP 的值和调试指南( debugging guide)中提到的其他元素。

  • 1. 出现该 jumpToPrgEntry(0x8000)死机现象的3个样品中,2个是相同PCB图纸的自己的样件(CC2642R1F),1个是CC2652R1 launchPad开发板

    2. 出现该现象时,我的固件都由2部分构成boot代码(0x0000地址开始,大小约为24KB),和 app代码(0x8000地址开始)构成

    3. 出现该现象时,要么出现在

        a. 只是上电启动(boot代码先执行,然后需要 jumpToPrgEntry(0x8000)到app

        b. 执行固件升级命令,需要从app跳转到boot时..这时早期我用的方法为jumpToPrgEntry(0x0000),经常出现该问题,

           后来我把跳转到boot改成SysCtrlSystemReset();仅在从boot跳转到app时一处使用 jumpToPrgEntry(0x8000)出现频率降低了,有半个多月左右未再出现死机        问题.(早先我也反馈的过SysCtrlSystemReset()死机的问题),直到A样发布测试时,又在测试人员那里出现了一次app 跳转到boot 时(使用SysCtrlSystemReset())死机问题

    4. 我可以把flash的内容读出来,用smartFlash programmer 2,但是读出来之后我不知道如何分析,以及比较什么,和谁比较.比较之后能确认什么

    5. 我们发布的boot+app程序中,app是在simple_peripheral example基础上开发的,app基本没有改动simple_peripheral example的内容,仅在其task中添加初始化函数和非阻塞轮询来实现我们的业务功能. 我确定jumpToPrgEntry(0x0000)或SysCtrlSystemReset()死机是通过log日志,在一定会执行它们之前,我会uart输出日志,并在倒数第二个不会被代码覆盖的flash sectors区域写入一个标志. 提示将要做的事. 在程序正常时,蓝牙信号正常,可以用手机读写数据.

    6. 问题发生后,没有办法调试了,已经死了,只能重新上电,可以看到,它又跑起来了

    希望你们能够帮助分析和解决该问题,已经困扰我1个多月了,注意,该问题是偶发性问题,同一个程序不会一直出现该问题,仅在早期全部使用jumpToPrgEntry()在app和boot之间跳转时,在一个自制样件上出现了高达50%的启动失败率(上电后从boot跳转到app死机频率)

  • 您好,

    帮您同步工程师,有答复后回复您。

    感谢您的支持。

  • 您好,

    我们这边工程师还需要问您几个问题:

    2个是相同PCB图纸的自己的样件(CC2642R1F),1个是CC2652R1 launchPad开发板
    一种思路是在工作板和非工作板(working and non-working boards)之间交换 CC26x2 设备,以查看问题是由 IC 引起还是由定制设计引起。
    用smartFlash programmer 2,但是读出来之后我不知道如何分析,以及比较什么,和谁比较.比较之后能确认什么
    想让您比较工作单元和非工作单元(working and the non-working units),以查看是否可以发现一些差异。
    问题发生后,没有办法调试了,已经死了,只能重新上电,可以看到,它又跑起来了

    您的意思是在问题发生后,您无法按照调试指南中的说明连接调试器吗?您最终是否设法通过附加的调试器重现该问题?