OS下要包含3个任务,
1、ethernetif_input 用于从中断接收数据包,处理之后转发给tcoip任务。
2、tcpip_thread 收到处理过的数据包进行解析和其他操作
3、用户自定义应用程序
遇到的问题:
1、等待中断数据包进入硬件错误,中断信号量没有初始化。
2、程序不运行,调试模式不能进入main,因为use microLib没有勾选。
3、ping一段时间后延时不断增加,查到如下解决方案 http://blog.sina.com.cn/s/blog_a4e2465a0102ws39.html
void ethernetif_input(void *p_arg)
{
uint8_t err;
struct pbuf *p;
struct netif *netif;
netif = (struct netif *)p_arg;
while(1)
{
OSSemPend(ethSem, 0, &err);
while(1)
{
p = low_level_input(netif);
if (p == NULL)
{
break;
}
if (netif->input(p, netif) != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
OSTimeDly(1);
}
}
}low_level_input中修改
frame = ETH_RxPkt_ChainMode();
if(frame.length == ETH_ERROR)
{
return p;
}
/* Obtain the size of the packet and put it into the "len"
variable. */
len = frame.length;其他:
#define MEM_SIZE (10*1024)
这个是占用的内存,根据实际情况修改
20170924
今天想把stm32作为TCP服务器,却最多只能 建立2个连接,解决方式如下
1、ucosii的os_cfg.h文件中的 #define OS_MAX_QS 4
这个值表示最大消息队列数,改成6就可以建立3个连接。
参考 http://www.openedv.com/posts/list/45353.htm
2、还有opt.h文件中的#define MEMP_NUM_NETCONN 5
这个值表示最大socket数值,每个连接都会分配一个socket
3、为每个连接分配一个任务,另一个任务是判断accept然后将socket传入不同的任务中,
当第四个连接进来时,先accept,然后马上关闭连接。多连接时会有很多任务要建立,暂时没想到其他方式。
20170926
1、当发送网络数据较长时,每次发送结束要有一定延时等待,不然丢包比较严重,这可能和lwip的缓存空间有关系。
在STM32上移植lwip遇到包括中断信号量初始化错误、程序无法运行及ping延迟增加等问题。解决方案涉及OS配置修改,如增加最大消息队列数和最大socket数量。同时,对于长数据发送,需要适当延时以避免丢包。

8653


被折叠的 条评论
为什么被折叠?



