TI,您好。
我碰到了一个麻烦,需要您的指导。
我在使用CC1310时,使用工程是从rfEasylinkRx创建的。
在程序中有4个任务:
1、RF接收任务,RF接收到数据后,保存到一个全局数组中。
2、数据打包任务,每秒钟检查全局数组是否有数据,有数据就进行协议打包,并将打包数据放入队列中,然后发布一个事件表示数据已经就绪。
3、串口发送任务,此任务一直等待数据就绪的事件,然后从列队中取出数据,通过串口发出。
4、内部FLASH读写任务,保存一些系统参数。
为了定位问题,已经将程序中串口接收的函数(UART_read)屏蔽,因此程序中只有串口发送,也屏蔽了内部FLASH的保存,只是上电时读取一下。
目前遇到的问题:
程序开始能正常运行,大约几小时至10多个小时后,程序产生异常。
查看汇编代码,发现程序停留在 ti_sysbios_family_arm_m3_Hwi_excHandler__I,无法跳出。
使用ROV工具检查后,发现如下错误
检查系统堆栈与任务堆栈,均未发现异常
以下是其余相关截图
以上问题已经困扰我很多天,一直未能定位到问题点,不知如何排查,如果还需要其他信息我会继续提供。
企盼您的指导,谢谢。
Viki Shi:
一般CPU exception 由以下几种原因造成:
1、堆栈溢出
2、写入空指针
3、外设模块使用不当建议按照这边的方法排查:dev.ti.com/…/node
RUOHAN LIU:
回复 Viki Shi:
感谢您的回复,在CCS开发环境中,有什么方法能定位是什么问题造成的吗?或者有什么方法能找到相关的线索。这个代码我和我的同事已经共同梳理很多次,实在是找不到头绪。谢谢。
Viki Shi:
回复 RUOHAN LIU:
HW exception的排查方法就是我上面所附的文档
RUOHAN LIU:
回复 Viki Shi:
您好,阅读您给的文档以后,我已经定位了出问题的语句,ROV中显示如下所示。
根据PC和LR找到问题语句。
根据异常信息,初步发现是OS的代码,在将任务放入就绪列队时,入列出错了。
由于涉及到了底层的代码,请教这种情况下,我该如何继续查找原因。谢谢。
RUOHAN LIU:
回复 RUOHAN LIU:
您好,今早又出现了一次异常,与上次异常时的地址不一样,异常位置在 ti_sysbios_knl_Semaphore_post函数中,调用ti_sysbios_knl_Clock_stop时出错。
现在怀疑可能是程序中有地方在随机改写RAM,导致程序出现异常,请问这种情况有工具或者方法可以快速定位吗?
RUOHAN LIU:
回复 Viki Shi:
您好,这个问题依然没有解决,希望您能给出解决方法或者指引一下方向。 另外按照文档中的方法排查HW exception,发现memory browser窗口无法打开,请问这个可以解决吗? 期待您的回复,谢谢。
Viki Shi:
回复 RUOHAN LIU:
我研究一下,可能需要一点时间,后续再来回复
Viki Shi:
回复 Viki Shi:
建议开启kernel里的assert,然后rebuild 应用程序。这一步可以设置应用在flash中使用kernel,而不是ROM。使能assert的步骤如下:
BIOS.assertsEnabled = true; //BIOS.assertsEnabled = false;另外,注释掉所有会影响kernel ROM的代码,比如:
var ROM = xdc.useModule('ti.sysbios.rom.ROM'); if (Program.cpu.deviceName.match(/CC2640R2F/)) {ROM.romName = ROM.CC2640R2F; } else if (Program.cpu.deviceName.match(/CC26.2/)) {ROM.romName = ROM.CC26X2V2; } else if (Program.cpu.deviceName.match(/CC13.2/)) {ROM.romName = ROM.CC13X2V2; } else if (Program.cpu.deviceName.match(/CC26/)) {ROM.romName = ROM.CC2650; } else if (Program.cpu.deviceName.match(/CC13/)) {ROM.romName = ROM.CC1350; }