[计算机硬件及网络]44B0x的BSP是如何调成的.doc
《[计算机硬件及网络]44B0x的BSP是如何调成的.doc》由会员分享,可在线阅读,更多相关《[计算机硬件及网络]44B0x的BSP是如何调成的.doc(45页珍藏版)》请在三一办公上搜索。
1、打造你的44b0 BSP-概述1.vxWorks bsp概述-vxWorks板级支持包(BSP)是为vxWorks操作系统与硬件平台之间提供一个接口的软件包,它可以使vxWorks运行于特定的硬件平台,包含了一系列的硬件相关的函数:1)目标板硬件初始化 内存控制器初始化 堆栈初始化 外围设备初始化(IO、interrupt)2)异常向量处理3)CACHE操作4)硬件设备的底层驱动 定时器驱动 串口驱动 END驱动 FLASH驱动 LCD驱动本文档说明了vxWorks BSP for S3C44B0开发板(简称bsp)的开发过程。VxWorks的BSP应和WRS(WindRiver System
2、)的产品兼容,因而最好有一个可参考的模板,在此基础上修改BSP相关的文件。我参考的模板为WINDRIVER FOR 4510 BSP wrSbcArm7,这些修改主要有:系统必需1) CPU寄存器定义2) 板级配置定义3) 系统配置文件4) 启动代码5) 中断处理模块6) 定时器驱动模块7) 串口驱动模块可选模块8) END驱动模块9) TFFS驱动模块10) LCD驱动模块1.2 创建BSP步骤-1) 拷贝模板bsp至TARGETCONFIGS3C44B0目录下2) 为清晰起见CPU相关的文件应改名,并修改相关文件3) 编译调试1.3 BOOTROM启动流程-1) 上电RESET系统上电,C
3、PU从0x0地址开始执行2) romInit(romInit.s)RomInit在文件在文件romInit.s中。它是系统运行的入口,所以对于系统能否运行至关重要。它实现初始化CPU、判断启动类型、配置内存和外围设备的读写时序、设置堆栈指针等。在BSP中无法进行调试吗?很多大虾推荐通过闪灯来判断代码执行正确与否。对于44b0,由于GPIO众多,配置也较为复杂,且点灯只能大致知道故障位置而不能知道RAM和CPU寄存器的具体值,导致调试的难度很大,后面我会介绍一种调试方法,只要你有JTAG下载线就能使用ADW调试,且不需烧写FLASH。RomInit在函数结尾跳入RomStart。3) romSt
4、art(bootInit.c)RomStart在BootInit.c文件中。它是系统运行的第一个C函数。这一部分是vxWorks提供的标准程序一般不需改动。该函数是C的入口函数,由romInit调用,主要完成清内存,将ROM中的程序拷贝到RAM,解压并跳至解压后的程序处运行。4) usrInit(bootConfig.c)UsrInit在BootConfig.c文件中。它主要是实现硬件的初始化、CACHE初始化、异常向量初始化、内核初始化等。此部分代码都是在关闭中断状态下,多任务系统还没启动时执行的,故而只能进行初始化工作,不能调用延时、等待或和中断相关的函数,如串口打印只能用poolmode
5、。之后多任务系统启动,并运行第一个任务usrRoot。5) usrRoot(bootConfig.c)UsrRoot在BootConfig.c文件中。它主要是实现vxworks文件的下载,并且跳转到下载的vxworks image的入口地址,从而启动操作系统。它初始化TTY串口设备,根据BOOT_LINE加载相应的模块,创建交互SHELL,启动image下载。独门秘笈BSP调试-进行过BSP开发的兄弟,一定有过痛苦的经历,那就是明明是一小段代码,却怎么也得不到正确的结果,点灯也只能知道死在哪里,你要问到底出了什么事,对不起你问我我问谁?而且BSP调试只能不停的修改代码编译烧写运行调试再修改再烧
6、写这问题也折磨了我好久,最后我找到了一个独门秘笈,才得以顺利的搞定bsp。看到坛子上,以及给我发email的很多迷茫兄弟的痛苦状,不敢私藏1) 修改BSP config.h和Makefile的ROM_BASE_ADRS为RAM_HIGH_ADRS2) 编译BOOTROM为bootrom_uncmp3) 打开ADW,加载image,就可以进行仿真或在线调试了这样做的原理是bootrom_uncmp是被拷贝到RAM的RAM_HIGH_ADRS处,如果我们编译时直接定位于RAM_HIGH_ADRS,则image的地址就和拷贝的地址一致。而romInit是PIC的(位置无关的),它可以在任何地址运行,
7、所以这就和从ROM启动情况一样,自然可以运行啦!eking 20040416欲知后事,且听下回分解44B0x的BSP是如何调成的(1)工欲善其事, 必先利其器一.制作44B0x的VxWorks的BSP需要以下硬件和软件的准备1. 44B0x的开发板, 可选择的很多, 这里就不用说了.2. Tornado IDE 2.0/2.2, 我用的是2.2, 注意的是2.2只能安装在windows 2K/XP下, 生成的文件是elf格式, 2.0可以在98下安装, 生成的文件是coff格式, 2.0如果补充几个文件, 也可以下载2.2生成的elf格式vxworks3. ICE或者wiggler, 我用的是
8、wiggler, 鱼的wiggler就不错,51eda的板子随板带一个jtag小板,简单jtag, 支持sdt251,也可以用4. Source Insight, 编写代码5. Ultraedit, 查看二进制文件, 运行bat文件6. Beyond Compare, 版本文件比较(修改了文件代码, 突然发现不能工作的时候, 就需要它了)7. SDT251, 实际上只需要ADW8. 2K/xp下的jtag.exe, 可以到51eda下载9. 烧写软件 FlashPGM或者fluted, FlashP(推荐使用, 不用换线), 使用FlashPGM+wiggler烧写速度快, 但每次都要换jta
9、g的连接线, 太麻烦; 不如用flashP, 速度还可以, 烧一个bootrom_uncmp.bin几秒左右10. 交叉串口线2条, 就是55, 23, 32的那种11. 参考BSP, 用wrSBCArm712. manual, 44B0x的manual, demo代码(samsung网站下载), vxworks programmer manual, bspkit, tornado reference13. 其他, (有很多内容可以参考借鉴), (信息查找) 碰到我困惑的问题, 基本上就是这2个工具. 特别是google.目标:实现bootrom和tsfs加载vxworks映像, 使用com2
10、二.千里之行, 始于足下在targetconfig目录下, 建一文件夹, 名字随你便, 我的是44xBsp, 把wrSbcArm7目录下文件全拷贝过来, 再把all文件夹也拷贝过来, 删除或者注释掉makefile中的MACH_EXTRA = sngks32cEnd.oEXTRA_DEFINE修改为EXTRA_DEFINE = -O0 -Wall -Wcomment -DCPU_7TDMI -DARMMMU=ARMMMU_NONE -DARMCACHE=ARMCACHE_NONE文件名可以先不用改sysled.c 和syslcd.c基本上不需要下面就是具体的修改工作了, 定义好所以的44B0x
11、的寄存器宏, 注意看手册, 按照手册的要求做, 除了串口, rtc的某些寄存器外需要是char类型访问的, 其他都是32位访问的性子急的, 可能1天不到就改好了, 然后兴冲冲烧到flash, 打开超级终端, 设置好串口, 然后复位板子, 怎么样?啥也没有(跟我一样), 如果一下子什么都出来, 看到WDB: Ready.了, 那真的是水平又高又幸运了我用了差不多一个星期(不是每天都做)把这些文件基本上改好, 编译通过支持tsfs加载需要修改config.h#ifndef INCLUDE_TSFS_BOOT#define INCLUDE_TSFS_BOOT#endif /* TSFS */#und
12、ef NUM_TTY#define NUM_TTY N_SIO_CHANNELS /* 2 serial ports */#undef CONSOLE_TTY#define CONSOLE_TTY 0#undef CONSOLE_BAUD_RATE#define CONSOLE_BAUD_RATE 38400/* TSFS */#ifdef INCLUDE_TSFS_BOOT#undef CONSOLE_TTY#define CONSOLE_TTY 0#undef WDB_TTY_CHANNEL#define WDB_TTY_CHANNEL 1#undef WDB_COMM_TYPE#defi
13、ne WDB_COMM_TYPE WDB_COMM_SERIAL#undef WDB_TTY_BAUD#define WDB_TTY_BAUD 38400 /* 115200 */#define WDB_TTY_DEV_NAME /tyCo/1#endif#define FORCE_DEFAULT_BOOT_LINE#define DEFAULT_BOOT_LINE tsfs(0,0)host:vxWorksundef一切涉及到flash, lcd, led, end, network的宏#define ROM_BASE_ADRS 0x00000000 /* base of Flash/EPR
14、OM 16 MB */#define ROM_TEXT_ADRS 0x00000000 /* code start addr in ROM */#define ROM_SIZE 0x00100000 /* size of ROM holding VxWorks 512K */#define ROM_COPY_SIZE ROM_SIZE#define ROM_SIZE_TOTAL 0x00200000 /* total size of ROM 2MB */#define RAM_LOW_ADRS 0x0C001000 /* VxWorks image entry point */#define
15、RAM_HIGH_ADRS 0x0C500000 /* RAM address for ROM boot */注意要和makefile一致忘了一句, makefile要增加一句CONFIG_ALL的宏,位置是#MACH_EXTRA = sngks32cEnd.oMACH_EXTRA = #CONFIG_ALL = C:Tornado2.2targetconfig44xBspallCONFIG_ALL = all44B0x的BSP是如何调成的(2)三.不入虎穴,焉得虎子大家都知道44b0x是不能remap的, 就是它的flash空间是固定死的(除非硬件上做设计修改,论坛上有很多贴讨论这个问题),
16、 而vxworks是把异常向量都要放置到地址0处, 也就是flash地址开始的地方, 参考下图vxworks的memory映像(或者参考file:/C:/Tornado2.2/docs/vxworks/arm/arm.html#98246)VxWorks System Memory Layout (ARM) 此主题相关图片如下:通常情况下, LOCAL_MEM_LOCAL_ADRS在bsp中定义为0, 异常向量放置在这里可以减少异常处理的延迟时间(sdram或者sram的读取要比rom快), 还有其他好处, 动态和灵活等ARM的体系结构规定在异常发生时, 要从0地址开始处取相应的处理指令, 因
17、此要对romInit.s文件的开始处进行修改(因为如果没有remap, romInit.s是位于地址0处的)因此romInit.s开始几句变成了这样_ARM_function(romInit)_romInit: B cold B _romUndef B _romSwi B _romPrefetch B _romDataAbort B _romReserved /* _romReserved */ B _romIRQ B _romFIQ /* _romFIQ */cold: MOV r0, #BOOT_COLD /* fall through to warm boot entry */warm:
18、 B start我看有人用bootloader加载vxworks, 如果44b0x是可以remap的, 应该还没有问题, vxworks可以自己把异常向量放置到地址0处; 但因为44b0x不能remap, 在bootloader的地址0处开始要放异常向量, 怎么和vxworks的处理函数我还没考虑过. 毕竟, vxworks和bootrom的关系还是比较紧密的, 而且vxworks可以是loadable和resident的.因为不知道vxworks是具体如何放置入口函数的, 因此只能提供调试的方法来把它找出来.使用ultraedit的Advanced-Dos Command-, 输入44xbs
19、p.bat, working directory设置为bsp文件所在的目录, 见下图此主题相关图片如下:生成bootrom_uncmp.bin文件44xbsp.bat的文件内容为rem Command line build environmentsset WIND_HOST_TYPE=x86-win32set WIND_BASE=C:Tornado2.2set PATH=%WIND_BASE%host%WIND_HOST_TYPE%bin;%PATH%rem Diab Toolchain additionsset DIABLIB=%WIND_BASE%hostdiabset PATH=%DIA
20、BLIB%WIN32bin;%PATH%上面的内容可以从torvars.bat中copymake cleanmake bootrom_uncmp.bin把这个bootrom_uncmp.bin烧到flash中, 不管三七二十一, 先复位板子再说, 正常情况下, 超级终端啥也没有, 死水一潭(实际上都没有必要去看超级终端输出, 还差着多呢)修改config.h和makefile, 把RAM_HIGH_ADRS的定义改一下, 如#define RAM_HIGH_ADRS 0x0C100000因为我要用ADW进行ram调试, 而已经烧到flash的bootrom_uncmp在boot的时候有一个co
21、py的过程, 如果还是这个地址不变的话, 会把正在调试的区域给覆盖掉, 所以要避开, 这样用ADW就可以dowload boot_uncmp(注意不是bin文件,是elf格式的那个)进行调试了下面的工作就是用ADW一步一步地跟踪调试了, 这个过程需要耐心和细致. 在执行完romStart的copylongs后(这个函数可以step, 不用step in了), 进入usrInit函数(在bootconfig.c文件中, 不是usrconfig.c中的那个), 进入usrInit后会清bss段, 设置启动类型, 然后进入excVecInit (), 在其前面的intVecBaseSet (FUNC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件及网络 计算机硬件 网络 44 B0x BSP 如何

链接地址:https://www.31ppt.com/p-4561320.html