Jone
Jone
写了还是懒

注册于 1 year ago

回答
213
文章
0
关注者
4

函数名加上括号就是调用了,没括号是函数地址

删了(p),把RL_NULL换成要传递的变量p

另外你还是多看下线程创建函数的接口说明吧

不要跨网段,关闭服务器的防火墙,如果还连不上在服务器端抓包看下是否有连接报文

有个abup_fota
不清楚具体的用法,楼主可以研究下

一般情况mcu代码是在flash里执行的,为了提高速度会将部分代码搬到ram中运行,也有全部搬到ram中的。

分散加载脚本是keil中的叫法,GNU里用的链接脚本,可以把flash或者ram划分片区(类似windows电脑把一整块硬盘分成C、D、E多个盘),编译的时候指定代码放置的区域;

另外外挂的ram或者flash要映射为芯片片内地址的时候就需要修改链接脚本来指定地址

单个TCP Server没法直接限制数量
两个办法都有点曲折

  1. 应用层限制,超过数量后就踢掉最早或者最近接入的那个,这样让客户端数量动态维持
  2. 底层限制,这个限制会影响全局。第一个netconns是tcp + udp的socket总数,第二个tcp套接字数目是tcp的数量。这俩参数只要有一个超的新客户端就被底层重置连接(TCP_SETSET)

image.png

H7用过QSPI把外部Flash映射为内部器件,同时外挂了另外一篇SPI Flash,都是轮询方式。
如果与楼主描述的问题存在那是概率性的问题,不过我长时间跑过没出现问题。

ST比较高速率的通信把IO引脚速度调高一些,另外要是问题好复现用逻辑分析仪看看

未初始化的变量要放bss里面才不会占用空间。否则bin文件随变量的大小变化,另外如果ram地址不连续且间隔特别大的话回编译出几百M甚至上G的bin文件

看下我之前的怎么添加BSS段
前面是实验,后面是验证过的方法,倒着看吧节省时间

如你所述非常对
dma的接收缓存与应用层read时的数据源至同一缓存

tcp调用send()是把数据丢到发送缓存中,如果缓存中还有之前的数据,那就会合并发送以提高发送效率。
如果要避免连包要做一些协议,比如当收到对端回应后再发下一包,总之两包数据间隔不能太小。另外改成udp也能避免连包

认同@fhqmcu 的解释

我从数据接收方向来阐述一下接收流程,首先是数据走向:

1硬件Phy接口 -> 2erx -> 3LWIP -> 4APP

流程:

1中接收到数据通过pbuf_malloc申请空间存放数据,然后通过邮箱把数据发给2,2把数据交给3、4,3、4处理完成后pbuf_free

如果3、4处理数据用时较长,2可以缓存1过来的数据并依次处理,没2的话数据堵在了1,而1的资源一般不会太大,就会出现overrun

正常与异常的都读出来对比一下看看,烧录回涉及全擦除或部分擦除

根本问题还是ec20主动上报新数据导致的。ec20修改设置改成只提醒新消息,mcu收到提醒就去主动读,这样数据的收发节奏完全由mcu掌控

用过一个soc,原始sdk编译选项是把警告作为错误。

自我要求是自己的代码中不能有警告,引入的第三方库那就再说了

  1. RT-Thread Studio调用的ST-Link烧录工具是命令行版本的STM32CubeMX Programmer,这个工具会识别芯片型号,非ST的不让用。
  2. Keil调用的Stlink烧录驱动是不识别芯片的,非ST家的芯片也能用

可以把RT-Thread Studio上的烧录工具选项改为DAP LINK就可以用Stlink对非st芯片进行烧录和仿真了

回到
顶部

发布
问题

投诉
建议