按照 kawaii-mqtt 的配置步骤使用自带的 test 连接正常
使用 kawaii-mqtt 的代码生成器输入阿里 iot 的参数生成代码编译,启动任务结果
日志显示:
[10:32:42.719]收←◆
[I] >> packages\kawaii-mqtt-latest\mqttclient\mqttclient.c:991 mqtt_connect_with_results()... mqtt connect success...
[10:32:42.798]收←◆
[W] >> packages\kawaii-mqtt-latest\mqttclient\mqttclient.c:1048 mqtt_connect_with_results()... mqtt yield thread creat faile...
[10:32:44.031]收←◆[13544] D/drv_dc_fan:
不知道 heap 是什么,我停止了其它的线程,就能创建成功了,但是奇怪的是我从去平台发来消息,不见了一大段。同时控制台全令 free 得到如下输出。
@jackenjoy
free命令出来的就是heap(堆)的使用情况。
可不就是,你把其他停止了(不再占用内存),就能顺利启动mqtt任务呀。
信息不见了,可能是你的ulog开辟的缓冲区不够。
哦原来是这样,那怎么把 heap 变大呢
@lchnu 同时我刚查了下好像对不上额,有些空间丢了,不知道是不是由下面的警告产生的。
@jackenjoy 丢了是什么意思?能否详细描述下?
不知道你是否指,RAM部分有96KB,但是实际Heap区只有30多kb的问题。
以下内容是之前对其他问题的答复,面向你的问题,简单整理了一下:
RAM部分有.data,.bss,HEAP,Stack,合计占用了96KB。
系统Stack
、串口缓冲区、LWIP/AT缓冲区、各个线程的栈都分配较大,导致相关线程启动后,HEAP区只有30K?上述提到的部分,除了系统Stack
,都是从Heap中分配空间的。因此,free命令显示总Heap区只有30kb,并不奇怪。
建议你查看map文件,同时,在自己工程中通过源代码确认一下,你设置的各个线程的stack大小,看看能否减小部分RAM空间占用。
注:准确起见,这幅图的位置不是绝对的,看map文件编译后的布局就清楚了。有些工程中,系统Stack在bss段之前,顺序是.data, .stack, .bss, Heap。这幅图只是为了表示它们四者都在SRAM中。
@lchnu 对就是你猜测的那样,这是基于潘多拉开发板的,ram应该有 128k 的。具体数据摘录如下
@jackenjoy
所以,你最开始用mqtt的时候,线程创建失败的原因就是heap(堆区)不够了。现在问题解决了就好。
如果你使能了
RT_USING_HEAP
,那么Heap的初始化是在board.c中的rt_hw_board_init
函数中:其中,
HEAP_BEGIN
是&__bss_end
,HEAP_END
是SRAM的顶部(0x20000000 + x*1024)。另外,你说潘多拉上有128KB,但是你提供的程序代码部分,SRAM1_SIZE是被设置成了96KB。
@lchnu 那么 系统Stack 在哪里可以看到呢
@jackenjoy
打开rtthread.map文件,看一下
_sstack
和_estack
,确认一下就好了。默认的设置一般不大,似乎0x1000而已,4KB。@lchnu 是这一段吧,只有 0x400 字节而已啊
@jackenjoy
是,系统Stack不大。 但是,你的线程的stack都是从heap区分配的呀,heap剩不了多少。