3816|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

瑞萨M16C下的基于uC/OS-II平台的多线程TCP/IP设计 [复制链接]

元旦放假了。终于可以放松几天,好好玩一下了。
这个帖子先前就做了申明,只不过最近一直没时间写,现在终于有空闲了。

前言:
TCP/IP这个协议我想大家已经很熟悉了。比较有名的有BSD版本的标准协议,windows和linux下的都是基于BSD模型的,也就是分层结构设计。
嵌入式领域比较出名的有uIP和lwIP等。这些协议都是经过了大量删减,有些协议只保留了最基本的功能,像IP层,基本就没有实现IP分片的功能。另外,微型协议栈一般都不会使用分层结构,原因是分层结构会引起context switch(也就是上下文切换),会严重增加CPU的负担。因此,微型协议只是把整个协议栈封装到一个进程里,这样会让协议栈的效率更高。

最新回复

关注中。。。。  详情 回复 发表于 2010-1-5 16:21
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
呵呵,肚子饿了,去吃饭了。
下午回来继续
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在我的协议里,是基于分层处理的。原因是分层结构更加明朗,用户在写用户程序的时候,可以直接调用相关的API函数即可。这样用户进程就融入到协议栈里去了。

我们来看看TCP/IP基本的链路层。


                                         以太网封装格式

----------------------------------------------------------------------------------------------
| 目的地址  |  源地址 |  帧类型    |                          应用数据                          |  CRC |
----------------------------------------------------------------------------------------------
    6           6          2                            46~1500                             4

链路层对应着物理层,这时我们可以设计一个基本的数据结构:以太网帧。

/* 以太网帧头部 */
typedef struct{
     U8   destination[MAC_LENGTH];      //目的MAC地址
     U8   source[MAC_LENGTH];           //源MAC地址
     U16  pro_type;                     //链路层协议类型(占用2个字节,见Arp.h)
} ETHER_HEAD;

/* 以太网帧 */
typedef struct{
      ETHER_HEAD  e;                    
      U8          edata[ETHER_MTU];     // 数据包
      U32         crc;                  // CRC校验            
} ETHER_FRAME;

这两个结构分别表示整个以太网帧和以太网帧的头部。
其中ETHER_FRAME这个数据结构直接对应着网卡驱动程序的一个缓冲节点。缓冲区是一个环形的双向链表,每个节点的长度就是一个以太网帧。这在以后讲驱动时在说。。

这时我们可以设计一个链路层的函数,用来封装一个以太网帧。

U16 make_ethernet(ETHER_FRAME __FAR *efp, U8 *srce, U8 *dest, U16 pcol, U16 dlen)
{
  U16 len;

  efp->e.pro_type = CHGW(pcol);      //链路层协议类型,IP或者ARP
  memcpy(efp->e.destination, dest, MAC_LENGTH);  //目的地址
  memcpy(efp->e.source, srce, MAC_LENGTH);      //源地址
  len = dlen + sizeof(ETHER_HEAD);               //数据部分加上以太网的头部
  
  return len;
}

该函数的作用是在以太网帧里面填入源,目的IP和MAC地址,最后填入数据部分,打包成一个以太网帧,放在缓冲区efp里面。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
忘了说与CPU有关的移植代码了。。呵呵

下面是与CPU有关的宏定义,主要是方便把协议栈移植到不同的平台上


#define TCPIP_VERSION     130                          // Version of TCP/IP (Divided by 100)   

#ifdef CPU_TYPE_DEF
#error "CPU is Renesas M16C/6N4"
#endif


/* 与CPU有关的宏 */
#define _CPU_IS_R8C_M16C_M32R_                         // CPU type
#define _CPU_IS_LITTLE_ENDIAN_                         // CPU is Little Endian


#ifdef _CPU_IS_R8C_M16C_M32R_
#define __FAR  _far                                    // _far pointer
#define __NEAR _near                                   // _near  pointer                  
#else
#define __FAR
#define __NEAR
#endif


/*
*
* 分用TCP/IP协议栈,将数据存储到本机上时,
* 一律转换为Little Endian格式来存储。
* 封装到TCP/IP协议栈时,再转换成Big Endian格式
*
*/

/*
* TCP/IP   Big-Endian   
* M16C     Little-Endian
*/
#ifdef _CPU_IS_LITTLE_ENDIAN_                                         
#define CHGW(x)  ((((x) & 0xff) << 8)       |   \
                 ((x) >> 8))                           // word
#define CHGL(x)  (((x) << 24)               |   \
                 ((x) >> 24)                |   \
                 (((x) & 0x00ff0000) >> 8)  |   \
                                 (((x) & 0x0000ff00) << 8))            // long word
#else
#define CHGW(x)  (x)                                   // word
#define CHGL(x)  (x)                                   // long word
#endif



#define max(a,b) ((a)>(b) ? (a):(b))
#define min(a,b) ((a)<(b) ? (a):(b))


#define HIGH(x)  ((x & 0xff00) >> 8)
#define LOW(x)   (x & 0xff)



// data type def
typedef _Bool          BOOL;

typedef unsigned char  U8;
typedef unsigned int   U16;
typedef unsigned long  U32;

typedef signed char    S8;
typedef signed int     S16;
typedef signed long    S32;

typedef float          F32;
typedef double         F64;



说明:
M16C支持两个关键词_far和_near,分别表示远指针和进指针。主要用于外部空间和内部空间的寻址。如果你的目标CPU不支持这2个关键词,就可以在这里修改宏定义#ifdef _CPU_IS_R8C_M16C_M32R_

另外,M16C是little endian格式的,而TCP/IP是big endian格式的,所以我在这里定义了两个宏CHGL,CHGH,分别转换long和short型数据。在移植的时候要注意你的CPU是什么格式的。

其他的宏定义就是常见的数据结构的。注意,M16C是16位的CPU,一个int型占2个字节。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
顶你一下,原来是瑞萨单片机论坛的.
 
 
 

回复

293

帖子

0

TA的资源

纯净的硅(高级)

6
 
关注中。。。。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
关注中。。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表