PSDK3.1.0抛出hardfault错误

Completed

Comments

26 comments

  • Hyacincher

    如果我把PSDK注册的任务删除后复位多次没有再触发hardfault。当前使用芯片STM32F405,PSDK的内存分配了一部分在CCM内存区域(0x10000000),另外一部分在普通内存区域(0x20000000)。内存申请接口使用freeRTOS的heap4.c的接口,freeRTOS总分配内存80KB。所有任务初始化完后剩余23KB做动态申请

    0
    Comment actions Permalink
  • Hyacincher

    具体的触发场景为,使用JLINK对STM32进行调试,如果打断点暂停程序,则继续运行后会触发hardfault。这种情形下如果不重启飞机,不管STM32复位多少次都会进hardfault

    0
    Comment actions Permalink
  • DJI Developer Support
    M300机型?OSDK口还是PSDK口负载开发?
    0
    Comment actions Permalink
  • Hyacincher

    M300 RTK,使用SkyPortV2挂载开发,PSDK口开发

    0
    Comment actions Permalink
  • DJI Developer Support
    这个问题可能要具体看一下,注册了PSDK几个任务或模块?建议可以分别单独开启各个任务模块来运行试试,排查一下是不是功能影响。
    0
    Comment actions Permalink
  • Hyacincher

    目前最大可能的是position模块,调试这个模块才遇到的异常,注销掉之后就没有出现了

    0
    Comment actions Permalink
  • DJI Developer Support
    现在是直接运行PSDK sample也会出现吗?可以先检查确认一下PPS信号线的连接,时间同步是否有正常运行。
    0
    Comment actions Permalink
  • Hyacincher

    是的,用的标准sample。PPS线是正常连接的,时间同步模块能正常运行

    0
    Comment actions Permalink
  • DJI Developer Support
    有试过其他的STM32板子吗?我这边用STM32F407和429测试sample的精准定位都是正常的。
    0
    Comment actions Permalink
  • Hyacincher

    暂时没有其他可以移植的型号。我如果不用JLINK进行debug也是正常精准定位的,程序能正常运行。但是用JLINK进行在线调试,并触发断点让系统暂停,之后继续运行的话PSDK的相关线程就会触发hardfault。不知道您那边是用JLINK进行在线调试还是串口输出LOG呢?

    0
    Comment actions Permalink
  • DJI Developer Support
    我没有debug,直接串口打印输出,打断点可能会影响精准定位功能。您debug不是调试这个问题吗?所以不打断点调试不会出现异常错误? ![](https://djisdksupport.zendesk.com/attachments/token/bTLBd5LvENXGkosTe8M6VOUgr/?name=image.png)
    0
    Comment actions Permalink
  • Hyacincher

    是的,如果我不打断点是不会有异常的,只要存在让MCU暂停运行的行为就会造成hardfault,不知道这个您那边能复现么?

    0
    Comment actions Permalink
  • Hyacincher

    还有就是这种提示是为什么呢,PSDK内部malloc失败了么。我现在freeRTOS只能提供到112KB的heap,我的任务需要占用掉50KB左右,不知道剩下的部分可以支持PSDK正常运行么?

    0
    Comment actions Permalink
  • Hyacincher

    [33m[19.283][channel]-[Warn]-[DjiHighSpeedDataChannel_Init:175) Socket handler is null. Probably because socket handler is not be registered. Some functions may not be available.  [0m

    [11:52:49.500]收←◆[32m[19.934][time_sync]-[Info]-[DjiTimeSync_ApplyPpsAsyncCallback:564) apply pps success. [0m

    在这句LOG之后触发了hardfault

    0
    Comment actions Permalink
  • Hyacincher

    另外,如果我关闭所有模组功能,只注册PSDK核心模块就不会出现异常。注册其他任何功能模组都会出现异常。我之前用的是V3.1.0的源文件进行移植的,后来只替换了.lib而没有替换模组sample,不知道这会不会引起什么问题呢?

    0
    Comment actions Permalink
  • Hyacincher

    根据已有现象来看非常像是RAM不足的问题了。不知道您那边能不能帮忙测试下demo的主板F4-discovery,如果把模块全开的情况下能否正常运行呢,当前工程使用的STMF405RGT6与demo的RAM是一样大的,如果您那边也不能正常开全功能我们这边就考虑换主控了。非常感谢

    0
    Comment actions Permalink
  • DJI Developer Support
    STM32内存部分这个已经提交评估优化了,我想再确认一下,咱们出错不是只在debug时才出现的吗?不打断点可以运行跟RAM关系应该不大吧?
    0
    Comment actions Permalink
  • Hyacincher

    是的,之前因为可能存在的内存溢出问题影响了判断,实际的问题根源不在debug这里。问题主要出在RAM上面,麻烦您那边确认下192KB的STM32F4能同时支持到哪些功能呢?目前项目除了高速数据传输和upgrade功能,其他模块都需要使用到,麻烦帮忙评估一个可以同时支持到其他模块所使用到的内存大小

    0
    Comment actions Permalink
  • DJI Developer Support
    之前有发现STM32版本同时使用data transmission和fc_subscrption会有问题,是否有同时开启这两个?
    0
    Comment actions Permalink
  • Hyacincher

    data transmission没有开启

    目前同时开启的有:power management//widget//camera//fc subscription//xport//time sync//position

    0
    Comment actions Permalink
  • DJI Developer Support
    我现在手边没有407 192K的板子,用的是429的板子,RAM:256K测试验证。 STM32F429,PSDK 3.2(release分支版本,非master)sample功能全开没有问题,可以正常运行,可以先参考一下。 ![](https://djisdksupport.zendesk.com/attachments/token/XbjFFv5saTCpaeKQNfMDzcy3H/?name=image.png)
    0
    Comment actions Permalink
  • Hyacincher

    好的,非常感谢。我也买了一块F407ZG的开发板,直接跑demo确实没有任何问题。目前我正在将F405RG的工程底层环境按照demo去修改,后续定位到问题根源再讨论

    0
    Comment actions Permalink
  • Hyacincher

    您好,我问题解决了,根源在于我的底层串口驱动在接收数据时有漏数据的情况,导致带入错误的数据给PSDK时,PSDK解析有错误(内存泄漏)。现在我重新修改了串口驱动的情况下,可以正常运行所需要的模组了。

    不知道对于数据检查这一块是否可以做压力测试呢,我已发现如下现象:

    1、开机给PSDK上传1000+个数据“0”会直接导致解析崩溃

    2、正常运行起来之后数据包缺失部分数据,某些模组解析会崩溃(封包不可见具体位置)

    可否在新版本中增强数据的校验工作,因为正常工程环境中串口数据出错是难免的,直接造成系统崩溃非常影响产品的使用。

    同一个串口的工程我也移植了PSDK2.2.1版本,221版本会报大量校验错误,但不会直接导致系统崩溃,功能是可以持续运行的,希望V3.x能做到同样的数据保护强度

    0
    Comment actions Permalink
  • DJI Developer Support
    好的,我们会进一步确认您反馈的问题,已提交进一步优化STM32平台的SDK lib。
    0
    Comment actions Permalink
  • Hyacincher

    另外就是我发现只要一次性给PSDK上传一大包数据就会导致PSDK直接内存溢出,复现场景如下

    1、串口驱动使用DMA进行传送

    2、在程序正常跑起来之后,使用JLINK调试器暂停程序运行(这时飞机给MCU发送的数据经过DMA仍然继续传输)

    3、继续运行程序,这时在串口缓冲区累积了前几包的数据

    4、触发hardfault硬件错误

    这种情况会引起应用上很多问题。比如我工程中有使用到FatFS进行文件写入(SD卡),在写入大文件的时候,FatFS底层驱动会调用vSuspendAll来阻塞所有线程运行以保护文件的写入。这样会造成释放所有运行权限的时候又累积了一大包串口数据需要解析,然后一解析就触发内存溢出的错误。改FatFS的底层驱动是不现实的。这点您那边是否能确认复现一下呢?

    (demo串口接收方式是中断+FIFO,没有使用串口中断来接收而是使用DMA的原因是项目中有6个串口同时工作,频繁进出中断会导致更多的数据遗漏且影响主逻辑运行)

    0
    Comment actions Permalink
  • Hyacincher

    如果保持demo中的任务优先级0,这个现象会更明显。适当提高任务优先级可以降低发生频率。(PSDK任务优先级0,工程其他自定义任务5-6)

    0
    Comment actions Permalink

Please sign in to leave a comment.