|
本帖最后由 xivisi 于 2016-4-12 16:18 编辑
2016-04-12:
终于发现问题所在,使用的处理器有缺陷,外置SDRAM居然不允许ARM核和DMA同时访问(仅内置SRAM支持,日了狗了),芯片缺陷手册居然没有对应描述。调整软件构架、精简内存占用,已解决。
2016-04-07:
昨晚继续进行测试,刚刚发现连接断开,经查,PCB出现了死循环:
、==================================================================
2016-04-06:
仅协议栈和协议栈相关层代码的情况下:回环、单发、单收均无问题,一加上同事的应用层代码,就出现之前的问题(我的代码几乎没有任何修改)。目前只能判定,同事的代码有问题;
===========================================================================================================
目前在调一个 LWIP RAW TCP发送代码, 单词发送的数据量比较大,目前48KB;
目前故障现象:发送成功一个包之后,发现该pcb的发送缓存一直满,再也不能发送数据,求助
以下是发送函数的代码:
- <i>err_t app_net_connect_send(connect_t *connect)
- {
- err_t result;
- connect_txdata_t *txdata;
- uint32_t buf_len, ipc_len, tx_send, write_len;
- struct tcp_pcb *tpcb;
- txdata = connect->tx_work; //获取正在发送的数据块
- if(txdata == NULL) //如果没有正在发送的数据
- {
- //从等待发送的链表中取出一个数据块
- txdata = (connect_txdata_t*)list_fifo_remove(&connect->tx_ready);
- if(txdata) //如果数据块存在
- {
- //标记为正在发送的数据块
- connect->tx_work = txdata;
- //预先放入完成队列,由TCP接收回调函数处理
- list_fifo_insert(&connect->tx_finish, &txdata->link);
- }
- else return ERR_OK;
- }
- //取出pcb
- tpcb = connect->pcb;
- assert(tpcb == NULL);
- //计算剩余发送数据的长度
- ipc_len = txdata->length;
- tx_send = txdata->tx_send;
- write_len = ipc_len - tx_send;
-
- if(write_len)
- {
- //使发送数据的长度不超过,TCP发送缓存
- buf_len = tcp_sndbuf(tpcb);
- if(write_len > buf_len) write_len = buf_len;
- //数据加入发送队列
- result = tcp_write(tpcb, &txdata->data[tx_send], write_len, 1);
- if(result != ERR_OK) return result;
- //强制数据立即发送
- tcp_output(connect->pcb);
- tx_send += write_len;
- }
- //如果所有数据已交给协议栈,认为当前数据块已发送完毕
- if(tx_send == txdata->length) connect->tx_work= NULL;
- //否则只记录发送数据大小
- else txdata->tx_send = tx_send;
-
- return ERR_OK;
- }</i>
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|