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]