对BSP的了解学习资料

BSP知识

第一章 BSP常识
第一节 BSP的功能
1. Initialization:
2. Driver:
举例:
   BEGIN
Rc;     命令
     FOR
       IF(Rs==Ready)
         memory;Rd
         Break;
       ELSE
         wkafter();
     END FOR
   END
第二节 怎样理解BSP
分析BSP可以从两个角度出发:
1. BSP在宿主机上由什麽函数和文件组成,以及目录情况
2. BSP在目标机上是以什麽逻辑执行的
第二章 BSP的函数与文件
第一节  BSP的文件构成
VxWorks的BSP组成文件主要包含在四个目录下:
  Tornado/target/config/all :所有BSP的公共部分
  Tornado/target/config/comps/vxworks :基本模块描述文件(*.cdf)
  Tornado/target/config/comps/src :模块配置文件(被usrConfig.c使用)
  Tornado/target/config/bspname :与目标板相关的部分
 
下面分别介绍这两个目录下的文件:
1. config/all:在该目录下主要有如下几个文件
bootConfig.c :是所有Boot Rom的主要初始化与控制文件。BootConfig.c是usrConfig.c的一个子集,所以Boot Image只能提供完整VxWorks Image中的部分功能。Boot Image不使用MMU库(SPARC除外)。在集成环境下修改工程相关的配置信息不会影响Boot Image,只有直接修改config.h,configAll.h,bootConfig.c和bootInit.c文件才会影响到Boot Image;
bootInit.c:定义了romStart()函数,用于Boot Rom的第二阶段初始化。首先把text和data段从ROM拷到RAM中,然后初始化部分RAM,进行解压;
usrConfig.c:包含VxWorks Image的主要初始化代码。使用命令行编译时才会用到此文件;
2. config/bspname:在该目录下主要有如下几个文件
makefile: 用于命令行下编译。其中定义了一些宏,如:ROM_TEXT_ADRS,ROM_WARM_ADRS,ROM_SIZE,RAM_LOW_ADRS,RAM_HIGH_ADRS;
config.h:包含所有的头文件和与CPU相关的宏定义,如:对Cache和MMU的配置,RAM和ROM的定位以及大小配置,外部总线地址映射,PCI地址宏;
romInit.s:该文件包含Boot Rom和Rom-based VxWorks Image的初始化入口汇编代码,即实现了romInit()。目标板一上电就开始执行romInit(),主要完成三部分工作:
(1) 屏蔽中断,初始化CPU;
(2) 配置内存系统,通常包括关闭cache,初始化内存控制器;
(3) 初始化堆栈指针和其它寄存器以执行C语言,然后调用romStart().
Note:romInit()函数必须设计成与内存地址无关的代码(PIC),romInit.s只执行一些必要的初始化,其余的初始化工作可放到sysHwInit()中实现。
sysALib.s:包含目标板或系统相关的汇编语言函数,即实现了_sysInit()。这是Boot Rom起来以后执行的第一段代码,sysALib.s类似于romInit.s完成的工作,但它不必设计成PIC,且可调用其它库中的函数。
sysLib.c:包含目标板或系统相关的C语言函数,该文件提供板级接口,通过该接口,VxWorks和应用程序的实现与目标系统无关,sysLib.c包含src/drv目录下的驱动程序子文件,驱动程序的安装和初始化在子文件中完成。
sysSerial.c:串口驱动程序的安装和初始化。
sysNet.c:网络接口设备的安装和初始化。
bspname.h:包含与板子相关的宏定义。若要把src/drv下的某驱动程序移植到目标板上,必须在bspname.h文件开始包含目录target/h/drv下该驱动程序相对应的头文件。
bspname.h应该定义:中断向量或中断号;I/O设备地址;设备寄存器位的含义定义;系统时钟和辅助时钟最大和最小时钟速率。
第二节 BSP的函数构成
sysLib.c中应该实现一下几类函数:
1. 系统时钟中断相关的函数:sysClkConnect(),sysClkDisable(),sysClkEnable(),
sysClkInt(),sysClkRateGet(),sysClkRateSet();
2. 系统硬件初始化函数:sysHwInit(),sysHwInit2()
3. 内存相关的函数:sysMemTop(),sysNvRamGet(),sysNvRamSet()
4. 串口相关的函数:sysSerialHwInit(),sysSerialHwInit2(),sysSerialChanGet()
5. 杂项函数:sysBspRev(),sysModel(),sysToMonitor()
6. 其它可选函数:如:辅助时钟中断相关函数,总线相关函数
第三章 BSP的执行逻辑
第一节 Init的逻辑
1. Boot Init逻辑:
 


2. Driver Init的时机可以有两处:



