ARM硬件平台上基于UCOS移植Lwip网络协议栈

目录

1硬件平台 1

1.1硬件平台简介 1
1.2 硬件设计及电路原理图 2

2. Keil 开发工具及Keil工程简介 6

2.1 Keil开发工具 6
2.2 Keil工程简介 6
2.3 链接文件、启动文件分析 6

3. UCOS移植 11

3.1 ucos简介 11
3.2 ucos移植总述 11
3.3 和移植UCOS有关的ARM芯片知识 11
3.4 系统堆栈和UCOS的任务堆栈 14
3.5 系统时钟 14
3.6 任务级任务切换 14
3.7 中断级任务切换 16

4.Lwip移植 18

4.1 lwip简介 18
4.2 lwip移植总述 18
4.3移植lwip操作系统模拟层 19
4.4 根据lwip提供的软件架构编写相应的网卡芯片驱动 27
4.5 移植完成后测试TCP/IP协议栈 35
4.6 设计并实现简单的WEB服务器 37


1.硬件平台

1.1硬件平台简介

     为保证网络协议栈的顺利移植,选用了LPC2220作为主控芯片,RTL8019AS作为网卡芯片,使用HR901170A进行电平转换、滤波。

      LPC2220是Philips公司推出的微处理器,片上有64K的RAM空间,通过总线很容易再扩展ROM和RAM。芯片还拥有丰富的IO接口以及多种中断源,还集成了多种定时器、PWM等,另外,该芯片内部集成了很多串行通讯协议,如SPIUART等。

      RTL8019AS是由台湾Realtek公司生产的以太网控制器。他符合EthernetII与IEEE802.3标准,100脚的PQFP封装,采用全双工收发并可同时达到10Mb/s的速率,内置16kB的SRAM,支持8/16位数据总线,8个中断申请线以及16个I/O基地址选择。

     HR901170A是汉仁电子有限公司生产的RJ45接口连接器(带网络变压器/滤波器),该连接器满足IEEES02.3和IEEE902.3ab标准,能够较好地抑制电磁干扰。通过HR901170A系统就可以连接到以太网上。

基于LPC2220和RTL8019AS的上述特点,我们使用此款芯片可以设计出满足移植Lwip网络协议栈所需要的硬件运行环境。

1.2 硬件设计及电路原理图


图1.2-1硬件电路连接图1


图1.2-2硬件电路连接图2

       RTL8019AS芯片工作方式分为3种:①跳线方式,网卡的i/o和中断由跳线决定。②即插即用方式,由软件进行自动配置plug and play。③免跳线方式,网卡的i/o和中断由外接的93c46里的内容决定。在嵌入式应用场合,为了节约成本,一般不使用93c46的,可以降低成本,同时又减少连线。我们选择使用跳线模式,使用此模式的硬件设置方式为第65引脚(JP)接高电平,如图1.2-2硬件电路连接图2所示。

       硬件复位引脚33(RSTDRV),此引脚为网卡芯片硬件复位引脚,RSTDRV为高电平有效,至少需要800ns的宽度。由硬件电路图可知,此引脚连接到LPC2220的P0.8上。

      中断引脚(INT7-0)为97-100,1-4 共有8个中断引脚,但使用时只是用一个中断引脚,选择哪个引脚作为中断信号是根据[80-78][IRQS2-0]来决定的,根据电路图可IRQS2-0这三个引脚悬空,RTL8019AS内部有下拉电阻,故IRQS2-0这三个引脚电平都为0,根据手册可知,选择的是INT0作为中断源引脚,此引脚连接到LPC2220的P0.9引脚。

 

      64脚(AUI),该引脚决定使用aui还是bnc接口。我们用的网卡的接口一般是bnc的,很少用aui。bnc接口方式支持8线双绞或同轴电缆。高电平时使用aui接口,悬空为低电平,使用bnc接口。我们将该引脚悬空即可。

 

      网络接口类型由74,77(PL0,PL1)引脚决定,我们使用第一种自动检测就可以了。会自动检测接口类型然后进行工作。自动检测是用同轴还是双绞线。这两个引脚内部存在下拉电阻,悬空即可。

     芯片的brom地址由以下引脚72,71,69,68,67(BS4..BS0)决定,在嵌入式领域一般都不用该brom。brom是bootrom的缩写。在电脑里用来做无盘工作站时候用到,可以从网卡进行引导,而不是从a盘,c盘等引导系统。故悬空即可。

RTL8019AS支持3支可编程LED灯,电路连接见原理图。

RTL8019AS与主控芯片间通讯的输入/输出地址共有32个,地址偏移量为00H-1FH。

RTL8019AS的IO基地址在跳线模式下由[85-84,82-81] [IOS3-0]这四个引脚状态决定,电路图中这四个引脚悬空,故这四个引脚状态都为0,根据数据手册可知RTL8019AS的IO基地址为300H,将300H化成二进制数值00110000 0000,很明显地址中第8、9为地址为1,第6、7位和10-19位全部为0。我们仅需要控制第0-4位地址,就可以产生00H-1FH这32个偏移量。电路原理图中SA8、SA9接+5v,SA10-SA19接的是地。

电路图中SA0-SA4分别接的是LPC2220的A1-A5引脚,而SA5接的是NET_nCS引脚。


图1.2-2硬件电路连接图3

NET_nCS的信号是根据nCS3(BANK3的片选信号)和A22地址线信号产生的。

数据总线SD0-SD15连接到LPC2220的D0-D15,组成16bit总线。

