这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我的BSP理解文档,贴出来和大家共享。希望大家多多指正!(2)

共47条 1/5 1 2 3 4 5 ›| 跳转至

我的BSP理解文档,贴出来和大家共享。希望大家多多指正!(2)

菜鸟
2004-12-30 20:47:25     打赏
16 中断处理 硬件的中断请求和响应与这三个有关,硬件的中断请求 CPU和系统总线。硬件设备将决定是哪个设备提出了请求,是响应中断还是不响应。CPU将利用中断请求电路或者中断控制器来决定是中断号和中断优先级。当CPU接到中断请求后,基于下面的规则来决定哪个中断服务程序将被执行:

l 外部中断请求排队电路是激活的。

l 中断控制器的中断选择寄存器的内容。

l 当一个中断对应多个中断服务程序时,要通过软件来决定中断服务程序。

在中断服务程序结束后,CPU要重设中断状态,主要包括重设CPU内部的状态寄存器位和中断控制器的中断屏蔽位。

与中断有关的一些概念和问题:

中断优先级,中断时延,中断向量和中断服务程序的连接。以及为了支持中断,硬件应该具备的一些电路特性。

17 在VXWORKS中中断的处理

VXWORKS利用一个中断向量表,在内核启动后,中断服务程序(ISR)必须连接到中断向量。中断向量表中保存的是中断服务程序的地址。

VXWORKS是中断“可知”的,也就是说,在中断期间,VXWORKS会阻止会引起阻塞的进程运行。

在WIND内核启动前中断必须关闭,等中断向量连接好了后再打开中断。

硬件设备的特点和中断库结合在一起完成了中断所具备的功能。

VXWORKS中断处理程序的代码比较小,提供的功能却很多。保护现场,调用中断服务程序,等中断服务程序结束后恢复现场。

非屏蔽中断优先级比较高,用于系统关机和硬件出错。在非屏蔽中断中不要调用内核,这样会破坏内核的完整性。

18 在VXWORKS中断中BSP做的工作

l 在提供启动的时候关闭中断。

l 连接中断服务程序(ISR)和中断向量表。

l 将中断优先级和中断向量绑定到设备。

l 提供硬件中断状态寄存器和控制寄存器的值。

l ISR出错的时候,提供了一个函数向BOOT传递一个结构。

编写BSP程序的时候,应该使驱动程序灵活一点,以便于移植到别的硬件环境底下。

19 有关于系统总线BSP开发者需要知道的一些东西:

l 总线的数据传输率和数据格式

l DMA传输时总线要求

l 中断处理

在硬件环境下的多总线,总线之间通过桥接芯片连接。提供了接口之间的互操作性。

总线的初始化:

l 为 加载VXWORKS而进行的最小初始化

l 为运行应用程序而进行的完成初始化

系统总线和桥接器都有驱动,一般的驱动应该减小对总线特性的依赖。BSP在这方面做的工作是:

l 为总线提供驱动

l 为桥接器提供驱动

l 为总线驻留设备提供一般的驱动

BSP为总线提供的初始化:

l BOOT陷入代码识别本地总线速度,初始化CPU本地总线,为必要的桥接器提供初始化。

l BOOT/VXWORKS提供完整的初始化,尤其是外部总线的初始化。

20 有关于存储器

存储器的类型有:

l ROM

l RAM

l NVM和FLASH

嵌入式系统一般用到上面的几种或者全部都用到。存储器的访问通过地址来进行。存储器的控制器为访问内存提供了一些功能:

l 地址解析逻辑,也就是解码电路

l 时间控制

l 存贮器总线接口支持

l 对存储器映射设备的控制

硬件环境可能有多个映射。

存储器访问包括存储器硬件的初始化和为软件访问提供的支持。

初始化硬件包括:

l 使能存储器的控制器

l 使能存储器芯片

l 使能桥接器

l 对存储器完整性的检查

为软件访问提供的支持包括:

l 初始化动态内存管理

l 维护系统和应用程序内存池的完整性

内存访问包括硬件支持和软件支持:

硬件支持包括:

l 在系统上电的时候将ROM中的代码加载到RAM中去运行。

