Lwip 里的信号量、邮箱、线程

这里简单分析总结一下Lwip sys_arch.c 中的信号量、邮箱、进程相关的内容。系统用的是FreeRTOS。 这里创建了两个全局结构体数组来管理semaphores and mailboxes. 有个不明白的地方是,结构体里的buffer是用来作什么的? 这里的semaphore其实用的是长度为1的queue来实现。mbox是长度为size的queue,其中消息对象类型都是void *,由于freertos在把消息送入队列和提取出队列都是复制的方式(应该是类似ringbuf的操作,没深入研究),所以这里为了提高效率,把对象封装一个消息结构体,只传递指针。在作消息传递时要特别注意内存的分配和释放,以免造成内存泄漏。 这里还要总结的一点是,类似于这种xxx_new, xxx_alloc的函数,用来分配对向内存的函数,传递进去的是指针的地址,因为要将指针指向新分配的内存,所以传进去的为指针的地址。 如这样调用: Lwip 的Thread是用FreeRTOS的xTaskCreate()来实现的。这里有个问题, TI的sys_arch.c里的sys_thread_new的实现,又用mem_malloc()分配了栈内存,是不是多此一举了,因为xTaskCreate里会为这个任务分配栈内存。这里似乎没有任何用处。

LwIP TCP Layer Simple analysis

LwIP Version : 1.4.1; 这里分享一些阅读LwIP协议栈的心得。 有个经验: 源代码才是最权威的资料。 若想用raw api编程,可以参考httpd_raw的代码。若涉及进程间通讯,请参考netconn接口,避免在其它进程内调用非Thead-Safe的函数。 下面说说对一些函数及过程的认识。 (1) xxx_accept(void *arg, struct tcp_pcb *pcb, err_t err); 这个函数的参数注意点: 回调原型:pcb->accept(pcb->callback_arg, pcb, err); @*arg: 这里协议栈传递过来的是lpcb,即监听pcb,不要认为和第二个参数相同。因为在tcp_listen_input()里,当有新连接请求到达时会新建一个npcb并将其加入到tcp_active_list里,在初始化npcb时,继承的是lpcb的callback_arg, 而这个callback_arg在新建监听链接时将其赋为lpcb。 @*pcb: 这里是传递进新创建的pcb。在创建APP过程中,需给其分配新的argument, 指定xxx_recv(),xxx_err(), xxx_poll(), xxx_sent()等函数。 (2) struct tcp_pcb *tcp_listen( struct tcp_pcb *pcb); 这里传入了一个original pcb,返回一个lpcb,因为listening状态的pcb 只需包含更少的信息。函数内新分配了一个 lpcb, 拷贝必要信息后,将original pcb释放。 对于SO_REUSE选项,在此函数内对比已经在监听List 中的pcb, 允许本地端口号相同,但本地IP号不同的连接可再次监听。 (3) 服务端口监听过程分析 TCP_LISTEN_BACKLOG 选项 此选项使能 TCP 对监听列表允许监听的数量控制。在tcp_listen_input()函数内, 当收到SYN帧时,此处对比并限制已经pending 状态的数量,即未被上层accept的连接数量。接下来新建立一个npcb, 并加入active_pcbs
Read More »

用ECS在云端搭建SVN服务

应用环境: ECS 云端系统:Ubuntu 14.04-x64 本地系统:window 使用工具:cygwin + ssh 原版文档: http://www.shayanderson.com/linux/install-and-setup-subversion-server-on-ubuntu-1210-server-with-multiple-repositories.htm 一、安装及目录配置 1. 登录云端服务器 ssh xxx@[IP] 2. 安装subversion apt-get install subversion 检查是否安装完成 svn --version 3. 先建立一个Repositories 目录放置工程 mkdir /home/repos 在目录底下再建立工程 svnadmin create /home/repos/project1 svnadmin create /home/repos/project2 注:删除则用 svnadmin deltify 4. 修改目录组权限让一用户组都可管理此目录 chmod -R g+rws /home/repos //设置组权限 sudo groupadd svn //添加组 chgrp -R svn /home/repos //修改group ownership
Read More »

HTTP协议与HTTP表单传输格式

