跳至主要内容

VxWork BSP 和启动过程

开发BSP主要的两点:

  1. 系统image的生成,image的种类,image的download下载过程,系统的启动顺序和过程,调试环境的配置及远端调试的方式和方法,相应BSP设置文件的修改(网络,串口..),BSP各文件的组成和作用.

  1. 要对系统底层驱动清楚,也就是对CPU及相关的硬件有所了解.主要是32微处理器(上电启动过程, download image的方式方法,读写ROM,地址空间分配,MMU,寄存器,中断定义,..).参照硬件资料,多读一些源码会有所帮助.

Tornado 2 开发调试环境协议框图

主机开发(Host Development System)

目标机(Target System)

Tornado 工具

 

WTX协议通信<==========>

Editor
Project
Shell
Debugger
Browser
Windview

Target Server

|

Target Agent
VxWorks Target Simulator

WDB协议通信
<==========>

Application
VxWorks OS
VxWorks Target (WDB)Agent

两个主要两个协议

WTX协议(Wind River Tool eXchange): 用于开发机内部Tornado工具与Target Server之间通信.

WDB协议(Wind DeBug): 用于主机Target Server与目标机之间的通信.

 

一.基本概念

BSP定义:

Provides VxWorks with primary interface to hardware environment.

作用: 

  • 在通电后,初始化硬件.

  • 支持VxWorks和硬件驱动通信.

  • 使hardware-dependent 和 hardware-independent在VxWorks系统中很好的结合.

主要BSP主要文件目录的组成及主要文件的作用:

  • 目录target/config/All:

这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件.

configAll.h:

缺省定义了所有VxWorks的设置.如果不用缺省的设置,可在BSP目录下的config.h文件中用#define或#undef方式来更改设置.

bootInit.c:

在romInit.s后,完成Boot ROM的第二步初始化.程序从romInit.s中的romInit()跳到这个文件中的romStart().来执行必要的解压和ROM image的放置.

bootConfig.c: 完成Boot ROM image的初始化和控制.

usrConfig.c: VxWorks image的初始化代码.

  • 目录target/config/comps/src:

涉及系统核心的components,主要由target/config/All中usrConfig.c中函数调用

  • 目录target/config/bspname:

包含系统或硬件相关的BSP文件.

Makefile

一些命令行控制images的生成,参见 BSP设置部分及生成下载

README

BSP发布纪录,版本,总的文档

config.h

包括所有涉及CPU主板的设置及定义(includes,definations),参见 BSP设置文件及生成下载

configNet.h

网络驱动的主要设置文件,主要对END驱动设置.

romInit.s

汇编语言文件,是VxWorks Boot ROM和ROM based image的入口,参见 系统启动部分

sysALib.s

汇编语言文件,程序员可以把自己的汇编函数放在这个文件里,在上层调用.VxWorks image的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数.

sysLib.c

包含一些系统相关的函数例程,提供了一个board-level的接口,VxWorks和应用程序可以以system-indepent的方式生成.这个文件还能包含目录target/config/comps/src的驱动.

sysScsi.c

可选文件用于Scsi设备设置和初始化.

sysSerial.c

可选文件用于所有的串口设置和初始化.

bootrom.hex

ASIC文件包含VxWorks Boot ROM代码

VxWorks

运行在目标机上,完整的,连结后的VxWorks二进制文件.

VxWorks.sym

完全的,连结后带有符号表的VxWorks二进制文件

VxWorks.st

完全的,连结后,standalone,带有符号表的VxWorks二进制文件

 

  • BSP用"make"来编译连接生成(Created),而不是用Tornado的工具.

  • BSP和应用程序都可以在"make"或"tornade"上开发(developed)

  • BSP被设置包括以下驱动:

中断控制interrupt controller,计时器timer(sys/aux),串口UART(serial),显示屏LCD,键盘Keyboard(opt),触摸屏touch-screen(opt).

前面三个是BSP的主要部分.

  • BSP默认的download VxWorks RAM image方式是从ethernet.

  • 串口电缆需要用来和开发板(COM1)通信,通过协议WDB.

    VxWorks Image的种类:

  • Loadable images.

  • ROM-based images---compressed/uncompressed.

  • ROM-Resident images.

ROM-resident image 对一些系统内存RAM资源较少的情况下,为了节省资源,只拷贝image中的数据部分(data segment)到内存RAM,留下程序部分(text segment)在ROM中执行。这样空出更多的RAM空间给应用程序。
并不是所用得板子都支持这种VxWorks image.

  • VxWorks boot images---A VxWorks image designed to load another VxWorks images containing application code (often refer to as "boot code")

  • "Burned" into ROM or loaded into Flash.

  • Maybe execute in ROM/Flash (ROM-resident).

  • Maybe execute out of RAM.

  • VxWorks images---A VxWorks image containing "end-user" code,Sub-types:

  • Loadable VxWorks image--VxWorks images loaded by VxWorks boot image.