l 内核启动前的初始化代码初始另外的内存硬件。

软件支持包括:

l 管理虚拟内存映射

l 内核启动后,初始化分区库

l 使能和初始化MMU

内存分区管理是通过自由链表来实现。

21 关于RAM的一些概念

RAM有DRAM和SRAM分。DRAM需要刷新电路,一般用于内存。SRAM用于CACHE。由此RAM的配置也分为主存RAM的配置和CACHE的RAM配置。

主存RAM配置:上电的时候都初始化为0,防止奇偶校验错。由ROM代码初始化和使能。

CACHE的RAM配置:上电时关闭,由VXWORKS内核初始化之前的初始化代码来打开。提供CACHE管理库。有些处理器上电的时候,指令CACHE是打开的。目的在于加快VXWORKS的加载。

22 关于ROM的一些概念

ROM分为PROM,EPROM和EEPROM。非易失性,要用编程器来写,访问时间比RAM要长。可以存放系统启动代码和硬件配置代码这些需长久保存的信息。写的时候要从硬件电路板上把它卸下来。

23 关于FLASH的一些概念

和ROM类似,搽写电压比ROM要低,所以可以直接写,无需卸下来。可以通过网口和程序代码来写。FLASH芯片支持配置写保护。

24 关于NVM的概念

一般的需要电池,由CMOS RAM来实现。用来存储VXWORKS启动时候的参数。

25 嵌入式系统包含的一些设备

一般的设备和处理器结构,系统总线和内存硬件无关。典型的设备有定时器,串口控制器,网络接口,SCSI控制器和用户自己的ASIC组成。这些设备必须支持读写访问和有限的时间内的访问。某些设备可能支持DMA传输,不管怎样,每个DMA控制器也是一种类型的设备。硬件环境必须提供复位键和异常终止键。

26 定时器

硬件定时器用于系统时钟,辅助时钟,时间戳和实时时钟(RTC)。定时器用于周期性中断,一次性中断和时间戳。在内核激活后定时器就被初始化了。

27 BSP开发周期

a. 得到一个参考BSP和模板代码。

b. 准备开发环境

c. 编写VXWORKS内核运行前的初始化代码

d. 提供TORNADO访问串口的驱动

e. 一旦系统内核激活后,就连接中断

f. 打开系统时钟

g. 增加需要的功能,完成BSP开发

h. 按照WRS的标准,测试BSP和编写文档

以上只是一般步骤,具体的与开发环境和所需要的BSP功能有关。

28 内核运行前的初始化顺序(Pre-Kernel Initialization)

系统上电后,BOOT陷入代码执行的动作有:

处理器跳转到ROM或者是FLASH中的romInit()函数去执行,romInit()又会重新设置CPU,初始化内存和别的硬件系统,之后romInit跳转到romStart()去执行,将boot或者vxworks镜像加载到内存中去。处理器跳转到vxworks镜像中的内核启动前的初始化代码处去运行。也就是usrInit()。对于ROM驻留型的镜像,romStart只是将数据段加载到内存。romInit和romStart合起来构成了BOOT陷入代码。在usrInit中,BSS段都被初始化为0。

VXWORKS可加载型镜像:

在VXWORKS镜像加载到内存中去后,处理器就跳转到那里去执行,在那个地址处有一个函数sysInit(),它负责重置CPU和另外的必须的硬件初始化。然后sysInit就跳转到usrInit去执行,usrInit负责内核启动前的初始化。这两个函数都是静态连接到可加载型镜像的。sysInit和romInit差不多,差别在于romInit会初始化内存,而sysInit不初始化内存。

关于usrInit函数:

它是静态连接到所有类型的VXWORKS镜像的,在这个函数中调用激活内核的函数。它做的工作就是将硬件置于一个静止状态,关闭所有中断,准备内核的运行,romInit和sysInit进行最小的初始化,以便于usrInit的运行,它接着初始化剩下来的所有硬件。将硬件置于一个静止状态的函数是sysHwinit,激活WIND内核的函数是kernelInit,它激活多任务环境,并且产生一个任务,这个任务会安装驱动和创建设备。初始化VXWORKS库。调用启动代码。流程图:

