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()函数内, [c] … else if (flags & TCP_SYN) { LWIP_DEBUGF(TCP_DEBUG, (“TCP connection request %“U16_F” -> %“U16_F”.\n”, tcphdr->src, tcphdr->dest)); #if TCP_LISTEN_BACKLOG if (pcb->accepts_pending >= pcb->backlog) { LWIP_DEBUGF(TCP_DEBUG, (“tcp_listen_input: listen backlog exceeded for port %“U16_F”\n”, tcphdr->dest)); return ERR_ABRT; } #endif /* TCP_LISTEN_BACKLOG */ npcb = tcp_alloc(pcb->prio); … #if TCP_LISTEN_BACKLOG pcb->accepts_pending++; #endif … [/c] 当收到SYN帧时,此处对比并限制已经pending 状态的数量,即未被上层accept的连接数量。接下来新建立一个npcb, 并加入active_pcbs 的list中。 tcp_process() 主要处理 active_pcbs 的状态机。经过三次握手协议之后就进入了ESTABLISHED状态。 这里着重分析下tcp_input(pbuf *p, netif *inp);函数。 函数传入的是一个pbuf和netif,传入的参数并无连接的概念,接着在这里就进入了tcp层。tcp层维护着几个list: [c] /** An array with all (non-temporary) PCB lists, mainly used for smaller code size */ struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.

用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 usermod -a -G svn [username] //添加用户进组 groups // 检查用户是否被添加进组 二、云端上测试SVN服务 1. 新建一个文件夹 mkdir /home/tmp svn checkout file:///home/repos/project1 /home/tmp // checkout到目录tmp 2.

HTTP协议与HTTP表单传输格式

HTTP请求 从使用者的角度看,一个HTTP请求起始于 用户端浏览器上输入的一个URL地址; 网页中的一个超链接; 提交一个HTML表单。 但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求。 一个标准的HTTP请求由以下几个部分组成 [code] [] [/code] 在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请求的头部信息如下: [code] GET /hello/index.html HTTP/1.1 Accept: */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate Host: localhost:8000 Connection: Keep-Alive Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6 [/code] 上述信息没有request-body部分,这是以GET方式发送的HTTP请求。如果请求中需要附加主体数据,即增加request-body部分,则必须使用POST方式发送HTTP请求。HTML超链接()只能用GET方式提交HTTP请求,HTML表单( )则可以使用两种方式提交HTTP请求。 HTML表单 HTML表单的使用方法如下: [html] … VALUE VALUE … [/html] 表单中存在各种类型的表单域标签,如 [html] 、及。 [/html] 每一种表单域标签均有NAME与VALUE两种标签属性。这两个标签属性决定了表单提交时传送的属性名及相应的值。 目标地址(URL) action标签属性指定了表单提交的目标地址,其值可以是完整的URL。如: [html] … 如果放置表单的网页与表单提交的目标地址在同一个HTTP服务器上,则目标地址可以用绝对路径表示(绝对路径相对于HTTP服务器)。绝对路径以“/”开头,包括WEB应用上下文及请求。如: 如果放置表单的网页与表单提交的目标地址在同一个WEB应用上下文上,则目标地址可以用相对路径表示(相对路径相对于放置表单的网页)。相对路径不以“/”开头,不包括WEB应用上下文。如: 需要注意的是,action标签属性的值必须符合URL的要求,其编码必须符合application/x-www-form-urlencoded编码规则。如下面的表单: … [/html] 这样的表单是不符合要求的。如果其URL值存在非法字符(如中文字符),应将其进行URL Encoding处理。URL Encoding的处理方法如下: 字母数字字符 “a” 到 “z”、“A” 到 “Z” 和 “0” 到 “9” 保持不变。 特殊字符 “.

SSI Tag的使用

这里先说最原始的使用SSI tag的方式,因为这样做在C开发中最简单。跟后来通用的web服务器的SSI有点不一样,因为后来为了使上层开发更方便,又进行了一些封装。 最原始的SSI是这样规定的,如在html中嵌入SSI tag。使用 [code]<–#tagname–>[/code] ;,则当Web服务器生成网页时,会将当前的标签后插入所指定的内容。这就是SSI Tag的作用。 SSI可以说是最初动态生成网页的方法,不仅仅是用来插入一些变量也可以直接插入javascript、json等等你想要发送给客户端的内容!一般用SSI来插入静态变量比较方便,如果是插入input框的当前值的话,可以往SSI中插入一段javascript代码或者是json格式的数据,再用javascript把这些实时的值加载进input框。 [html] Name:IP Address:MAC Address:[/html] 其Tag 在Web 服务端代码中作如下定义,并定义其序号的宏。 [c] static const char *g_pcConfigSSITags[] = { “ipaddr”, // SSI_INDEX_IPADDR “macaddr”, // SSI_INDEX_MACADDR “p0br”, // SSI_INDEX_P0BR “p0sb”, // SSI_INDEX_P0SB “p0p”, // SSI_INDEX_P0P “p0bc”, // SSI_INDEX_P0BC “p0fc”, // SSI_INDEX_P0FC “p0tt”, // SSI_INDEX_P0TT “p0tlp”, // SSI_INDEX_P0TLP “p0trp”, // SSI_INDEX_P0TRP “p0tip”, // SSI_INDEX_P0TIP “p0tip1”, // SSI_INDEX_P0TIP1 “p0tip2”, // SSI_INDEX_P0TIP2 “p0tip3”, // SSI_INDEX_P0TIP3 “p0tip4”, // SSI_INDEX_P0TIP4 “p0tnm”, // SSI_INDEX_P0TNM “p1br”, // SSI_INDEX_P1BR “p1sb”, // SSI_INDEX_P1SB “p1p”, // SSI_INDEX_P1P “p1bc”, // SSI_INDEX_P1BC “p1fc”, // SSI_INDEX_P1FC “p1tt”, // SSI_INDEX_P1TT “p1tlp”, // SSI_INDEX_P1TLP “p1trp”, // SSI_INDEX_P1TRP “p1tip”, // SSI_INDEX_P1TIP “p1tip1”, // SSI_INDEX_P1TIP1 “p1tip2”, // SSI_INDEX_P1TIP2 “p1tip3”, // SSI_INDEX_P1TIP3 “p1tip4”, // SSI_INDEX_P1TIP4 “p1tnm”, // SSI_INDEX_P1TNM “modname”, // SSI_INDEX_MODNAME “pnpport”, // SSI_INDEX_PNPPORT “disable”, // SSI_INDEX_DISABLE … }; [/c] 然后在SSIHandler里如下解析,当每次serving a page with a ``.

make工具使用

Makefile 正如其名作为一个制作文件的工具,大大方便了进行大批量文件编译时的工作流程。这里简单的记录一个make 工具的基本使用规则。 1. Makefile 基本规则: target... : prerequisites ... command ... ... ------------------------------------------------------------------------------- target: 为目标文件,即所要生成的对象; prerequisites : 为要生成target所需要的文件或是目标; command: 即make需要执行的命令,(任意的shell命令,即对应编译器或者平台的命令)。 第一行表示依赖关系,第二行是规则。( 第二行必须由Tab键开头 )。 注意: a. 只敲入make命令默认执行第一个target。 b. command 要用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: api.c api.h gcc -c api.c 另外Makefile简化格式:

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

引用:http://zoufengfu168.blog.163.com/blog/static/5461055200991333616451/ 一、MAC帧头定义 [c] typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; //目的mac地址 char m_cSrcMacAddress[6]; //源mac地址 /* 如0x0800代表上一层是IP协议,0x0806为arp, 0x88a4为Ethercat */ short m_cType; //上一层协议类型, }__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER; Etherne II 长度为14 byte; typedef struct _MAC_FRAME_TAIL { unsigned int m_sCheckSum; //数据帧尾校验和 }__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL; [/c] 补充VLAN 和ARP: [c] // #define ETHTYPE_ARP 0x0806U #define ETHTYPE_IP 0x0800U #define ETHTYPE_VLAN 0x8100U #define ETHTYPE_PPPOEDISC 0x8863U /* PPP Over Ethernet Discovery Stage */ #define ETHTYPE_PPPOE 0x8864U /* PPP Over Ethernet Session Stage */ /** VLAN header inserted between ethernet header and payload * if ‘type’ in ethernet header is ETHTYPE_VLAN.

[转]各种工业以太网比较(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具有明显的优势

Libero 安装教程

在此记录下各种软件的安装教程,等到重装电脑时就会发现它的好处了。 这里 Libero 的版本是11.5。V11.3的版本有bug,不建议装。 去官网申请一个免费的Gold 1 year 的license. 可使用 Vol C: 查看Disk 序列号。 安装软件完毕后。 1. 放置license.dat文件到C:\flexlm\ 下。 2. 如果license 不是用你的disk序列号申请的,可用硬盘序列号修改器修改C盘序列号 。 3. 添加系统环境变量。 LM_LICENSE_FILE = c:\flexlm\license.dat; SNPSLMD_LICENSE_FILE = c:\flexlm\license.dat; 完成!

Eclipse ARM IDE 开发环境搭建

一、Eclipse Eclipse的本身只是一个框架平台,但是众多插件的支持,使得Eclipse拥有较好的灵活性。依托于Java 环境运行,所以必须安装 Jre。 二、CDT CDT是Eclipse用于扩展Eclipse支持C/C++开发的插件。可直接下载带CDT的Eclipse。 三、Zylin CDT 支持Eclipse用于嵌入式C/C++开发和远程调试的插件。 四、Yagarto Yagarto是整合了GNU arm的交叉编译工具链,是一个跨平台的 ARM 架构开发平台。他们说了,由于基于MinGW的ToolChain 的GDB 跟Eclipse 配合不是很好,所以Yagarto 出现了。目前Yagarto 项目已经完结。此外Yagrato 建议使用免费的 emIDE (free Visual Studio Style IDE including GNU Tools for ARM) 。其集成了GNU Tools。 五、J-LINK GDB Server A JTAG GDB Debug agent run on Host 六、IDE整体结构框图 安装: 1、安装Java SE 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jre-7u3-download-1501631.html 设置环境变量: 如果只安装Jre的话就添加 : JAVA_HOME = C:\Program Files\Java\jre1.8.0_65; 若是安装JDK的话就添加 : JAVA_HOME = C:\Program Files\Java\jdk1.8.0_65; Path = %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; //安装JDK时,JDK内部有个jre目录,外部也默认安装了一个jre目录。一般配置jre环境为内部jre目录。 CLASSPATH = .

Beremiz 简介

Beremiz 是一各为自动化技术提供开放性源代码的软件,它的PLC平台可以支持IEC61131-3 五种开发语言,Beremiz 提供的子项目: PLCOpen 编辑器 : 提供自动化技术所需要的多平台 IDE (Integrated Development Environment) ; MatPLC’s IEC 编译器 : IEC 61131-3 编译器, 可以将结构化文本和指令表120 直接编译为 C 语言; CanFestival : CANOpen 接口服务于物理的输入/ 输出; SVGUI : 以 SVG为基础的自动化 HMI 工具; 所有软件都是提供源代码的, 使用了 PYTHON MINGW 等语言或者平台。 Beremiz软PLC 开发流程: MatIEC包含两个工具: 1. IEC2IEC工具将标准的IEC61131-3的5种语言统一转成ST格式, 2. IEC2C工具将ST格式用户代码转ANSI-C代码。 然后将所有代码通过GCC 工具编译成机器码运行。