ARM硬件平台上基于UCOS移植Lwip网络协议栈
8019AS接到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. 初始化总线频率和存储器系统
3. 初始化堆栈
4. 呼叫主应用程序
中断向量表是当外部中或系统异常发生时中断服务程序的入口地址或存放中断服务程序的首地址。此工程中将中断向量表定位在0x80000000这个地址开始的地方。
AREA
ARM硬件平台UCOS移植网络协议 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)