第十一讲硬件抽象层与eCos移植.ppt

Download Report

Transcript 第十一讲硬件抽象层与eCos移植.ppt

课前回顾
• Counter
• Alarm
• Clock
• Timer
学习目标
• 硬件抽象层与eCos移植
• 硬件抽象层 HAL
– 硬件抽象层的结构
– HAL的类型硬件抽象层文件描述
• 硬件抽象层接口
–
–
–
–
–
–
–
–
基本定义
体系结构描述
中断处理
I/O操作
Cache控制
SMP支持
诊断支持
链接脚本
学习目标
• 例外处理
– HAL的启动处理
– 同步例外与异步中断的处理
• 虚拟向量
• eCos的移植
– 平台抽象层的移植
– 变体抽象层的移植
– 体系结构抽象层的移植
学习指南
• eCos是一种可移植的嵌入式操作系统,它可以移植到
16位、32位以及64位的各种处理器和平台上。eC
os由各种组件构成,根据具体硬件平台的需要可以分别
将这些组件加入到系统中来,从而实现各种所需的功能。
eCos的这种层次结构的最底层是硬件抽象层(Har
dwareAbstractionLayer),通常
称为 HAL。硬件抽象层 HAL对处理器结构和系统硬
件平台进行抽象,当需要在一个新的目标平台上运行eC
os时,只需对底层的硬件抽象层进行修改,便可迅速地
将整个eCos系统移植到新的平台上。
硬件抽象层 HAL
• 硬件抽象层处于eCos层次结构中的最
底层。根据所描述的硬件对象的不同,可
以将硬件抽象层分成三个不同的子模块,
它们分别是体系结构抽象层(Archi
tectureHAL)、变体抽象层
(VariantHAL)和平台抽象层
(PlatformHAL)。
硬件抽象层 HAL
硬件抽象层 HAL
硬件抽象层 HAL
• 第一个子模块是体系结构抽象层。eCo
s所支持的不同处理器系列都具有不同的
体系结构,如 ARM 系列、Power
PC系列、MIPS系列等等。体系结构
抽象层对 CPU 的基本结构进行抽象和
定义,此外它还包括中断的交付处理、上
下文切换、CPU 启动以及该类处理器
结构的指令系统等等。
硬件抽象层 HAL
• 第二个子模块是变体抽象层。变体指的是该处
理器在该处理器系列中所具有的特殊性,这些
特殊性包括在Cache、MMU(内存管理
部件)和FPU(浮点部件)等方面与其处理
器系列的基本结构具有的这样或那样的差异。
eCos的变体抽象层就是对这些特殊性进行
抽象和封装。如果
hip)内存和片内中断控制器,变体抽象层,
也必须对它们进行处理。对于结构性的变体,
实际上通常由体系结构抽象层来实现这种变体,
变体抽象层只简单地提供适当的配置定义。
硬件抽象层 HAL
• 第三个子模块是平台抽象层。平台抽象层
对当前系统的硬件平台进行抽象,包括平
台的启动、芯片选择与配置、定时设备、
I/O寄存器访问以及中断寄存器等等。
硬件抽象层 HAL
•
•
•
eCos在实现硬件抽象层时,采用了下述主要原则:
① 尽管大部分eCos内核都使用C++,但其硬件抽
象层 HAL均用 C语言和汇编语言加以实现。这使得
HAL的适用范围更为广泛。
② 所有与 HAL的接口均采用 C++宏(Macro
s)加以实现。采用这种方式的好处是可以用内嵌C程
序、内嵌汇编程序、外部C函数和外部汇编程序的形式
对它们进行调用。同时,这种方式可以选择最有效的实
现方法而不会影响到接口。在平台抽象层或变体抽象层
需要对体系结构抽象层的定义进行更换或改进时,还可
以采用这种宏定义的方式对它们进行重定义。
硬件抽象层 HAL
• ③ 硬件抽象层提供简单而具有可移植的
机制来处理广泛范围内的处理器结构和硬
件平台。虽然可以绕过硬件抽象层(不使
用硬件抽象层)而直接对硬件进行操作,
但这种对硬件直接操作的方式移植性较差。
硬件抽象层 HAL
•
•
•
利用配置工具可以对硬件抽
象层进行下面几个方面的配
置:
①
dependentHAL
options。提供一些
与平台硬件无关的配置选项,
为所有平台的 HAL包所共
有。例如,对上下文切换过
程中保存的状态量进行控制
的选项。对于不同的体系结
构,这些选项的实现不尽相
同。
② HALinterrup
thandling。提供
与中断处理相关的一些配置
选项,大多数的 HAL包都
共有这些选项。对于不同的
硬件平台,它们的具体实现
可能有差异。
硬件抽象层 HAL
•
利用配置工具可以对硬件抽象
层进行下面几个方面的配置:
•
③ HALcontextsw
itchsupport。提
供一些与线程上下文相关的配
置选项,大多数的 HAL包都
共有这些选项。对于不同的硬
件平台,它们的具体实现可能
有差异。
④ Explicitcont
rolovercacheb
ehaviour。提供一些
对Cache进行控制的选项,
使得对Cache行为的控制
变得简单。
⑤
debuggingsupp
ort。对源码级调试工具 G
DB的支持进行配置。
•
•
硬件抽象层 HAL
•
利用配置工具可以对硬件
抽象层进行下面几个方面
的配置:
•
⑥ ROM monito
rsupport。对
ROM 监控程序进行配
置。
⑦i386archit
ecture。提供对i
386体系结构的 HA
L包的配置。除了提供该
体系结构一般的配置选项
外,它还提供对具体目标
平台专用的 HAL包的
配置。
•
硬件抽象层的结构
• 在开发一个新的eCos系统时,首先必
须对硬件抽象层 HAL的结构有所了解。
开发人员必须针对目标系统硬件平台的特
殊性而对硬件抽象层中相关部分进行必要
的修改。同时,还应该了解 HAL与系
统其他部分之间的相互影响和关系。
硬件抽象层的结构
• HAL的类型
• 在具体的实现中通常可以将 HAL分为五种类
型,即公共抽象层(CommonHAL)、
体系结构抽象层、变体抽象层、平台抽象层以
及辅助抽象层(AuxiliaryHAL)。
公共抽象层包含了所有结构和平台的硬件抽象
层所共享的配置选项和函数,包括常用的调试
功能、驱动程序 API、测试程序等等。辅助
抽象层包含了处理器的一些变体所共享的公共
模块,如 MotorolaPowerPC中
的
对这五种类型的 HAL进行了描述。
硬件抽象层的结构
硬件抽象层的结构
硬
件
抽
象
层
文
件
描
述
硬件抽象层的结构
硬件抽象层接口
• 硬件抽象层 HAL对底层的硬件进行抽象,
它提供了对硬件操作的接口,上层系统可
以使用 HAL提供的接口函数来实现对硬
件的操作和访问。HAL的接口包括CP
U 体系结构、中断处理、I/O操作、C
ache控制、诊断支持、SMP支持等
各个方面。
硬件抽象层接口
• 基本定义
• 在编译eCos内核的可移植部分时,需要用到
与基本体系结构相关的一些特性定义,如数据类
型、字节排列方式、标号方式等。这些定义位于
头文件cyg/hal/basetype.h,
属于体系结构抽象层。该头文件自动包括在头文
件cyg/infra/cyg type.h内。
硬件抽象层接口
• 基本定义
– 类型定义 见图7.2
• cyg_halint8
• cyg_halint16
• cyg_halint32
• cyg_halint64
• cyg_halcount8
• cyg_halcount16
• cyg_halcount32
• cyg_halcount64
• cyg_halbool
硬件抽象层接口
• 基本定义
– 字节排列方式定义 Byte order
• 它对目标系统的字节排列方式进行定义,它的值必
须是 CYG
dian方式)或CYG MSBFIRST(bi
硬件抽象层接口
• 基本定义
– 标号转换 Label Translation 在C和C++源
文件中可以用这种定义方式,它可以使用在汇
编程序或链接器脚本中所定义的标号。只有在
cyg/infra/cyg type.h中
的默认实现(不加变化地传送参数name)
不适当的情况下才需要这种定义。它与CYG
LABEL DEFN()相对应。
硬件抽象层接口
• 基本定义
– 原子类型
• 这种类型可以保证其读写操作不会被中断。它的大
小与体系结构有关,但必须至少是1B。
硬件抽象层接口
• 体系结构描述Architecture Characterization
– 硬件抽象层对 CPU 的基本体系结构进行了
定义,这些定义包括:CPU 的上下文保存格
式、上下文切换、位操作、断点、堆栈大小和
地址转换等等。这些定义大多数位于头文件c
yg/hal/hal arch.h内,体系
结构抽象层将使用该头文件。如果有变体抽象
层或平台抽象层的特殊定义,则其定义位于c
yg/hal/var arch.h或cyg
/hal/plf arch.h文件内。
硬件抽象层接口
• 体系结构描述
– 寄存器保存格式Register Save Format
typedef struct HAL_SavedRegisters
{ /* architecture-dependent list of registers to
be saved */
} HAL_SavedRegisters;
该结构对保存在堆栈内的CPU 状态(CPU 寄存器)
进行描述。在线程上下文切换、中断和例外处理等过
程中将保存 CPU 状态。对这些过程所需保存状态的
数量并不相同,一般来说,中断所需保存的状态是例
外所保存状态的一个子集,而线程上下文状态又是中
断状态的一个子集。出于调试目的,这三种情况的 C
PU 状态都采用同一个结构。但在所需保存的 CPU
状态信息有显著区别时,这三种状态可以采用一种联
合体的形式包含在该结构中。
硬件抽象层接口
• 体系结构描述
– 线程上下文初始化Thread Context Initialization
HAL_THREAD_INIT_CONTEXT( sp, arg, entry, id )
该宏定义对线程上下文环境进行初始化,以便 HAL T
HREAD SWITCH CONTEXT()可以实
现上下文切换。其参数为:sp—线程堆栈的当前指
针所在位置。它是一个变量或结构成员。arg—传
送给入口函数的第一个参数的值。entry—入口
函数的地址,根据 C调用约定对其进行调用,arg
的值将作为它的第一个参数。
硬件抽象层接口
• 体系结构描述
– 线程上下文切换Thread Context Switching
HAL_THREAD_LOAD_CONTEXT( to )
HAL_THREAD_SWITCH_CONTEXT( from, to )
这两个宏用于实现线程的上下文切换。参数为:fro
m—当前线程堆栈指针存放位置的指针。to—将要
读取的下一个线程堆栈指针所在位置的指针。使用 H
AL THREAD LOAD CONTEXT()时,
当前线程的 CPU 状态被丢弃,目的线程的CPU 状
态被读取。该宏只被使用一次,启动调度器加载系统
的第一个线程的时候使用。使用 HAL THREAD
SWITCH CONTEXT()时,当前线程的C
PU 状态被保存到它的堆栈(使用当前堆栈指针值和
参数from 提供的状态存放地址),并从to指定
的位置加载新线程的状态。
硬件抽象层接口
• 体系结构描述
– 线程上下文切换Thread Context Switching
HAL_THREAD_LOAD_CONTEXT( to )
HAL_THREAD_SWITCH_CONTEXT( from, to )
值得注意的是,在这种上下文切换过程中并没有禁止中
断。任何中断的发生都将被递送到当前CPU 堆栈指
针所指向的堆栈。因此,堆栈指针永远不能失效,也
不能加载一个可能引起被保存的状态被中断所破坏的
值。作为线程上下文环境的一部分,中断状态也同时
被保存或恢复。如果某个线程在禁止了中断之后再进
行上下文切换,在转换到另一个线程之后,这个新的
线程有可能重新使能中断。一旦原来的线程重新获取
了系统控制权后,中断将再一次被禁止。
硬件抽象层接口
• 体系结构描述
– 位索引操作 Bit indexing
HAL_LSBIT_INDEX( index, mask )
HAL_MSBIT_INDEX( index, mask )
这两个宏分别计算 mask中的最低有效位和最
高有效位的位置,并将结果放置到index。有些
CPU 提供了这样的指令进行位索引操作。如
果没有这样的指令,这些宏必须调用 C函数来
完成这种工作。
硬件抽象层接口
• 体系结构描述
– 空闲(idle)线程行为Idle thread activity
HAL_IDLE_THREAD_ACTION( count )
在某些环境下,内核空闲线程在其循环过程中可
能需要 HAL执行一些程序代码,例如可能要
其执行处理器的halt指令。该宏定义为此
提供了一种方法。它的参数count是空闲
线程循环计数器的一个副本,可以用来触发一
种间隔时间比每次循环时间更长的行为。
硬件抽象层接口
• 体系结构描述
– 排序栅栏Reorder barrier
HAL_REORDER_BARRIER()
在进行编译优化时,编译器可能会对某些程序代码重新
排序。这种排序对多线程系统中的某些部分起着至关
重要的作用,有时这种排序可能会导致一些问题的出
现。在不需要进行这种重新排序的地方可以插入宏
HAL_REORDER_BARRIER() ,用来防止编译器进行优
化时的可能的程序代码迁移。该宏应该放置在必须按
源程序代码顺序执行的两条语句之间。
硬件抽象层接口
• 体系结构描述
– 断点支持Breakpoint support
HAL_BREAKPOINT( label )
HAL_BREAKINST
HAL_BREAKINST_SIZE
这三个宏定义提供了对断点的支持。HAL BREAK
POINT()执行一条断点指令,其参数labe
l为断点指令处的标识符,例外处理程序据此可以检
测到执行的是哪一个断点。HALBREAKINS
T包含的是断点指令代码的整型值。HAL BREA
KINST SIZE是断点指令的字节大小。这三个
宏可以一起用来在程序的任何一处设置断点。
硬件抽象层接口
• 体系结构描述
– GDB支持 GDB support
HAL_THREAD_GET_SAVED_REGISTERS( sp, regs )
HAL_GET_GDB_REGISTERS( regval, regs )
HAL_SET_GDB_REGISTERS( regs, regval )
这些宏为 GDB到 HAL的接口提供支持。
见书153页
硬件抽象层接口
• 体系结构描述
– Setjmp and longjmp support
– CYGARC_JMP_BUF_SIZE
hal_jmp_buf[CYGARC_JMP_BUF_SIZE]
hal_setjmp( hal_jmp_buf env )
hal_longjmp( hal_jmp_buf env, int val )
– 为C提供把持
硬件抽象层接口
• 体系结构描述
– 堆栈大小Stack Sizes
CYGNUM_HAL_STACK_SIZE_MINIMUM
CYGNUM_HAL_STACK_SIZE_TYPICAL
– 这两个宏分别定义了线程堆栈大小的最小值和标准值。
CYGNUM_HAL_STACK_SIZE_MINIMUM对线程堆栈大小的最
小值进行了定义。堆栈空间的最小值应该足够保证其线程功能的正
确性,并且能够允许中断的发生,同时还应该允许进行上下文切换
操作。它还应该具有足够的空间来执行简单的线程入口函数以及调
用基本内核操作(如互斥和信号)。除此之外,最小堆栈空间不提
供更多的空间。应用程序在为它们自己的线程创建堆栈时,应该确
定为实现其目的所需要的堆栈空间大小,并加到
CYGNUM_HAL_STACK_SIZE_MINIMUM宏定义上。
CYGNUM_HAL_STACK_SIZE_TYPICAL定 义 了 堆 栈 的 标 准
大 小,它 是 在CYGNUM_HAL_STACK_SIZE_MINIMUM基础上
的一个合理值,通常为1kB。它可以满足大多数普通线程的需要。
只有数据量非常大的线程以及程序调用层次非常深的线程才需要更
大的堆栈空间。
硬件抽象层接口
• 体系结构描述
– 地址转换Address Translation
– CYGARC_CACHED_ADDRESS(addr)
CYGARC_UNCACHED_ADDRESS(addr)
CYGARC_PHYSICAL_ADDRESS(addr)
– 这些宏提供对内存地址的转换操作。在许多体系
结构中,同一位置的内存空间根据视角的不同可
能会有不同的地址值。通过CPU 的内存管理单
元或其他地址转换单元提供给程序的内存地址可
能是与物理地址不同的虚地址。使用 HAL所提
供的这些宏可以进行内存地址的转换操作。
硬件抽象层接口
• 体系结构描述
– 全局指针Global Pointer
– CYGARC_HAL_SAVE_GP()
CYGARC_HAL_RESTORE_GP()
– 这两个宏在被使用时,将在程序中分别插入一段
保存或恢复全局数据指针的代码。在两个eCo
s事例之间进行上下文切换时需要使用它们。例
如,在eCos应用程序和 RedBoot之间
进行切换时,需要使用这两个宏。
硬件抽象层接口
中断处理Interrupt Handling
• HAL的接口提供了一些有关中断处理的宏定义,
包括例外和中断向量、中断的使能和屏蔽以及运
行时的设置操作等。这些宏定义位于头文件cy
g/hal/hal intr.h内,属于体系
结构抽象层。变体抽象层和平台抽象层的专用定
义位于头文件cyg/hal/var int
r.h、cyg/hal/plfintr.h
或cyg/hal/hal platform i
nts.h中。
硬件抽象层接口
中断处理
• 中断向量Vector numbers
• CYGNUM_HAL_VECTOR_XXXX
CYGNUM_HAL_VSR_MIN
CYGNUM_HAL_VSR_MAX
CYGNUM_HAL_VSR_COUNT
CYGNUM_HAL_INTERRUPT_XXXX
CYGNUM_HAL_ISR_MIN
CYGNUM_HAL_ISR_MAX
CYGNUM_HAL_ISR_COUNT
CYGNUM_HAL_EXCEPTION_XXXX
CYGNUM_HAL_EXCEPTION_MIN
CYGNUM_HAL_EXCEPTION_MAX
CYGNUM_HAL_EXCEPTION_COUNT
硬件抽象层接口
中断处理
• 中断向量控制Interrupt state control
• CYG_INTERRUPT_STATE
•
HAL_DISABLE_INTERRUPTS( old )
HAL_RESTORE_INTERRUPTS( old )
HAL_ENABLE_INTERRUPTS()
HAL_QUERY_INTERRUPTS( state )
这些宏对CPU 中断屏蔽机制的状态进行控制,
它们通常对 CPU 的某个状态寄存器进行操作,
从而实现中断的使能和禁止。它们不直接对中断
控制器进行操作。
硬件抽象层接口
中断处理
• ISR and VSR管理ISR and VSR management
• HAL_INTERRUPT_IN_USE( vector, state )
•
HAL_INTERRUPT_ATTACH( vector, isr,
data, object )
HAL_INTERRUPT_DETACH( vector, isr )
HAL_VSR_SET( vector, vsr, poldvsr )
HAL_VSR_GET( vector, pvsr )
HAL_VSR_SET_TO_ECOS_HANDLER( vecto
r, poldvsr )
这些宏将中断和例外分别与它们相应的服务程序
ISR和 VSR进行连接分配。
硬件抽象层接口
中断处理
• 中断控制器的管理Interrupt controller management
• HAL_INTERRUPT_MASK( vector )
HAL_INTERRUPT_UNMASK( vector )
HAL_INTERRUPT_ACKNOWLEDGE( vector )
HAL_INTERRUPT_CONFIGURE( vector, level, up )
HAL_INTERRUPT_SET_LEVEL( vector, level )
• 这些宏用于对具有优先级控制能力的中断控制器进行控
制。如果没有优先级控制器,它们应该为空。这些宏不
具备可重入能力,在中断处于使能状态下对它们的使用
应该特别小心。在中断服务程序ISR和中断使能之前
的初始化程序中使用它们是安全的。但是在 DSR和
线程中使用这些宏时必须先禁止中断。
硬件抽象层接口
中断处理
• 时钟控制Clock control
• HAL_CLOCK_INITIALIZE( period )
•
HAL_CLOCK_RESET( vector, period )
HAL_CLOCK_READ( pvalue )
系统内核在提供超时、延时和调度服务时需要用
到时钟和定时设备,上面这些宏可以用于对这些
设备进行控制。时钟的实现可以认为是一种具有
某种形式的计数器通过一个外部信号源对其进行
加或减操作,当该计数器达到一个预定值时就产
生一个中断。
硬件抽象层接口
中断处理
• 微秒级延时Microsecond Delay
• HAL_DELAY_US(us)
• 该宏的实现是可选的,它可实现微秒级的
延时。该宏通常在需要很短的延时情况下
使用,如硬件控制、Flash设备编程
等等。由于它有可能禁止中断,而且它是
采用一种忙循环的方式实现的,因此在对
中断延时或上下文切换延时敏感的地方不
要使用它。
硬件抽象层接口
HAL I/O 操作
• 对设备进行访问和控制时需要访问I/O
寄存器。硬件抽象层提供了一些宏用于I
/O 寄存器的读写操作。这些宏一般位于
头文件cyg/hal/hal io.h
内。如果变体抽象层和平台抽象层有专用
宏对I/O进行访问,则这些宏位于cy
g/hal/var io.h和cyg/
hal/plf io.h内。
硬件抽象层接口
HAL I/O 操作
• 寄存器地址Register address
• HAL_IO_REGISTER
• 这是一个存放I/O寄存器地址的类型定
义,通常是一个内存地址、一个端口地址
或者一个I/O空间的偏移地址。在较复
杂的体系结构中,它可能是一个地址空间
的基地址加一个地址偏移所组成的一个字,
或者是用一个结构体的形式表示寄存器地
址。
硬件抽象层接口
HAL I/O 操作
• 寄存器读操作Register read
• HAL_READ_XXX( register, value )
HAL_READ_XXX_VECTOR( register, buffer, count, stride )
• 这些 宏 用 于 读 取 各 种 长 度 的 I/O 寄 存 器。其
中 的 XXX 可 以 是 UINT8、UINT16、UI
NT32。 HAL_READ_XXX()从寄存器register
读取适当长度的值并保存到参数value。
HAL_READ_XXX_VECTOR()读取count个适当长度的
寄存器值并存放到buffer指定的空间。参数str
ide控制寄存器空间的指针如何移动,为0时表示重复
读同一个寄存器,为1时读连续相邻的寄存器(指针每次
加1),为2时隔一个读一个(指针每次加2),依次类
推。
硬件抽象层接口
HAL I/O 操作
• 寄存器写操作Register write
• HAL_WRITE_XXX( register, value )
HAL_WRITE_XXX_VECTOR( register,
buffer,count, stride )
• 这些宏用于对寄存器进行各种长度的写操
作。其中的 XXX 可以是 UINT8、U
INT16、UINT32。
硬件抽象层接口
• Cache控制
• 硬件抽象层提供对cache控制的支持. cache控制的宏定
义通常位于头文件cyg/hal/hal_cache.h内。不同系统可能
在不同的层次实现对cache的控侧.因此该头文件可能相
应地位于体系结构抽象层、变体抽象层或者平台抽象层内。
一般来说,体系结构抽象层内有一些普通的cache控制宏
定义.但变体抽象层和普通抽象层可以复盖它们.或者解
除这些定义。变体抽象层和普通抽象层对cache控制的宏
定义分别位于头文件cyg/hal/var_cache.h and
cyg/hal/plf_cache.h内.
硬件抽象层接口
• Cache控制
• 有些Cache宏定义要分别实现对数据 Cac
he和指令 Cache的控制,在宏的名字中使
用DCACHE和ICACHE来对它们加以区
别。在某些体系结构中,只使用一个统一的 Ca
che,数据Cache和 指 令 Cache使
用 同 一 个 Cache。这 种 情 况 下,宏 的
名 字 使 用 UCACHE,具 有DCACHE和
ICACHE名字的宏都将调用 UCACHE宏。
在后面的介绍中,统一用XCACHE来表示它
们中的任何一个。
硬件抽象层接口
• Cache控制
• 一些目标平台对某些Cache宏的使用具有一定的限制,
使用时应该加以注意。在使用具有破坏性的Cache宏
时要特别小心。在 Cache失效之前进行 Cache
同步操作是不安全的,这是因为在同步操作之后到Cac
he失效前的这一时间段内可能有中断产生,有可能引起
中断期间所产生的脏数据行的状态丢失。解决这一问题的
一种方法是在进行同步和失效操作时临时关闭 Cach
e,这样保证了在中断期间 Cache中不会有新的数
据。如果目标系统不具备这种能力,则只能在对Cach
e进行操作时禁止中断,但这样做显然会耗费较长的一段
时间。
硬件抽象层接口
• Cache控制
–
–
–
–
–
Cache的粒度Cache Dimensions
HAL_XCACHE_SIZE
HAL_XCACHE_LINE_SIZE HAL_XCACHE_WAYS
HAL_XCACHE_SETS
这些宏对指令Cache和数据Cache的大小和粒度进行了
定义。 HAL_XCACHE_SIZE定义整个Cache的字节大小。
HAL_XCACHE_LINE_SIZE定义Cache行的字节大小。
HAL_XCACHE_WAYS对 每 组 Cache的 组 相 联 数 目 进
行 定 义HAL_XCACHE_SETS定义Cache组数目,它是根据
上面定义的 Cache大小和 Cache组相联数目进行计算的
结果。
硬件抽象层接口
• Cache控制
• 全局Cache控制Global Cache Control
• HAL_XCACHE_ENABLE() HAL_XCACHE_DISABLE()
•
HAL_XCACHE_INVALIDATE_ALL()
HAL_XCACHE_SYNC()
HAL_XCACHE_BURST_SIZE( size )
HAL_DCACHE_WRITE_MODE( mode )
HAL_XCACHE_LOCK( base, size )
HAL_XCACHE_UNLOCK( base, size )
HAL_XCACHE_UNLOCK_ALL()
这些宏用于改变cache的状态。
硬件抽象层接口
• Cache控制
• Cache行控制Cache Line Control
• HAL_DCACHE_ALLOCATE( base , size )
•
HAL_DCACHE_FLUSH( base , size )
HAL_XCACHE_INVALIDATE( base , size )
HAL_DCACHE_STORE( base , size )
HAL_DCACHE_READ_HINT( base , size )
HAL_DCACHE_WRITE_HINT( base , size )
HAL_DCACHE_ZERO( base , size )
这些宏对所有与参数base和size指定的内存区相
匹配的 Cache行进行某种 Cache操作。只有在
具有这种功能的条件下才实现该宏。这些宏并不一定只对
这些指定的区域进行操作,在某些系统中可能是对整个C
ache进行操作。
硬件抽象层接口
• SMP支持
• eCos对SMP提供有限的支持,这些支持只适用于某
些体系结构和平台。它对SMP目标系统硬件有下面的限
制条件:① 适度多处理:系统支持的CPU 个数通常为
两个到四个,最多不超过八个。② SMP同步支持:硬
件必须提供一种机制允许运行在两个 CPU 上的软件进
ad
等。另一种方法是提供硬件信号寄存器来实现这些操作的
串行化。这些硬件功能用于实现eCos的spinlo
ck。③ Cache一致性:由硬件实现Cache一
致性,软件在访问共享内存时不需做更多的 Cache
一致性工作。
硬件抽象层接口
• SMP支持
• ④ 统一编址:所有CPU 对共享内存的访问使用
相同的地址。⑤ 统一设备编址:所有CPU 都可
以平等访问所有的设备。⑥ 中断路由:硬件平台
必须提供一个能将中断路由到指定 CPU 的中断
控制器。可以将所有中断路由到一个CPU,或
者将某些中断路由到指定的一些 CPU。eCo
s目前不支持动态路由,也不支持同时将所有中
断路由到所有CPU。⑦ 机间中断:必须提供一
个机间中断机制,允许一个 CPU 中断另一个
CPU。CPU 的ID号通常由CPU 状态寄存
器提供,或者由机间中断机制提供。CPU 的I
D应该是简单的一个小的正整数。
硬件抽象层接口
• SMP支持
• 硬件抽象层提供了一些操作用于支持SM
P系统。这些对SMP的支持位于头文件
cyg/hal/hal smp.h内。
变体抽象层和平台抽象层的一些专用定义
分别位于头文件cyg/hal/var
smp.h和cyg/hal/plf s
mp.h内。
硬件抽象层接口
• SMP支持 CPU Control
– This group consists of descriptive and control
macros for managing the CPUs in an SMP
system.
– HAL_SMP_CPU_TYPE
– HAL_SMP_CPU_MAX
– HAL_SMP_CPU_COUNT()
– HAL_SMP_CPU_THIS()
– HAL_SMP_CPU_NONE
• 一个不是实际CPUID的值。用在CPU 类型变量必须是
空值的地方。
硬件抽象层接口
• SMP支持 CPU Control
• HAL_SMP_CPU_START( cpu )
– 启动指定CPU 在 HAL 的入口点处开始执行。在完成
硬件抽象层内的初始化操作后,CPU 进入内核启动点
cyg_kernel_cpu_startup().
• HAL_SMP_CPU_RESCHEDULE_INTERRUPT( cpu,
wait )
– 给CPU 发送一个重新调度(RESCHEDULE)的中断。如
果 wait为非0值,则等待应答。响应该中断的CPU 将在
其滞后服务程序 DSR中调用函数
cyg_scheduler_set_need_reschedule()来启动重新调度。
硬件抽象层接口
• SMP支持CPU Control
• HAL_SMP_CPU_TIMESLICE_INTERRUPT( c
pu, wait )
– 给CPU 发送时间片(timeslice)
中断。
硬件抽象层接口
• SMP支持 Test-and-set Support
第章
大纲要求:当前关键词:难重点:
本课小结
讨论及课后习题