Loadable VxWorks image是通过VxWorks boot image装载的VxWorks images. 

  • VxWorks ROM image--VxWorks image "burned" into ROM or loaded into Flash.May execute in Flash.

VxWorks images consist of:

  • Text segment---executable instruction.

  • Data segment---Initilized global and static varibles.

  • BSS.

VxWorks Image文件类型的说明

Uploaded images(通过网口或串口下载到RAM):

vxWorks - basic Tornado, shell 和 symbol table 在主机端 
vxWorks.st(文件很大)- 独立的 image,包含shell和 symbol table在目标板运行

ROM based images(直接烧入ROM的VxWorks):

vxWorks_rom - Tornado in ROM,非压缩, 在 RAM 中运行
vxWorks.res_rom_nosym - Tornado in ROM, 非压缩,在 ROM 中运行
vxWorks.st_rom - Stand-alone in ROM, 压缩, RAM 中运行
vxWorks.res_rom - Stand-alone in ROM, 非压缩, ROM 中运行

 

非BSP make文件中包括:

   include $(TGT_DIR)/h/make/rules.library

include $(TGT_DIR)/h/make/defs.default(define default value for makefile)

...............

BSP make文件中包括: include $(TGT_DIR)/h/make/rules.bsp ...

ARM7 做VxWorks imgage 时,在makefile 文件中用 MACH_EXTRA 代替 LIB_EXTRA, 这样生成的VxWorks时不压缩的在ROM中运行的程序(uncompressed ROM-based VxWorks image),否则就是压缩的在RAM中运行的程序(compressed RAM-based VxWorks image).

 

启动顺序的一些概念

  • The sequence of events which occur as power-up are a function of type VxWorks image with will run.

  • 处理器"跳"到再ROM或Flash中Boot-strap 程序的起点. 这个程序主要有以下作用:

  • 关闭中断(来自处理器)

  • 初始化目标内存(target memory)

  • 装载要运行的VxWorks image segments

  • Jumps to code to place target in quiet state

  • 启动顺序 Boot Sequence--Loadable VxWorks image

  • Bootstrap code executes and loads text and data segments of boot code(from ROM or Flash) into RAM.具体执行如下:

  • Boot code compressed-Decompression during copy

  • Boot code uncompressed-copy

  • Boot code is ROM-resident-copy data segment only

  • Boot program executes and loads VxWorks image into RAM.Jumps to VxWorks load point.

  • System initialization code statically linked into loaded VxWorks image executes and completes initialization.

  • Startup Sequence--VxWorks 初始化

做以下工作:

  • Place hardware environment in a quiet state.

  • Initalize and start the wind kernel

  • Spawn a tast to complete system initialization

  • System initialization task will initialize support for end-user specified facilities,and start the end-user's application

 

二.系统启动顺序

  • VxWorks image

分为在ROM中运行和在RAM中运行两种.两者启动顺序的区别在于sysInit()函数的调用.该函数在RAM运行的VxWorks中初始化RAM.

  • ROM中运行的VxWorks

VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks.注意:ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准.

文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,...)

   VxWorks在ROM中运行主要是为了节省RAM空间,以便应用程序有更大的空间运行.只把VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行.

ROM中运行的VxWorks缺点是运行速度慢.

  • RAM中运行的VxWorks

VxWorks在RAM中运行,即写入ROM中的Boot或VxWorks Image是压缩的,需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit()主要是初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorks

usrInit()前面不压缩,即romInit(),romStart()不能压缩.

文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->sysaLib.s中的sysInit()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,...)

  RAM运行的Boot或VxWorks image的text段或data段会从ROM复制到RAM,在RAM中运行.

其中usrRoot()是VxWorks启动的第一个任务,由它来初始化 driver,network等

描述: romInit.s first execute in flash,minal initiliz,then jump to romStart.

  romStart() 开始装载和解压image到RAM,sysaLib.s是在RAM中执行的第一个函数.

  • BootROM image

  • BootROM image

最少的系统初始化,主要用于启动装载VxWorks image.一般有压缩和不压缩两种形式,如bootrom和boot_uncmp.与VxWorks image的区别在于一个Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c.

文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件bootConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,...)

    其中 /target/config/all/bootConfig.c是Boot ROM设置模块.用于通过网络加载VxWorks image.

usrRoot()---->bootCmdLoop(void)命令行选择,或autobooting----->bootLoad(pLine, &entry)加载模块到内存(网络,TFFS,TSFS...)----->netifAttach()---->go(entry)----->(entry)()从入口开始执行,不返回.

  • 各个函数的主要作用

