请问ch592在adv_vendor_self_provision_with_peripheral最大支持多少的串口缓冲数组

ch592在adv_vendor_self_provision_with_peripheral例程中,添加了串口中断,把收到的数存入队列,队列大小设置的800长度。在我发出730字节的数据的时候,并打印出来的时候系统就自动复位了。改小队列长度打印出来就不会复位?

您好,RAM的占用量多少。RAM去掉协议栈占用的部分后,剩下的部分是给用户分配堆栈用的。如果使用了非TMOS的内存申请,可能是RAM不够了;建议使用tmos_msg_allocate()接口管理内存,由TMOS协议栈介入管理内存。

可以在代码开头加打印寄存器R8_RESET_STATUS的数值,检查一下复位原因。

在HardFault中断服务函数中添加打印,看看是否进了硬件错误中断,参考下篇博客添加打印跟踪一下复位原因。

CH57x/CH58x/CH32V wch risc-v 芯片hardfault问题追踪&程序卡死追踪 - iot-fan - 博客园 (cnblogs.com)



Memory region         Used Size  Region Size  %age Used

           FLASH:      108284 B       152 KB     69.57%

             RAM:       16624 B        18 KB     90.19%

编译后的RAM占用16624字节,意思这16k是协议栈用的内存嘛?   运行程序的确是到了硬件错误中断里的并且执行了复位。按道理说,我加大数组,编译通过应该可以用吧


在这个例程里可不可以更改Link.ld中RAM的起始位置和长度呢?能改的话最大能改到多少,并且不影响其蓝牙、OTA和mesh的功能


运行到硬件错误中断函数后复位,一般是内存溢出或篡改造成的。

该工程的协议栈占用的内存主要由MESH_MEM和BLE_MEMHEAP_SIZE这两处分配。tmos_msg_allocate()管理的内存有BLE_MEMHEAP_SIZE限制,申请不到内存时会报错。全局变量的占用大小是包含在已使用RAM里,就是图里的16K的编译结果中的,编译不报错就行,但是要留有一定的RAM余量;局部变量和malloc()函数,占用的内存是编译后剩余的RAM,占用过大可能导致内存错误。

该工程中无法修改LD文件调整RAM大小,有8K的ram是OTA要用到的,不能再改大了。RAM实在不够用建议更换芯片,可以考虑CH582和CH32V208这两款。


好的谢谢


你好请问一下,如果裁剪掉OTA功能只保留mesh和BLE的功能,最大能给tmos系统多少内存供分配呢?裁剪掉OTA有没有具体例程供参考


您好,可以直接在自配网代码里增加BLE功能,可以参考下篇博客移植。

蓝牙mesh组网实践(在mesh工程中添加BLE功能) - JayWell - 博客园 (cnblogs.com)


只有登录才能回复,可以选择微信账号登录