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功能,可以参考下篇博客移植。