Category: Software Design

It describe the software design note.

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 »

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 »

linux 常用命令笔记

1. 修改文件夹所有者 chown -R [owner] ..          ; 修改当前目录下所有文件夹的所有都为owner, -R表示递归调用。 2. 解压命令 tar -zxvf xxx; -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。 -z:有gzip属性的 -j:有bz2属性的 -Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出 下面的参数-f是必须的 -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。 创建用户 useradd 修改密码 passwd 安装包 apt-get install apt-get update //更新源 iptables iptables -nv -L //列出 netstat ps aux 查看进程

Ethernet 的类型

通过学习以太网的类型,可以更好的了解以太网的工作原理。 共享式以太网 共享式以太网的典型代表是使用10Base2/10Base5的总线型网络和以集线器为核心的星型网络。在使用集线器的以太网中,集线器将很多以太网设备集中到一台中心设备上,这些设备都连接到集线器中的同一物理总线结构中。从本质上讲,以集线器为核心的以太网同原先的总线型以太网无根本区别。 集线器的工作原理: 集线器并不处理或检查其上的通信量,仅通过将一个端口接收的信号重复分发给其他端口来扩展物理介质。所有连接到集线器的设备共享同一介质,其结果是它们也共享同一冲突域、广播和带宽。因此集线器和它所连接的设备组成了一个单一的冲突域。如果一个节点发出一个广播信息,集线器会将这个广播传播给所有同它相连 的节点,因此它也是一个单一的广播域。 集线器的工作特点: 集线器多用于小规模的以太网,由于集线器一般使用外接电源(有源),对其接收的信号有放大处理。在某些场合,集线器也被称为“多端口中继器”。 集线器同中继器一样都是工作在物理层的网络设备。 共享式以太网存在的弊端:由于所有的节点都接在同一冲突域中,不管一个帧从哪里来或到哪里去,所有的节点都能接受到这个帧。随着节点的增加,大量的冲突将导致网络性能急剧下降。而且集线器同时只能传输一个数据帧,这意味着集线器所 有端口都要共享同一带宽。 交换式以太网 交换式结构: 在交换式以太网中,交换机根据收到的数据帧中的MAC地址决定数据帧应发向交换机的哪个端口。因为端口间的帧传输彼此屏蔽,因此节点就不担心自己发送的帧在通过交换机时是否会与其他节点发送的帧产生冲突。 为什么要用交换式网络替代共享式网络: ·减少冲突:交换机将冲突隔绝在每一个端口(每个端口都是一个冲突域),避免了冲突的扩散。 ·提升带宽:接入交换机的每个节点都可以使用全部的带宽,而不是各个节点共享带宽。

嵌入式系统分层(转自电子发烧友)

一、嵌入式系统的分层与专业的分类。 嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。 1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件 层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但 硬件平台是基础,增值还要靠软件。 硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。 2、 驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导 至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的 驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不 就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可 是最高的。 驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。 3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工 程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定 的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。 4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环 境有相应的变化而已。如果涉及Jave方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌 入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.323、Astrisk)方面又较为复杂, 并且有难度了。

关于ADS V1.2开发环境

从开始用freescale 的CodeWarrior起到这个ADS V1.2 ,一直认为这个开发环境做得不好。有几个问题。 1.当make完之后在xx.o文件报错有不明物体,双击这条error, 它没帮你定位到xx.c里。以至于你还得打开xx.c CTRL+F,找出这个不明物体。这很烦,有时候会觉得这个编译器很无语。 2.ADS V1.2的工程管理不能靠边?dock,至今没找到这个功能。。以至于窗口管理乱糟糟的。    

嵌入式开学-先认识硬件

这里使用的是TQ2440开发板,CPU 一般运行在400M的时钟频率。核心板载有两片Hynix(海力士,又叫现代内存)256Mb的SDRAM合64MB的内存,256MB SAMSUNG 的Nand flash,2MB 的Eon(宜扬) 的Nor flash。 首先,Nor flash 和 Nand flash 的区别? Nor flash的有自己的地址线和数据线,操作以字为单位,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。类似于计算机内BIOS的存放位置。 Nand flash是IO设备,类似于计算机的硬盘,数据、地址、控制线都是共用的,需要软件区控制读取时序,更无法挂在ARM的程序空间,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。一般Nand flash 用来存储系统程序,系统上电后由Nor flash中的BootLoader将系统加载进RAM中的可执行地址中运行,然后跳到主程序中运行。(这有点像冯.诺伊曼架构,程序和数据都在RAM中)。Nand flash在读取数据量较大的成块数据时,速度较快。