在sysHwInit()的开始处,这些被初始化的设备是系统或调试所依赖的,我们称为“近设备”,例如串口、时钟;在用户应用程序内被初始化的设备是依赖于操作系统的,我们成为“远设备”,例如在driver中需要使用信号量。
第二节 Driver的执行逻辑
3.2.1 Driver的层次结构
1. 任务与VxWorks的接口:
•fd =open (filename, flags, mode)
•fd=creat (filename, flags)
•read (fd, &buf, nBytes)
•write (fd, &buf, nBytes)
•ioctl (fd, command, arg)
•close (fd)
•remove (filename)
2. 驱动程序表:(I/O System Driver Table: iosDrvShow())
   


设备表:(Devs List: devs())

 


文件描述符表(File Descriptor Table):iosFdShow()
                    Driver #                   Device ID
                   (Index in driver table)     (Driver dependent value)
 
 
 
 
 
          1
           2
           3
           4
           5

3. Driver的操作规整,参数规整和I/O管理:
xxOpen(pDevHdr, pName, flags, mode):返回设备Id号;
xxClose(deviceId)
xxRead(deviceId, pBuf, nBytes)
xxWrite(deviceId, pBuf, nBytes)
xxIoctl(deviceId, cmd, arg)
xxDrv(args,…):iosDrvInstall (xxCreat, xxDelete, xxOpen,xxClose, xxRead, xxWrite, xxIoctl) 往I/O系统驱动程序表添加Driver。xxDrv()在设备初始化阶段被调用,而且只能调用一次,输入参数是设备相关的;
xxDevCreate(devName,arg,…) :为设备描述结构分配内存,执行设备相关的初始化,调用iosDevAdd(pDevHdr,devName,drvNum)往设备列表内添加设备描述符,并用设备名字(drvName)和驱动程序号(drvNum)初始化DEV_HDR;
                                                 
 
3.2.2 driver的多任务运行环境
    我们按照上面的driver的抽象层次构造的driver并不完善,因为实时软件运行的是多任务,在常规操作层与上面两层之间还需要构造一个driver的多任务运行环境,通过三个角度来考虑该问题。
1. Driver的地位:driver是被任务调用的子函数,所以driver的prority和mode都继承了调用driver的任务的
2. Driver的继承地位与实际地位不符
BEGIN
   get tid pro/mode
   store tid pro/mode
   modify tid pro/mode
       process
   restore tid pro/mode
END
3. Driver的手动保护:对于临界设备的驱动程序需要手动地保护,这个保护可以加在driver中,也可以加在系统调用体内,但以加在driver内为宜,例如打印机就是一个临界设备,我们需要构造如下程序
PrintInit()
{……
semBCreate
……
}
PrintWrite()
{semTake
……
semGive
}
    通过上面的例子我们看到有些driver要依赖于操作系统,所以初始化要在系统起来以后进行。
3.2.3 中断与driver的耦合方式
1. 同步driver:类似于C语言的getchar()


2. 异步driver:



类似于C语言的bioskey(),举一个游戏的例子:

3.2.4 task与driver的耦合方式
1. 任务主动“读”:
2. 任务被动“读”:来源于网络client/server的应用,在server端启动一个“deamon task”,该任务一般优先级比较高,高于根任务,平时在阻塞态。

第四章 BSP的工程
第一节 BSP的调试
1. ICE、BDM方式:
2. “黑”调:方法是加“灯”、用示波器测片选等,目的是打通串口,达到宿主机与目标机的通信
3. “黑”调的工程步骤:

第二节 Serial driver
1. Serial的地位:

2. Driver的实现:由于串口的地位比较复杂、组织比较奇特,driver有那麽多接口,所以driver的实现很复杂。Driver有两种实现方式:查询方式和中断方式。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BSP是板级支持包,是介于主板硬件和操作系统之间的一层,它屏蔽了底层硬件的多样性,完成硬件的直接操作,并向操作系统提供硬件信息,从而使操作系统能够在底层硬件上运行。在嵌入式系统中,学习BSP板子可以帮助你了解如何将操作系统在特定的开发板上运行,并学习如何进行驱动开发和系统调试。 对于学习嵌入式BSP板子,你可以按照以下步骤进行: 1. 首先,了解你要学习的开发板的硬件架构和规格。这包括处理器型号、存储器容量、外设接口等信息。你可以参考开发板的规格手册或者官方文档来获取这些信息。 2. 接下来,学习如何搭建开发环境。这包括安装交叉编译工具链、配置开发板的调试接口等。你可以参考开发板的用户手册或者开发者社区的教程来完成这些步骤。 3. 学习如何编译和烧录操作系统。根据你选择的操作系统,你需要了解如何配置和编译内核、根文件系统,并将它们烧录到开发板上。你可以参考操作系统的官方文档或者开发者社区的教程来完成这些步骤。 4. 学习如何进行驱动开发。BSP板子的一个重要组成部分是设备驱动程序,它们负责控制和管理硬件设备。学习如何编写和调试设备驱动程序可以帮助你更好地理解和掌握BSP板子的工作原理。你可以参考操作系统的官方文档或者开发者社区的教程来学习驱动开发。 5. 最后,进行系统调试和性能优化。一旦你成功地将操作系统和驱动程序烧录到开发板上,你可以通过调试工具和性能分析工具来检查系统的运行情况,并进行必要的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值