HTTP请求 从使用者的角度看,一个HTTP请求起始于 用户端浏览器上输入的一个URL地址; 网页中的一个超链接; 提交一个HTML表单。 但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求。 一个标准的HTTP请求由以下几个部分组成 在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本; 紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息; 头部信息之后是一个回车换行符(/r/n),用于标明头部信息的结束。 以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body); 主体数据之后是一个回车换行符(/r/n),用于标明主体数据的结束。 需要注意的是 请求行(request-line)中的URL部分必须以application/x-www-form-urlencoded方式编码。 主体数据(request-body)的编码方式由头部(headers)信息中的Content-Type指定。 主体数据(request-body)的长度由头部(headers)信息中的Content-Length指定。 例如,我们可以在IE浏览器上输入下面的网址: http://localhost:8000/hello/index.html HTTP请求的头部信息如下: 上述信息没有request-body部分,这是以GET方式发送的HTTP请求。如果请求中需要附加主体数据,即增加request-body部分,则必须使用POST方式发送HTTP请求。HTML超链接()只能用GET方式提交HTTP请求,HTML表单( )则可以使用两种方式提交HTTP请求。 HTML表单 HTML表单的使用方法如下: 表单中存在各种类型的表单域标签,如 每一种表单域标签均有NAME与VALUE两种标签属性。这两个标签属性决定了表单提交时传送的属性名及相应的值。 目标地址(URL) action标签属性指定了表单提交的目标地址,其值可以是完整的URL。如: 这样的表单是不符合要求的。如果其URL值存在非法字符(如中文字符),应将其进行URL Encoding处理。URL Encoding的处理方法如下: 字母数字字符 “a” 到 “z”、”A” 到 “Z” 和 “0” 到 “9” 保持不变。 特殊字符 “.”、”-“、”*” 和 “_” 保持不变。 空格字符 ” ” 转换为一个加号 “+”。 所有其他字符都是不安全的,因此首先使用一种编码机制将它们转换为一个或多个字节。然后对每个字节用一个包含 3 个字符的字符串 “%xy”
Read More »

SSI Tag的使用

这里先说最原始的使用SSI tag的方式,因为这样做在C开发中最简单。跟后来通用的web服务器的SSI有点不一样,因为后来为了使上层开发更方便,又进行了一些封装。 最原始的SSI是这样规定的,如在html中嵌入SSI tag。使用 ;,则当Web服务器生成网页时,会将当前的标签后插入所指定的内容。这就是SSI Tag的作用。 SSI可以说是最初动态生成网页的方法,不仅仅是用来插入一些变量也可以直接插入javascript、json等等你想要发送给客户端的内容!一般用SSI来插入静态变量比较方便,如果是插入input框的当前值的话,可以往SSI中插入一段javascript代码或者是json格式的数据,再用javascript把这些实时的值加载进input框。 其Tag 在Web 服务端代码中作如下定义,并定义其序号的宏。 然后在SSIHandler里如下解析,当每次serving a page with a “.ssi”, “.shtml” or “.shtm” file extension 的时候都会将SSI tag进行替换。 学习了SSI tag怎么用的,然后可以再深入研究下在文本中检索 SSI tag 的写法。这里用了个状态机,按顺序搜索ssi lead in 和lead out。 其实看懂了SSI实现的原理,就可以联想到简单的php引擎是如何处理php代码的。另外也可以看出ssi的处理效率是比较低的,因为需要检索整个文本的ssi tag。php也类似,所以后面会出现编译型的php引擎,预先把php代码和文本分开,这样执行效率就高很多。

make工具使用

这里简单记录Makefile 写法,以备忘。 1. Makefile 基本规则: target... : prerequisites ... command ... ... ------------------------------------------------------------------------------- target: 为目标文件,即所要生成的对象; prerequisites : 为要生成target所需要的文件或是目标; command: 即make需要执行的命令,(任意的shell命令,即对应编译器或者平台的命令)。 第一行表示依赖关系,第二行是规则。( 第二行必须由Tab键开头 )。 2.比如有源文件:main.c api.c api.h 用gcc 作编译的过程: gcc -c main.c; gcc -c api.c; gcc -o main main.o api.o ; 写成Makefile的话就是: main: main.o api.o gcc -o main main.o api.o main.o: main.c gcc -c main.c api.o:
Read More »

