打印

[求助] 周立功LPC1700开发板 TCP + uCOSII

[复制链接]
3315|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
arm菜鸟人|  楼主 | 2013-1-28 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在学习LPC1700的Ethernet。使用的周立功LPC1700开发板,使用的Keil TCP的程序代码。
里面使用的uCOSII系统。对里面的工作细节不是很了解,想让清楚的讲解一下。
里面开了4个任务: TASK0,主要是创建其他任务和 将上位机发送来的数据接收进缓冲区。(是否进行解析?)
                                TASKB,对UDP数据进行处理。(怎么处理了?接收到的数据是UDP协议的就交给它?然后再发送回去?)
                                TASKC,对TCP数据进行处理。同TASKB的疑问。
                               TASK_Server,创建服务器。对这个不是很了解,既然有服务器了,为什么还要开前面的任务?直接上位机发了数据,接收在做处理(将数据发给客户端)。服务器处理的数据是最后解析好了的数据吗?
                               是否可以这样理解:先用TASK0接到数据,再用TASKB、TASKC任务进行解析,得到的数据段给服务器?(感觉不太通)
__________________________________________________________________________________________________________________
对uCOSII是小白,对TCP也是小白。两白碰一块儿了。希望有对这方面比较了解的给讲解讲解。
可从数据是怎样接收的?接收后是如何进行解析的?走了哪些过程?最后的数据段在哪?又是如何进行加报文头的?怎样发送出去的?在uCOSII创建任务中需要考虑什么,那些信号量、消息队列怎样工作。越详细越好。
欢迎大家说说自己的看法。
非常感谢大家指点指点。
______________________________________________________________________________________________________________
想在里面添加一个 CAN 自收自发的任务 结果没成功。估计是信号量什么的没协调好。

TCP_Test.zip

1.69 MB

源码

相关帖子

沙发
arm菜鸟人|  楼主 | 2013-1-28 22:03 | 只看该作者
在 TASK0 中有一段:
j++;
if (j >= 100)
{j=0;}

j都没有赋初值,怎么拿来用呢?这一段是做什么用的?

使用特权

评论回复
板凳
huangxz| | 2013-1-28 22:47 | 只看该作者
本帖最后由 huangxz 于 2013-1-28 22:52 编辑

TCP是分层的结构,服务器只是一个应用层而已,TCP层跟你是服务器还是客户端没有关系的
另外:你的任务在哪里啊,压缩文件里面没看到你创建的CAN任务啊

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
arm菜鸟人 + 3 有启发,给分。
地板
arm菜鸟人|  楼主 | 2013-1-29 09:34 | 只看该作者
huangxz 发表于 2013-1-28 22:47
TCP是分层的结构,服务器只是一个应用层而已,TCP层跟你是服务器还是客户端没有关系的
另外:你的任务在哪里啊 ...

这是母版,加了CAN任务的没贴出来。现将它加于附件。

TCP_CAN.zip

1.76 MB

创建了CAN任务

使用特权

评论回复
5
arm菜鸟人|  楼主 | 2013-1-29 11:48 | 只看该作者
怎么木有人回复解答?

使用特权

评论回复
6
huangxz| | 2013-1-29 15:20 | 只看该作者
怎么不用nxp自己的can驱动啊,这个也自己写的么?
另外,你在任何里面不能直接一个死循环啊,起码要给别的任务切换机会啊。

使用特权

评论回复
7
arm菜鸟人|  楼主 | 2013-1-29 15:21 | 只看该作者
huangxz 发表于 2013-1-29 15:20
怎么不用nxp自己的can驱动啊,这个也自己写的么?
另外,你在任何里面不能直接一个死循环啊,起码要给别的任务 ...

这就是 NXP 自己的驱动啊。估计是信号量处理不当。

使用特权

评论回复
8
huangxz| | 2013-1-29 15:25 | 只看该作者
本帖最后由 huangxz 于 2013-1-29 15:27 编辑
arm菜鸟人 发表于 2013-1-29 15:21
这就是 NXP 自己的驱动啊。估计是信号量处理不当。