romInit()-----power up,disable interrupt,put boot type on the stack,clears caches.

romStart()-----load Image Segments into RAM.

usrInit()-----Interrupt lock out,save imformation about boot type,handle all the Initialization before the kernel is actually started,then starts the kernel execution to create an initial task usrRoot().This task completes the start up.

sysHwInit()-----Interrup locked,Initializes hardware,registers,activation kernel

KernelInit(usrRoot,...)-----

  • Initializes and starts the kernel.

  • Defines system memory partition.

  • Activates a task tUsrRoot to complete initalization.

  • Unlocks inierrupts.

  • Uses usrInit()stack.

usrRoot()

  • 初始化内存分区表(memory partition library)

  • 初始化系统系统时钟(system clock)

  • 初始化输入输出系统(I/O system)----可选

  • Create devices----可选

  • 设置网络(Configure network)--------可选

  • 激活WDB目标通信(Activate WDB agent)---------可选

  • 调用程序(Activate application)

 

VxWorks Image在RAM中解压的位置

 

RAM Low Address

RAM High Address

VxWorks运行的位置
Boot image由ROM解压后Copy的位置,即bootRom区

RAM Low Address,RAM High Address和有关定义在BSP,config.h,makefile文件中定义.可参见BSP配置文件及生成下载

 

VxWorks 在ROM中的情况

 
ROM 低高地址位

 

 

ROM 低地址位
压缩的VxWorks Imgage
没有压缩的romInit.s和romStart()在ROM的起始位置,系统power up后,从这个起始位开始执行,即执行romInit(),起始位置由硬件定义,一般为0x00000000

注:浅蓝色为整个VxWorks Image.

其中 RAM_LOW_ADRS, RAM_HIGH_ADRS 等一些地址在makefile 和BSP config.h中定义.可参见BSP配置文件及生成下载

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】C++/CLI程序进程之间的通讯

 现在,把大型软件项目分解为一些相交互的小程序似乎变得越来越普遍,程序各部分之间的通讯可使用某种类型的通讯协议,这些程序可能运行在不同的机器上、不同的操作系统中、以不同的语言编写,但也有可能只在同一台机器上,实际上,这些程序可看成是同一程序中的不同线程。而本文主要讨论C++/CLI程序间的通讯,当然,在此是讨论进程间通讯,而不是网络通讯。    简介   试想一个包含数据库查询功能的应用,通常有一个被称为服务端的程序,等待另一个被称为客户端程序发送请求,当接收到请求时,服务端执行相应功能,并把结果(或者错误信息)返回给客户端。在许多情况中,有着多个客户端,所有的请求都会在同一时间发送到同一服务端,这就要求服务端程序要更加高级、完善。   在某些针对此任务的环境中,服务端程序可能只是众多程序中的一个程序,其他可能也是服务端或者客户端程序,实际上,如果我们的数据库服务端需要访问不存在于本机的文件,那么它就可能成为其他某个文件服务器的一个客户端。一个程序中可能会有一个服务线程及一个或多个客户线程,因此,我们需小心使用客户端及服务端这个术语,虽然它们表达了近似的抽象含义,但在具体实现上却大不相同。从一般的观点来看,客户端即为服务端所提供服务的"消费者",而服务端也能成为其他某些服务的客户端。    服务端套接字   让我们从一个具体有代表性的服务端程序开始(请看例1),此程序等待客户端发送一对整数,把它们相加之后返回结果给客户端。   例1: using namespace System; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; int main(array<String^>^ argv) { if (argv->Length != 1) { Console::WriteLine("Usage: Server port"); Environment::Exit(1); } int port = 0; try { port = Int32::Parse(argv[0]); } catch (FormatException^ e) { Console::Wri...

【转】VxWorks入门

1.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。 类似于dos下C语言程序的开发。 合并开发的优点:简单 缺点:资源消耗量大,CPU支持,非标准体系的支持 host (Tornado) target(vxWork) 小程序模块 vxWorks实际采用开发模式 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks的开发工具 vxWorks:面向对象可以剪裁的实际运行操作系统 2.vxWorks启动方式 <1>Rom方式 (vxWork_rom) vxWorks直接烧入rom <2>Rom引导方式(bootrom+vxWorks) 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application 3.调试 <1>attachs/20060907_164540_564.rar 用来在多任务调试时将调试对象绑定到某个任务 <2>任务级调试(attachs/20060907_164540_564.rar taskName) 单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。 全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。 任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attachs/20060907_164540_564.rar到本任务,不起作用。 一次性断点:跑到一次之后自动删除。 <3>系统级调试(attachs/20060907_164540_564.rar system) 把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。 !可是使用命令行方式的调试,参看crossWind教程。 4.调度 优先级调度(无条件) 时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。 !死循环使比它...