Ethernet、IP、TCP、UDP帧头格式、详解

引用:http://zoufengfu168.blog.163.com/blog/static/5461055200991333616451/ 一、MAC帧头定义 补充VLAN 和ARP: 二、IP头结构的定义 常用的几个协议号: 1 ICMP 2 IGMP 6 TCP 17 UDP 88 IGRP 89 OSPF 三、tcp头结构定义 四、UDP头结构的定义 ==== http://www.cnblogs.com/li-hao/archive/2011/12/07/2279912.html ————————————————————————————————————————————- tcp、ip、udp头部格式 2.2 TCP/IP报文格式 1、IP报文格式 IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧(见本章1.3节)中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。如图2-3所示: 图2-3  TCP/IP报文封装 图2-4是IP头部(报头)格式:(RFC 791)。   图2-4  IP头部格式 其中: ●版本(Version)字段:占4比特。用来表明IP协议实现的版本号,当前一般为IPv4,即0100。 ●报头长度(Internet Header Length,IHL)字段:占4比特。是头部占32比特的数字,包括可选项。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节。 ●服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。
Read More »

[转]各种工业以太网比较(EtherCAT,EtherNet/IP,ProfiNet,Modbus-TCP,Powerlink)

EtherCAT(以太网控制自动化技术)是一个以以太网为基础的开放架构的现场总线系统,EterCAT名称中的CAT为ControlAutomation Technology(控制自动化技术)首字母的缩写。最初由德国倍福自动化有限公司(Beckhoff AutomationGmbH)研发。EtherCAT为系统的实时性能和拓扑的灵活性树立了新的标准,同时,它还符合甚至降低了现场总线的使用成本。EtherCAT的特点还包括高精度设备同步,可选线缆冗余,和功能性安全协议(SIL3)。   Ethernet/IP是一个面向工业自动化应用的工业应用层协议。它建立在标准UDP/IP与TCP/IP协议之上,利用固定的以太网硬件和软件,为配置、访问和控制工业自动化设备定义了一个应用层协议西蒙公司开发   PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技术的自动化总线标准。作为一项战略性的技术创新,PROFINET为自动化通信领域提供了一个完整的网络解决方案,囊括了诸如实时以太网、运动控制、分布式自动化、故障安全以及网络安全等当前自动化领域的热点话题,并且,作为跨供应商的技术,可以完全兼容工业以太网和现有的现场总线(如PROFIBUS)技术,保护现有投资。 PROFINET是适用于不同需求的完整解决方案,其功能包括8个主要的模块,依次为实时通信、分布式现场设备、运动控制、分布式自动化、网络安装、IT标准和信息安全、故障安全和过程自动化。   MODBUS/TCP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品。显而易见,它覆盖了使用TCP/IP协议的 “Intranet”和“Internet”环境中MODBUS 报文的用途。协议的最通用用途是为诸如PLC’s,I/O模块,以及连接其它简单域总线或I/O模块的网关服务的。 MODBUS/TCP协议是作为一种(实际的)自动化标准发行的。既然MODBUS已经广为人知,该规范只将别处没有收录的少量信息列入其中。然而,本规范力图阐明MODBUS中哪种功能对于普通自动化设备的互用性有价值,哪些部分是MODBUS作为可编程的协议交替用于PLC’s的“多余部分”。 它通过将配套报文类型“一致性等级”,区别那些普遍适用的和可选的,特别是那些适用于特殊设备如PLC’s的报文。   POWERLINK=CANopen+Ethernet 鉴于以太网的蓬勃发展和CANopen在自动化领域里的广阔应用基础,EthernetPOWERLINK 融合了这两项技术的优点和缺点,即拥有了Ethernet的高速、开放性接口,以及CANopen在工业领域良好的SDO 和PDO 数据定义,在某种意义上说POWERLINK就是Ethernet 上的CANopen,物理层、数据链路层使用了Ethernet介质,而应用层则保留了原有的SDO和PDO对象字典的结构 虽然这些工业以太网都是国际标准,但是指的是IEC 61784里的标准,但是这些工业以太网不都是标准的以太网。即这些工业以太网并不都是符合IEEE802.3U的标准,这当中只有Modbus-TCP和EtherNet/IP是符合IEEE802.3U的,只有符合IEEE802.3U标准的,才能与IT和以太网将来的发展相兼容。而不符合IEEE802.3U标准的,基本上可以讲不是以太网,它们都对以太网进行了修改,或者是硬件或者是软件,已经不是以太网了。     各种工业以太网的区别其实主要就是协议的区别,其中最主要的还是应用层协议的区别,我们知道,按照ISO的参考模型,网络被划分为7层。   a.     Modbus TCP和EtherNet/IP的区别主要是应用层不相同,ModbusTCP的应用层采用Modbus协议,而EtherNet/IP采用CIP协议,这两种工业以太网的数据链路层采用的是CSMA/CD,因此是标准的以太网,另外,这两种工业以太网的网络层和传输层采用TCP/IP协议族。还有一个区别是,Modbus协议中迄今没有协议来完成功能安全、高精度同步和运功控制等,而EtherNet/IP有CIPSafety、CIP Sync和CIP Motion来完成上述功能,所以才有Schneider加入ODVA,成为ODVA的核心成员来推广EtherNet/IP。由于这两种网络都是标准的TCP/IP以太网,所以所有标准以太网节点都可以接入这两种网络。 b.     b. 至于EthernetPowerLink(EPL), Ethernet PowerLink就是个怪胎,PowerLink虽然在物理层和数据链路层还是采用标准的以太网,但是它又添加了另一个数据链路层,此EPL数据链路层在结构上为于以太网数据链路层之上。我们知道数据链路层的一个子层的MAC(介质访问)层的作用是[color=#FF0000]决定哪一个节点可以占有总线,也即决定哪个节点一个发送数据[/color]。所以本来由以太网的数据链路层来决定哪一个节点占用总线,现在它被位于它之上的EPL数据链路层给架空了,由这个EPL数据链路层通过软件的方式来决定哪个节点发送数据。所有在这样的一个EPL工业以太网系统中,不能使用交换机,只能使用HUB,所以对100M的网络,EPL总的带宽是小于100m,一盘情况下只有40-50M,而如果采用交换机的工业以太网,它的带宽可以达到大几百M,另外在EPL网络上,所有的节点都要实现EPL数据链路。没有实现EPL数据链路层的节点不能接入此网络。 c. PROFINET分为原来划分为v1,v2,v3,现在一般称为ProfiNetCBA、ProfiNet IO和ProfiNet IRT.也就是通过以太网来实现对等通讯、实时控制和运动控制。v1采用TCP/IP协议,采用标准的以太网,而V2和V3不采用tcp/ip协议,这两种都绕过tcp/ip协议,采用另外的网络层和传输层协议,开发ProfiNet采用开发人员人员认为tcp/ip协议增加了数据在网络中的传输延迟,其实这是一种误解,据美国密歇根大学的教授研究后认为数据在TCP/IP中的传输延迟很小,他们研究得出数据在经过TCP,IP栈时延迟只有不到100微秒,如果采用UDP/IP时就更小,同时他们研究也得出数据在不同应用层延时比较大,不同的协议延迟不一样,但是相差不是很大,从200us-800us不等,他们经过实验后认为以太网的基础设施(指交换机、网卡等)和TCP/IP协议并不是影响工业以太网实时性的主要原因,而认为应用层协议才是主要原因。所以密歇根大学的教授认为绕开TCP/IP协议没有丝毫的意义,反而由于缺少了TCP/IP协议,使得设备也就缺少了IT功能,与其它现场总线没有区别。 ProfiNet V3就更特别了,它不完全采用标准以太网的数据链路层,有一不时间采用以太网的数据链路层(CSMA/CD),而另外一部分时间采用自己的数据链路层,通过一个高精度的时间来完成。所以ProfiNet V3也就不是标准的以太网了,也就给Profinet v3带来如下的问题:不能采用标准的交换机、不能采用标准的以太网芯片、与企业网相连可能会出现问题,与标准以太网相连还要特殊的网关、添加和删除一个节点都需要重新组态网络和重新启动网络、至今没有千兆网络,还有最重要的是,当标准以太网以后发展了后,它不能与标准以太网相兼容,不具有将来以太网所应具有的功能。 d. EtherCat这种工业以太网也很奇怪,它们不使用标准的芯片,一般不使用交换机,软件也不是标准的,对以太网的数据帧进行了一些修改,我们知道一个数据帧只有一个源节点,但是对于EtherCat一个数据可能有多个源节点,即一个数据是由多个节点发送的数据组合而成的。所以对于这样的网络,标准的以太网设备也不能接入这样的网络。   我认为Ethernet/IP和ProfiNet这两种工业以太网都适合各个行业,并不象heidai讲的应用的行业不一样。首先这两种工业以太网都用于传输非实时数据,还可传输实时数据,即可以用于离散控制,也可用于过程控制(当然现在还不能用于本安应用)。其次,这两种工业以太网都可用于网络功能安全传输,Ethernet/IP有CIP Safety协议,而ProfiNet有Profisafe协议,还有在运动控制方面ProfiNet有 ProfiNet IRT,而EtherNet/IP则有CIP Safety,二者都可以用于中高端的运动控制。最后两者都有基于IEEE1588的高精度时钟同步。而Modbus TCP,EtherCat和PowerLink,都只能完成部分控制任务,如Modbus TCP一般只作常规IO实时和非实时数据。而EtherCat和PowerLink则更象是为运动控制而开发的,这二者好像没有功能安全、在PLC和DCS控制方面也没有得到大自动化公司的支持,况且这两者又对以太网进行修改,一个在软件,另一个在软件和硬件方面都进行了修改,都不能兼容标准的以太网设备,个人认为这样做得不偿失,为满足运动控制而不能兼容已有的标准的以太网设备而开发的工业以太网并不是以太网,与其说是工业以太网还不如说是另一种现场总线。 我认为工业以太网的竞争将会在Ethernet/IP和ProfiNet间进行,而其它工业以太网都是这两者的陪衬,将会逐渐退出市场。 EtherNet/IP以后将由罗克韦尔自动化、Omron、施耐德和思科公司来推动,而ProfiNet将由业界老大西门子公司带领一些小公司去奋斗,由国内PLC厂商中的老二、老三和老五对老大,不知谁将引导未来。 其实,工业以太网里还有几个怪胎,举两个例吧: SynqNet: 丹纳赫主导的,几乎只用在运动控制,而且据说只用在了半导体机械行业(奇怪的是,不才也搞半导体机械很久了,却从来没看到过SynqNet,孤陋寡闻啊)。只用了以太网的硬件,完全和我们平常说的以太网没有任何关系,连MAC层都没有。当然如此运用,速度性能当然好,但未来难说。 Sercos III: 光纤SercosII的新一代以太网版本,背后推手是博世力士乐,只用在运动控制。也基本上是只用了以太网底层硬件,系统里竟然连switch都不允许用。速度当然快,但只比SercosII快了一倍。估计用了SercosII的用户,谁会去更新到一个没快了多少的新系统啊,还没问世,就已经不被业界看好了。 我个人认为,最后一定是大西洋两岸的两大巨人之间的角力,就像以前的现场总线战争,最后还不是Profibus和DeviceNet,别的都只能当陪衬的角色? 当然,现在大家都在看中国这个大西洋两岸以外的单一最大市场,中国把砝码放在谁这一边,可能会使天平倾斜一点。但最后,肯定两者都会存在的。我个人认为,咱们应该选Ethernet/IP这一边站 中国用户和制造商应选择Ethernet/IP还是ProfiNet,各人的看法有所不同,不过我认为firstrazor所说的没错,有于ProfiNet采用了专门的芯片、网卡、交换机等以太网基础设施,虽然ProfiNet应用层协议是公开的,但这些芯片却是专用,国内的制造商要想开发符合ProfiNet标准的设备,确要依赖于这些芯片,受制于提供芯片的公司,也就是西门子公司,因此可以将ProfiNet并不是完全开放的。而相反,Ethernet/IP不论是在软件还是硬件上都是标准和开放的,国内的工业以太网制造商还是选择EtherNet/IP为好,至于最终用户的选择,当然是从可靠性、价格、兼容性和可替换性方面考虑,可靠性方面,二者没有明显区别,在其它方面Ethernet/IP具有明显的优势