里面根本没有采用信号量啊
http://mazhijing.blog.51cto.com/215535/53988

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
arm菜鸟人 + 3
9
arm菜鸟人|  楼主 | 2013-1-29 15:34 | 只看该作者
typedef struct{ INT8U         *RecDataPtr;
              INT16U        length;
              INT8U                num;
              INT8U                 ip[4];
              INT8U                My_Ip[4];
            }Rec_Ptr;
这里的ip 和 My_Ip 指的是哪个与哪个的 ip。

____________________________________________________________________________
        UdpStatus[i].info[j].De_Port=UdpRecBuff[UDP_REC_BUFF_NUM].SourcePort;
#ifdef Little_End
        UdpStatus[i].info[j].De_Port=swap_int16(UdpStatus[i].info[j].De_Port);
#endif
        UdpStatus[i].info[j].De_Ip[0]=(*Udp_Rec).ip[0];
        UdpStatus[i].info[j].De_Ip[1]=(*Udp_Rec).ip[1];
        UdpStatus[i].info[j].De_Ip[2]=(*Udp_Rec).ip[2];
        UdpStatus[i].info[j].De_Ip[3]=(*Udp_Rec).ip[3];
        UdpStatus[i].info[j].num=UDP_REC_BUFF_NUM;
        UdpStatus[i].info[j].len=(*Udp_Rec).length;
        OS_EXIT_CRITICAL();
        UDP_REC_BUFF_NUM++;
        if(UDP_REC_BUFF_NUM>=UdpMaxRec)
                UDP_REC_BUFF_NUM=0;
        OSSemPost(UdpStatus[i].UdpSemRec);
        return (2);

这里交换的信息是将哪里的端口和ip 赋给谁呢?
上位机,目的主机,源主机,LPC1700主机。
这应该是一个接收数据,也就是下位机接收上位机数据,应给是上位机向下位机发送数据,接收缓冲区的内容应该是上位机发送的。那么里面的内容:目的地址应该是 LPC1700的地址和端口,源地址就是上位机的地址。
而,udpState是 LPC1700的 状态那么他 info里的源地址指的是它自身,目的地址是上位机?
这个相对关系,不是很明白,糊涂了。

LPC1700 接到的数据,应该是不断地往上层冒的,接到UDP 应该也是要给上面的应用层的呀?

谁帮忙缕一缕。

使用特权

评论回复
10
arm菜鸟人|  楼主 | 2013-1-29 15:42 | 只看该作者
把问题都问忘了。
Rec_Ptr中 My_Ip 如果是指的本主机地址(上位机?),那么ip 指目的机地址(LPC1700?)
在那段程序中,将 ip  赋值给 info中的 De_ip(目的地址(对于LPC1700而言为上位机?))这不就相互指错了吗?
那么哪里理解不正确?

使用特权

评论回复
11
arm菜鸟人|  楼主 | 2013-1-29 15:43 | 只看该作者
huangxz 发表于 2013-1-29 15:25
里面根本没有采用信号量啊
http://mazhijing.blog.51cto.com/215535/53988

我开始以为不用信号量。后来加了也没能工作。所以,考虑加个信号量再试试。
谢谢你的指点。

使用特权

评论回复
12
arm菜鸟人|  楼主 | 2013-1-29 16:07 | 只看该作者
huangxz 发表于 2013-1-29 15:25
里面根本没有采用信号量啊
http://mazhijing.blog.51cto.com/215535/53988

需要CAN收发的队列吗?

使用特权

评论回复
13
huangxz| | 2013-1-29 17:07 | 只看该作者
arm菜鸟人 发表于 2013-1-29 16:07
需要CAN收发的队列吗?

那要看你can的数据量有多大,如果有爆发性的数据传输,最好还是用队列,否则不用队列也行,

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
arm菜鸟人 + 3 有用信息。
14
huangxz| | 2013-1-29 17:13 | 只看该作者
arm菜鸟人 发表于 2013-1-29 15:42
把问题都问忘了。
Rec_Ptr中 My_Ip 如果是指的本主机地址(上位机?),那么ip 指目的机地址(LPC1700?)
...