可加载型镜像启动顺序图:

每个函数在哪个地方执行?

romInit始终在ROM/FLASH中执行,执行完后会跳转到romStart中去执行,它也是在ROM/FLASH中执行的。对于ROM驻留型的镜像,romStart将数据段加载到内存中后,继续在ROM中执行,对于非ROM驻留型的镜像,它将启动代码加载到内存中,然后跳转到内存中去运行。对于ROM驻留型镜像,usrInit是在ROM中运行,别的都是在RAM中运行的。sysInit不管是哪种镜像,都是在RAM以外运行的。

29 与BSP相关的一些文件

BSP文件是放在../config/BSPname文件夹底下的,还有一些与BSP有关的文件放在../config/all和../h/make底下。在BSP开发中可以参考的一些别的驱动文件放在../src/drv和../h/drv目录中。BSP开发主要集中于../config/BSPname文件夹底下的文件。所有镜像类型的编译是由../config/BSPname文件夹底下的makefile控制的。

构成BSP的一些文件的存放位置:

30 WIND内核启动前具体的初始化代码

对于所有要烧到ROM中的镜像来说,它有romInit和romStart两个子程序。对于所有可加载型镜像来说,它有sysInit子程序。

1 romInit子程序分析

加电时运行,所有镜像的入口点。在romStart运行之前,进行最小的初始化。它必须完成初始化有:

l 屏蔽CPU中断和重设CPU

l 初始化内存系统

l 初始化堆栈指针和别的寄存器,为romStart的运行做准备

romInit是用汇编写的,在romInit.s文件中。与内存有关系的初始化包括:

l 等待状态

l 刷新速度

l 片选

l 如果需要,关闭二级缓存

两种启动类型:

冷启动:开机重新启动,按硬件按钮

热启动:调用reboot函数,或者有中断异常。

堆栈指针初始化:

STACK_ADRS堆栈开始的宏定义,对于ROM驻留型镜像,数据段开始处就是堆栈开始的地方,是向下增长的。非ROM驻留型镜像,文本段开始处就是堆栈开始的地方,也是向下增长的。

romInit的代码应该是与位置无关的,

2 romStart子程序分析

由romInit跳转而来,它会传递一个启动类型参数给romStart,romStart会执行必要的代码重定位,解压和RAM初始化。之后它会调用usrInit函数。

代码重定位:

ROM驻留型的镜像就拷贝数据段,别的拷贝数据段和文本段。

最后ROM中的代码在RAM中的位置,下面是几个宏定义,

Uncompressed VxWorks boot - RAM_HIGH_ADRS

Compressed VxWorks boot - RAM_HIGH_ADRS

Uncompressed VxWorks - RAM_LOW_ADRS

Compressed VxWorks - RAM_LOW_ADRS

ROM-resident VxWorks boot - RAM_HIGH_ADRS

ROM-resident VxWorks - RAM_LOW_ADRS

3 sysInit子程序分析

sysInit是可加载型镜像的入口点,在镜像加载到RAM中去后,处理器就跳到sysInit去执行,sysInit的起始地址在RAM_LOW_ADRS处,执行完最小的初始化后,解下来就执行usrInit子程序。sysInit和romInit执行的功能差不多,除了内存的初始化。sysInit是用汇编写的,在sysSLib.s文件中。sysInit子程序要完成的功能包括:

l 屏蔽处理器中断和重新设置处理器状态

l 初始化堆栈指针和另外的寄存器,准备执行usrInit子程序。传递一个启动类型参数。

硬件的初始化是在sysHwInit中完成的。

一旦romInit代码编写完成,只有在创建sysInit的时候它才可能要做必要的修改。

l 移除内存初始化的代码

l 完成之后跳到usrInit而不是romStart

l 连接到所有的VXWORKS镜像,但是只有可加载型镜像才执行

31 Pre-Kernel Initialization

Pre-Kernel Initialization必须要做好让内核运行的环境。 在内核启动前,系统内存池还没有初始化,因此没有下面几个功能:

l 没有多任务环境

l 没有中断处理

l 没有和硬件之间的输入输出访问

l 没有和网络接口之间的访问

内核启动后的初始化需要系统内存池和多任务环境。

内核启动前和启动后的一般的初始化代码是在文件usrConfig.c中的。

usrInit代码负责内核启动前的初始化,它是静态连接到所有的内核镜像的,调用激活内核的代码。主要是将硬件置于一个静止状态。以便于下面内核的激活,关闭所有硬件的中断。

romInit/sysInit进行最小的初始化为下面的usrInit做准备,usrInit进行最小的初始化为下面内核的运行做准备。

kernelInit激活多任务环境,并且产生一个任务tUsrRoot,tUsrRoot会做下面的工作:

l 安装驱动,创建设备

l 安装中断处理函数,激活中断

l 初始化VXWORKS库

l 调用应用程序启动代码

32 sysHwInit的职责

在VXWORKS内核启动前将硬件置于一个静止状态

l 初始化硬件环境

l 关闭硬件中断

l 初始化设备的控制寄存器和状态寄存器

所有硬件的中断都必须关闭

l sysHwInit是在所有硬件中断关闭的情况下执行的

l 在kernelInit激活内核的时候中断才打开

l 中断服务程序(ISR)是在内核启动后才安装的

sysHwInit的代码是在文件sysLib.c中的,不能够被用户的代码直接访问到。每一个硬件设备中断的打开,是作为那个设备驱动程序的一部分,在内核启动后,初始化硬件设备的驱动时打开的。

33 环境,设备和中断

环境和设备的初始化主要的目的是为了支持关闭中断。在设备被访问之前,系统环境必须部分的被初始化,主要是初始化内存控制器和配置总线。系统环境可能包含一个中断控制器。在中断被关闭之前,设备必须部分的被初始化,包括:

l 设备必须被配置成允许被中断控制器访问

l 中断控制器也必须被初始化

为了访问设备,必须:

l CPU能访问系统总线

l 设备的访问通过系统总线

设备初始化

在硬件设备可以被访问之后,sysHwInit可以开始初始化工作了,在sysHwInit里的初始化一般被配置成关中断。此时中断 处理程序还没有,设备知道内核激活后才可用。

在BSP控制下的设备:

一般的设备驱动代码,控制硬件用的,而不是控制CPU用的,可以在多个BSP环境下使用。

带有中断控制器的BSP:

中断控制器是在sysHwInit中初始化的,与中断控制器连接的一些设备,他们的中断开始是被屏蔽了的。除了串口控制器,别的有驱动的设备,是在内核激活后,将中断和控制寄存器初始化的。

不带中断控制器的BSP:

没有中断控制器,则中断请求直接和CPU相连。设备中断控制器的寄存器直接通过局部总线访问。通过外部 存储控制器仲裁。

在sysHwInit中中断必须一个一个的屏蔽。

34 串口控制器的初始化

串口控制器是在内核激活前就被初始化的,用于系统级的调试。初始化子程序是sysSerialHwInit,被sysHwInit调用,在sysSerial.c文件中。

子程序sysSerialHwInit做的工作:

l 初始化串口控制器的控制结构

l 调用驱动初始化代码来关闭中断

[/replyview]

[align=right][color=#000066][此贴子已经被作者于2005-1-13 19:05:10编辑过][/color][/align]



关键词: 我的     理解     文档     出来     大家     共享     希望     多多         

菜鸟
2004-12-30 21:03:00     打赏
2楼
let me see!

菜鸟
2004-12-31 01:02:00     打赏
3楼
我看看好不好。

菜鸟
2004-12-31 03:42:00     打赏
4楼
kao!

菜鸟
2004-12-31 04:48:00     打赏
5楼
:0)[em02]

菜鸟
2004-12-31 18:16:00     打赏
6楼
see see

菜鸟
2004-12-31 18:35:00     打赏
7楼
see see

菜鸟
2004-12-31 21:40:00     打赏
8楼
谢谢

菜鸟
2004-12-31 23:23:00     打赏
9楼
ok

菜鸟
2005-01-01 01:26:00     打赏
10楼
see see toi

共47条 1/5 1 2 3 4 5 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]