产生00H-1FH的偏移量需要NET_nCS信号为低。我们总结一下,我们的RTL8019AS需要的地址是300H-301FH,硬件连线决定了这个地址偏移量。我们将RTL8019AS接到LPC2220的BANK3上。对LPC2220来说,只产生00H-1FH的偏移量就可以。LPC2220的BANK3起始地址是0X83000000,也就是说当访问这个地址时才会产生nCS3为低的信号,如果BANK3只需要连接网卡的话,我们就可以直接利用nCS3信号作为选通网卡芯片的信号即可,但我们硬件设计时将BANK3又分成了几个独立的访问空间用于挂接不同的总线器件。我们利用地址线A21、A22、A23将BANK3分为0X834000000、0x83100000、0x83800000这几个独立空间。我们只分析利用A22地址线信号和nCS3

产生的NET_nCS信号,此信号线硬件上连接到RTL8019AS的SA5上,A22地址线上信号为高电平并且nCS3产生低电平信号,这种情况下NET_nCS才是低电平,而只有NET_nCS为低电平时,才能产生RTL8019AS需要的300H-301FH地址偏移量。现在通过LPC2220访问地址空间0x83400000,这个时候根据上面分析NET_nCS为低电平,也即RTL8019AS的SA5为低电平,第四位地址线SA0-SA4连接的是LPC2220的A1-A5,

访问0x83400000、0x83400001对应的RTL8019AS地址即为300H,同理0x83400010、0x83400011对应的RTL8019AS地址即为301H。我们访问LPC2220的0x83400000-0x8340003F即访问了RTL8019AS的32个偏移量。

2. Keil 开发工具及Keil工程简介

2.1Keil开发工具

Keil MDK提供了针对ARM系列芯片的汇编器、C/C++的编译器和一个能进行工程管理的IDE。同时,该软件还支持JLink在线调试,是进行嵌入式软件开发非常优秀的软件。

2.2 Keil工程简介

Keil MDK可以建立针对具体芯片的工程,根据选定的ARM芯片自动生成启动代码,负责硬件的基本初始化和C语言运行环境以及C语言库的初始化。提供工程文件管理,整体编译、链接、调试。Keil MDK工程还可以编制链接文件,链接器会根据编制的链接文件进行链接二进制文件,用来满足嵌入式开发的不同硬件平台需求。

2.3 链接文件、启动文件分析

ARM芯片运行模式和堆栈相关知识都对理解UCOS的任务切换都有很大的帮助,因此我们首先应该理解芯片运行模式和堆栈的概念。理解这些概念最好的方式是分析一下系统启动代码。
在分析启动代码之前,先理解一下Keil MDK 工程中Scf链接文件的相关知识。我们知道源代码程序经过编译、链接后生成一个二进制文件,这个二进制文件是用来控制ARM芯片的。
这个二进制文件是直接下载到ARM处理器芯片的,这个二进制文件的格式如图2.4-1  ARM Image映像文件结构。



图2.4-1  ARM Image映像文件结构


ZI段表示初始化为0的变量区域,RW段表示已经初始化的变量区域,RO段表示代码区域。

因ZI段只是初始化为0的变量区域,所以在Image文件中并不占空间,映像文件中只是包含实际地址和大小。我们一般将image映像文件下载到ROM中,系统启动时从ROM中读取第一条需要执行的指令,但RW段下载到了ROM中,ROM是不可写的。因此出现了装载地址和运行地址不一致的情况。我们要保证程序正常运行就必须保证变量在访问之前放到了正确的地址。一个简单的装载地址到运行地址的转换见图2.4-2  简单的分散装载内存映像图。


图2.4-2  简单的分散装载内存映像图


在KeilMDK工程中使用分散装载文件scf文件来设置映像文件的转载地址和运行地址,当我们设置的转载地址和运行地址不一致时,KeilMDK会自动产生搬运代码,在使用RW、ZI段之前将代码搬运到正确的地址。

我们工程使用的分散加载文件内容:

ROM_LOAD 0x80000000

{

    ROM_EXEC 0x80000000

    {

        Startup.o (vectors, +First)

        * (+RO)

    }

 

    IRAM 0x40000000

    {

        Startup.o (MyStacks)

    }

 

    STACKS_BOTTOM +0 UNINIT

    {

        Startup.o (StackBottom)

    }

 

    STACKS 0x40004000 UNINIT

    {

        Startup.o (Stacks)

    }

 

    ERAM 0x81000000

    {

        * (+RW,+ZI)

    }

 

    HEAP +0 UNINIT

    {

        Startup.o (Heap)

    }

 

    HEAP_BOTTOM 0x81080000 UNINIT

    {

        Startup.o (HeapTop)

    }

}

此分散加载文件只有一个装载域ROM_LOAD,装载地址是0x80000000,这个地址是ARM芯片外的一个NorFlash芯片的起始地址。存在ROM_EXEC、IRAM、STACKS_BOTTOM、STACKS、ERAM、HEAP、HEAP_BOTTOM共8个运行域,每个运行域都有自己的运行地址。其中ROM_EXEC运行域和装载域地址一样,此运行域包含系统的启动代码和所有RO段代码。剩余其他运行域的地址和装载域都不同,都需要根据分散加载文件进行代码搬运工作,这个工作是由KeilMDK工具自动完成。

系统启动代码主要完成的工作如下:

1.       中断向量表

2.       初始化总线频率和存储器系统

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值