关于ip的封包,你用wireshark看下就知道了。

使用特权

评论回复
15
arm菜鸟人|  楼主 | 2013-1-29 21:28 | 只看该作者
huangxz 发表于 2013-1-29 17:07
那要看你can的数据量有多大,如果有爆发性的数据传输,最好还是用队列,否则不用队列也行, ...

我使用了 信号量,还是不能工作。估计不太对,在循环里面。
我在考虑将CAN 收发工作写成一个函数,再调用。将代码发给你看看。有什么不对的你指点指点。
我先改着。

TCP_CAN_sem.zip

1.76 MB

CAN + 信号量

使用特权

评论回复
16
arm菜鸟人|  楼主 | 2013-1-29 21:29 | 只看该作者
huangxz 发表于 2013-1-29 17:07
那要看你can的数据量有多大,如果有爆发性的数据传输,最好还是用队列,否则不用队列也行, ...

谢谢你的关注!

使用特权

评论回复
17
huangxz| | 2013-1-29 23:05 | 只看该作者
一般在ucos任务里面的常用结构如下
    while (DEF_ON) {                                            /* Task body, always written as an infinite loop.           */
        p_msg = OSQPend(&UsbRxQ,
                        0,                //timeout 0表示永远等待
                        OS_OPT_PEND_BLOCKING,
                        &msg_size,
                        &ts,
                        &err);
        PrintfBuffer("usb rx:",(char *)p_msg, 16);
        OSMemPut(&UsbRxMem, (void *)p_msg, &err);                                 //free memory block, pointer is msg, from BTRxMem
        usb_send("HELLO", 16);
        }
要么是pend到一个event(包括信号量等)

要么是
    while (DEF_ON) {                                            /* Task body, always written as an infinite loop.    */
        LED_LED1_ON();
        OSTimeDlyHMSM(0, 0, 0, 100,
                      OS_OPT_TIME_HMSM_STRICT,
                      &err);
                        LED_LED1_OFF();
                                OSTimeDlyHMSM(0, 0, 0, 100,
                      OS_OPT_TIME_HMSM_STRICT,
                      &err);
    }
且不论你在CAN总线的操作上有没有什么问题,首先你要先解决你ucos程序结构上的问题,才能再考虑对资源的操作
如果调试CAN,可以先用供应商的代码,其实CAN只要知道那 10几20个寄存器的配置,是相当简单的。

使用特权

评论回复
18
arm菜鸟人|  楼主 | 2013-1-30 09:52 | 只看该作者
单独开了CAN任务,是能够工作的。
不过编译的时候出现了一个错误:
ZY_CODE\uCOS-II\OS_TASK.C(370): warning:  #177-D: variable "self" was declared but never referenced
这个"self" 好像在删除任务时会出现。
我让 UDP 和 CAN 单独工作,他们之间应该没有共用资源,也就是不用信号量也是能工作的吧?
但是,将两个整合在一起,UDP能工作,CAN不能工作。 我还将CAN的优先级提高了。就算在任务里面出不来,也应该是CAN能够工作的呀。

TASK_CAN.zip

1.02 MB

使用特权

评论回复
19
arm菜鸟人|  楼主 | 2013-1-31 15:56 | 只看该作者
汇报最新结果:已经能够实现CAN和UDP的单独自发送了。不过感觉这样处理还是存在隐患的。(实现功能先)
处理方法就是将 CAN自收发的功能代码加在 服务器任务的代码里。考虑到,CAN任务一直进不去。而其他任务都是正常的,就“借**生蛋”。不过在测试中CAN的接收时 感觉有时间滞后。

接下来的任务是将CAN接收到的数据通过 UDP发给上位机,UDP接收到的数据通过CAN转发出去。继续研究。

UDP_Test-20130131.zip

1.76 MB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:感染属性。

34

主题

539

帖子

1

粉丝