📄 基于arm7核处理器vxworks系统bsp设计 - 我爱研发网.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0050)http://www.52rd.com/S_TXT/print.asp?id=2812&flag=5 -->
<HTML><HEAD><TITLE>基于ARM7核处理器VxWorks系统BSP设计 - 我爱研发网</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="基于ARM7核处理器VxWorks系统BSP设计 - 我爱研发网.files/font.css" type=text/css
rel=stylesheet>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=0>
<TABLE cellSpacing=0 cellPadding=0 width=700 border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle>
<TABLE cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>页面地址:<A
href="http://www.52rd.com/S_Txt/2005_12/Txt2812.htm">http://www.52RD.com/S_Txt/2005_12/Txt2812.htm</A></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=10 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=fonttitle_content align=middle
height=40>基于ARM7核处理器VxWorks系统BSP设计</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top align=middle bgColor=#666666 height=1></TD></TR>
<TR>
<TD vAlign=top align=middle>
<TABLE cellSpacing=10 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=fontbig><STRONG>摘要:</STRONG><FONT
size=2>该文主要介绍了SAMSUNG公司的基于ARM7TDMI核S3C4510B微处理器,并详细介绍了利用该处理器所设计的嵌入式系统以及VxWorks操作系统下BSP(Board
Supported Package)的开发。</FONT>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: ’Times New Roman’; mso-hansi-font-family: ’Times New Roman’">
<B>关键词:</B></SPAN><FONT size=2>ARM7TDMI S3C4510B VxWorks
BSP</FONT></P>
<P style="TEXT-INDENT: 0px"><B>1 介绍</B></P>
<P style="TEXT-INDENT: 30px">S3C4510B是三星公司推出的针对嵌入式应用的16/32
位嵌入式处理器,该微控制器专为以太网通信系统的集线器和路由器而设计,具有低成本和高性能的特点,
S3C4510B中内置了ARM公司设计的16/32位ARM7TDMI处理器,
可以执行32位的ARM指令,也可执行16位的THUMB指令, 并集成了多种外围部件,主要有:</P>
<P style="TEXT-INDENT: 30px">● 时钟频率50MHz</P>
<P style="TEXT-INDENT: 30px">● 内核/IO电压3.3V</P>
<P style="TEXT-INDENT: 30px">● 8KB的Cache/SRAM</P>
<P style="TEXT-INDENT: 30px">● 一个10/100Mbps 以太网控制器,MII接口</P>
<P style="TEXT-INDENT: 30px">● 两个HDLC通道,每个通道可支持10Mbps</P>
<P style="TEXT-INDENT: 30px">● 两个UART通道</P>
<P style="TEXT-INDENT: 30px">● 两个DMA通道</P>
<P style="TEXT-INDENT: 30px">● 两个32位定时/计数器</P>
<P style="TEXT-INDENT: 30px">● 18个可编程I/O口</P>
<P style="TEXT-INDENT: 30px">● 中断控制器,支持21个中断源,包括4个外部中断</P>
<P style="TEXT-INDENT: 30px">● 支持SDRAM,EDO DRAM,SRAM,Flash等</P>
<P style="TEXT-INDENT: 30px">● 具有扩展外部总线</P>
<P style="TEXT-INDENT: 30px">● JTAG接口,支持软件开发 ,硬件调试</P>
<P
style="TEXT-INDENT: 30px">S3C4510B支持目前常用的嵌入式操作系统,如VxWorks、pSoS、ucLinux等,本文将主要介绍VxWorks操作系统下的软件开发。</P>
<P
style="TEXT-INDENT: 30px">ARM7TDMI是ARM家族通用的一款32位微处理器,它主要为用户提供了高性能、低价格解决方案。</P>
<P
style="TEXT-INDENT: 30px">ARM7TDMI具有三级流水线的32位RISC处理器,处理器结构为冯·诺依曼Load/Store。该CPU具有两种指令集,即ARM和Thumb指令集。ARM指令集是32位,它可以利用CPU最大性能;而Thumb指令集则是16位指令集。</P>
<P
style="TEXT-INDENT: 30px">ARM7TDMI内核方块图如图1所示。<BR>[img]http://www.52rd.com/upload/2005_12/images200512111272646530.gif[/img]<BR><BR><B>2
系统硬件图</B></P>
<P
style="TEXT-INDENT: 30px">该系统主要以S3C4510B为核心,外围集成了以太网卡、SDRAM、FLASH、UART以及HDLC等。图2是以S3C4510B为核心的最小系统设计图。<BR>[img]http://www.52rd.com/upload/2005_12/images200512111282093324.gif[/img]<BR><FONT
size=3> </FONT><SPAN
class=main1>SDRAM选用HY57V653220(8Mbyte)、两片FLASH分别为AM29F040(存放bootrom)和T28F160BT(作为文件系统用)。</P>
<P style="TEXT-INDENT: 0px"><B>3 VxWorks操作系统下BSP构建</B></P>
<P
style="TEXT-INDENT: 30px">在完成板上基本硬件的测试后,下面我就开始对vxWorks操作系统下BSP进行开发,开发前需要做一些准备工作,如准备开发工具等。</P>
<P style="TEXT-INDENT: 30px">① 开发工具用的是Tornado2.2 for ARM;</P>
<P style="TEXT-INDENT: 30px">② 参考资料有BSP Kit、S3C4510B DataSheet;</P>
<P style="TEXT-INDENT: 30px">③ 参考Tornado2.2 for ARM下自带的wrSBCArm7
BSP;</P>
<P style="TEXT-INDENT: 30px">④ 烧写程序采用编程器。</P>
<P
style="TEXT-INDENT: 30px">通常在开发BSP的时候,我们需要在Tornado原带BSP目录下找一个与我们所用的处理器相同或相近。与BSP相关的文件有:romInit.s、sysAlib.s、bootInit.c、bootConfig.c、sysLib.c、config.h、configNet.h、makefile以及与我们硬件相关的,如串口sysSerial.c等。由于篇幅所限,具体的文件作用在此就不说了。下面主要根据S3C4510B来阐述一下BSP开发步骤。</P>
<P style="TEXT-INDENT: 30px">(1)拷贝BSP</P>
<P style="TEXT-INDENT: 30px">将wrSBCArm7
BSP拷贝一份并命名为4510BSP,接下来的工作就是修改该目录下的文件,从而得到自己的BSP。</P>
<P style="TEXT-INDENT: 30px">(2)修改MakeFile文件</P>
<P style="TEXT-INDENT: 30px">修改4510BSP目录下的makefile文件,修改如下几行:</P>
<P style="TEXT-INDENT: 30px">TARGET_DIR = 4510BSP # changed by
caiyang</P>
<P style="TEXT-INDENT: 30px">VENDOR = CAI # changed by caiyang</P>
<P style="TEXT-INDENT: 30px">BOARD = MyArmBoard # changed by
caiyang</P>
<P style="TEXT-INDENT: 30px">ROM_TEXT_ADRS = 01000000 # ROM entry
address</P>
<P style="TEXT-INDENT: 30px">ROM_WARM_ADRS = 01000004 # ROM warm
entry address</P>
<P style="TEXT-INDENT: 30px">ROM_SIZE = 00080000 # number of bytes
of ROM space</P>
<P style="TEXT-INDENT: 30px">RAM_LOW_ADRS = 00006000 # RAM text/data
address (bootrom)</P>
<P style="TEXT-INDENT: 30px">RAM_HIGH_ADRS = 00486000 # RAM
text/data address (bootrom)</P>
<P style="TEXT-INDENT: 30px">MACH_EXTRA =</P>
<P style="TEXT-INDENT: 30px">注解:ROM_TEXT_ADRS:BOOT
ROM的入口地址。对大多数板来说,这就是ROM地址区的首地址,然而也有的硬件配置使用ROM起始的一部分地址区作为复位向量,因此需要根据此设置偏移量作为它的地址。这个偏移量因CPU结构而定。</P>
<P style="TEXT-INDENT: 30px">ROM_WARM_ADRS:BOOT
ROM热启动入口地址。它通常位于固定的ROM_TEXT_ADRS+4的地方。当需要热启动时,sysLib.c文件中sysToMonitor(
)函数代码明确的跳转到ROM_WARM_ADRS地址处开始执行。</P>
<P style="TEXT-INDENT: 30px">ROM_SIZE:ROM实际大小。</P>
<P style="TEXT-INDENT: 30px">RAM_LOW_ADRS:装载Vxworks的地址。</P>
<P style="TEXT-INDENT: 30px">RAM_HIGH_ADRS:将Boot Rom
Image拷贝到RAM的目的地址。</P>
<P style="TEXT-INDENT: 30px">注意:RAM_LOW_ADRS 和 RAM_HIGH_ADRS
都是绝对地址,通常位于DRAM起始地址的偏移量处,该偏移量取决于CPU结构,这需要参考VxWorks内存分布。对于ARM的内存分布请看图3,从图3可以看出RAM_LOW_ADRS在DRAM+0x1000处。这些地址对于S3C4510B来说都应该是重映射后的地址。</P>
<P style="TEXT-INDENT: 30px">(3)修改config.h文件</P>
<P
style="TEXT-INDENT: 30px">主要是修改ROM_BASE_ADRS、ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADRS、RAM_HIGH_ADRS和undef掉不需要的部分。注意这些应该和makefile文件中设置的一致。</P>
<P style="TEXT-INDENT: 30px">(4)修改romInit.s文件</P>
<P style="TEXT-INDENT: 30px">CPU一上电就开始执行romInit(
)函数,因此在romInit.s代码段中它必须是第一个函数。对于热启动,处理器将会执行romInit(
)加上4后的代码(具体参考sysLib.c中的sysToMonitor(
)函数)。更多的硬件初始化在sysLib.c中sysHwInit( )函数中,romInit(
)的工作就是做较少的初始化并把控制权交给romStart( )(在bootInit.c文件)。</P>
<P
style="TEXT-INDENT: 30px">在S3C4510B处理器中,romInit.s文件主要做了以下几个工作:</P>
<P style="TEXT-INDENT: 30px">① 禁止CPU中断并切换到SVC32模式;</P>
<P style="TEXT-INDENT: 30px">② 禁止中断控制器;</P>
<P style="TEXT-INDENT: 30px">③
初始化SYSCFG、EXTDBWTH、ROMCON0、ROMCON1、DRAMCON0等寄存器,同时初始化了FLASH、SDRAM、DM9008等外围设备;</P>
<P style="TEXT-INDENT: 30px">④ 将FLASH的内容拷贝到SDRAM中;</P>
<P style="TEXT-INDENT: 30px">⑤ 改变FLASH和SDRAM的基地址,将SDRAM基地址改为0;</P>
<P style="TEXT-INDENT: 30px">⑥ 初始化堆栈指针;</P>
<P style="TEXT-INDENT: 30px">⑦ 跳转到C程序romStart( )函数中。</P>
<P
style="TEXT-INDENT: 30px">在这里,只需要修改SYSCFG、EXTDBWTH、ROMCON0、ROMCON1、DRAMCON0等寄存器来设置FLASH、SDRAM、DM9008的基地址和大小即可。这需要根据板上的配置来修改,修改的内容在wrSbcArm7.h文件中。</P>
<P
style="TEXT-INDENT: 30px">BSP基本部分就已经修改完成,至于bootInit.c和bootConfig.c文件,我们一般不需要修改它,只是在调试过程中为了方便调试,可以将他们拷贝到BSP目录下,然后修改makefile文件,在makefile文件中添加如下两句。</P>
<P style="TEXT-INDENT: 30px">BOOTCONFIG = bootConfig.c</P>
<P style="TEXT-INDENT: 30px">BOOTINIT = bootInit.c</P>
<P style="TEXT-INDENT: 30px">(5)利用tsfs(target server file
system)下载</P>
<P style="TEXT-INDENT: 30px">要利用tsfs下载VxWorks,首先需要配置以下内容:</P>
<P style="TEXT-INDENT: 30px">① 在config.h文件中添加如下内容</P>
<P style="TEXT-INDENT: 30px">/* Serial port configuration */</P>
<P style="TEXT-INDENT: 30px">#define INCLUDE_SERIAL</P>
<P style="TEXT-INDENT: 30px">#undef NUM_TTY</P>
<P style="TEXT-INDENT: 30px">#define NUM_TTY N_SIO_CHANNELS</P>
<P style="TEXT-INDENT: 30px">#undef CONSOLE_TTY</P>
<P style="TEXT-INDENT: 30px">#define CONSOLE_TTY 0</P>
<P style="TEXT-INDENT: 30px">#undef CONSOLE_BAUD_RATE</P>
<P style="TEXT-INDENT: 30px">#define CONSOLE_BAUD_RATE 38400</P>
<P style="TEXT-INDENT: 30px">/*** WDB ***/</P>
<P style="TEXT-INDENT: 30px">#ifdef SERIAL_DEBUG</P>
<P style="TEXT-INDENT: 30px">#define WDB_NO_BAUD_AUTO_CONFIG</P>
<P style="TEXT-INDENT: 30px">#undef WDB_COMM_TYPE</P>
<P style="TEXT-INDENT: 30px">#undef WDB_TTY_BAUD</P>
<P style="TEXT-INDENT: 30px">#undef WDB_TTY_CHANNEL</P>
<P style="TEXT-INDENT: 30px">#undef WDB_TTY_DEV_NAME</P>
<P style="TEXT-INDENT: 30px">#define WDB_COMM_TYPE WDB_COMM_SERIAL
/* WDB in Serial mode */</P>
<P style="TEXT-INDENT: 30px">#define WDB_TTY_BAUD 38400 /* Baud rate
for WDB Connection */</P>
<P style="TEXT-INDENT: 30px">#define WDB_TTY_CHANNEL 1 /* COM PORT
#2 */</P>
<P style="TEXT-INDENT: 30px">#define WDB_TTY_DEV_NAME "/tyCo/1" /*
default TYCODRV_5_2 device name */</P>
<P style="TEXT-INDENT: 30px">#endif /* SERIAL_DEBUG */</P>
<P style="TEXT-INDENT: 30px">/* tsfs added by caiyang */</P>
<P style="TEXT-INDENT: 30px">#define INCLUDE_TSFS_BOOT</P>
<P style="TEXT-INDENT: 30px">并修改引导行为</P>
<P style="TEXT-INDENT: 30px">#define DEFAULT_BOOT_LINE \par
"tsfs(0,0)host:vxWorks f=8 h=169.254.72.67 e=169.254.72.68 u=caiyang
pw=caiyang"</P>
<P
style="TEXT-INDENT: 30px">注:串口1用来显示引导信息,相当于PC机中的显示器,串口2用来下载VxWorks和调试。同时串口2波特率不能太高,经测试115200好像不行。</P>
<P style="TEXT-INDENT: 30px">② 配置target server</P>
<P style="TEXT-INDENT: 30px">启动Tornado开发环境,选择Tool->target
server菜单。在下拉菜单中选“target server file system”并选中Enable File
System,然后目录指向Vxworks所在的地方。同时注意要把Tornado
Registry打开,这样配置完后点击Launch按钮即可连接成功,此后就可以通过串口2下载VxWorks和调试。<BR><BR>[img]http://www.52rd.com/upload/2005_12/images200512111284769844.gif[/img]</P>
<P
style="TEXT-INDENT: 30px">一般情况下,我们首先调试好BSP,然后在调试网卡。所以在调试网卡前,我们需要用串口来下载VxWorks映像。</P>
<P style="TEXT-INDENT: 30px">至此,我们的BSP就开发完成。</P>
<P style="TEXT-INDENT: 0px"><B>4 结论</B></P>
<P
style="TEXT-INDENT: 30px">在没有调试BSP的硬件工具如仿真器的时候,我们只能通过点灯或者串口输出来定位程序执行的正确性。这大大增加了调试难度和进程。对于BSP开发,一般需要从一个模板来修改。BSP开发的正确性直接影响到VxWorks系统运行的稳定性。</P></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -