第十三章 设备驱动程序与内核的接口

发信人 : Rambo (蓝保)
信  区: Free_NJUPT
标  题: I/O包(设备驱动程序)(5)设备驱动程序与内核的接口
发信站: 紫金飞鸿 (Tue Dec  7 20:23:20 1999)

ecos参考手册
-------------------------------------------------------------------------
---
----
第十三章 设备驱动程序与内核的接口
返回上一页
内容:
中断模型(Interrupt Model)
同步机制(Synchronization)
设备驱动程序模型(Device Driver Models)
同步级别(Synchronization Levels)
API
 
本章描述了设备驱动程序与内核和硬件抽象层(HAL)交互的API。这些API主要与中断
的控
制和处理有关。
在没有内核的配置中,相同的API也存在。在这种情况下,这些函数由直接对HAL操
作的
代码提供。
13.1中断模型
eCos为设备驱动程序提供一种三层中断模型,该模型包括中断服务例程(ISRS),延
迟服
务例程(DSRS)和线程。中断服务例程用于响应硬件中断,延迟服务例程用于响应ISR
的请
求,而线程则是驱动程序的客户程序。
硬件中断以几乎不受任何打断的速度传递给ISR。HAL解码中断的硬件源,并调用与
该硬
件源捆绑的中断对象(interrupt object)的ISR。该ISR可以操作硬件,但只允许
调用
有限的API(这里的API指的是设备驱动程序与内核和硬件抽象层交互的API,即13.5
节的
API)。当ISR返回时,它可以要求它的DSR被调度执行。
DSR应在DSR的执行是安全时才执行。也就是说,DSR的执行不会被调度程序打断。在
绝大
多数时候,DSR总在ISR之后立即执行。但如果当前线程正在调度程序中执行,DSR将
被推
迟到线程结束。DSR允许调用比ISR更多的API(13.5节的API)。特别地,DSR能够调
用c
yg_drv_cond_signal()来唤醒正在等待的线程。
最后,线程能够调用所有的API(13.5节的API)。特别地,线程允许等待互斥信号
和条
件变量。
对一个设备驱动程序来说,如果它要接收中断,它首先要定义ISR和DSR例程,然后
调用
cyg_drv_interrupt_create()。随后,驱动程序必须用调用cyg_drv_interrupt_cre
ate
()返回的中断对象句柄调用cyg_drv_interrupt_attach()来将中断对象真正捆绑到
对应
的硬件向量上。
返回
13.2同步机制
eCos支持三种不同级别的同步机制:
1. ISR的同步机制:这通常表示在临界区禁止中断以阻止ISR运行。在多处理机上,
这种
同步机制还要求spinlock。这种同步机制可通过函数cyg_drv_isr_lock()和cyg_drv
_is
r_unlock()来实现。这种机制应该尽量少用且每次只持续很短的时间。
2. DSR的同步机制:该机制在内核中实现,通过在临界区锁调度来禁止DSR的执行。
在无
内核的配置中,该机制通过非内核代码来实现。这种同步机制通过函数cyg_drv_dsr
_lo
ck()和cyg_drv_dsr_unlock()来实现。和ISR同步机制一样,该机制应该尽量少用。
3. 线程的同步机制:这种机制用互斥信号和条件变量来实现。尽管DSR可以给条件
变量
发信号,但只有线程可以给互斥信号上锁和等待条件变量。
ISR运行时中断总是被禁止,因此在ISR中不需要调用cyg_drv_isr_lock()。相似地
,DS
R运行时总是锁调度,因此在DSR中不必调用cyg_drv_dsr_lock()。
返回
13.3设备驱动程序模型
设备驱动程序可以按几种方式建立。确切的模型选择依赖于设备的性质和期望的行
为。
有三种基本模型可以采用。
第一种模型是在ISR中完成所有的设备处理。当ISR被执行时,ISR直接对设备硬件编
程并
访问内存中要直接传送的数据。ISR应该调用cyg_drv_interrupt_acknowledge()。
当IS
R结束时,它可以选择要求它的DSR被执行。但DSR除了调用cyg_drv_cond_signal()
唤醒
线程之外不做任何事情。线程级的代码在处理共享内存时必须调用cyg_drv_isr_loc
k()
或 cyg_drv_interrupt_mask()来阻止ISR的运行。
第二种模型是将设备的处理推迟到DSR。ISR仅仅是通过对设备编程或调用cyg_drv_i
nte
rrupt_mask()来阻止该中断的进一步传递。然后,ISR可以调用cyg_drv_interrupt_
ack
nowledge()来允许其它中断被传递并要求它的DSR被调用。当DSR运行时,DSR完成大
多数
设备处理,还可以给条件变量发信号以唤醒线程,最后调用cyg_drv_interrupt_unm
ask
()重新允许设备中断。线程级的代码在处理共享内存时使用cyg_drv_dsr_lock()来
阻止
DSR的运行
第三种模型将设备处理进一步推迟到线程。ISR的行为和第二种模型完全一样,只是
简单
地阻止和确认中断,然后要求DSR执行。DSR自己只是调用cyg_drv_cond_signal()唤
醒线
程。当线程醒来后,它执行所有的设备处理,并对核心设备具有完全的访问权。线
程结
束处理时应该调用cyg_drv_interrupt_unmask()来重新允许设备中断。
第一种模型适用于需要及时处理且与线程很少交互的设备。第二种模型增加少量设
备处
理的迟延,以换取一种对中断响应有较少影响的同步机制。最后一种模型允许设备
处理
与其它线程一起被调度,同时允许更复杂的设备处理。
返回
13.4同步的级别
由于在ISR或DSR中做可能引起当前线程重新调度的调用(如试图锁一个互斥信号)
将是
相当危险的,API(13.5节的API)中的所有函数都有一个关联的同步级别。这些级
别是

线程
This function may only be called from within threads. This is usually the
cl
ient code that makes calls into the device driver. In a non-kernel config
ura
tion, this will be code running at the default non-interrupt level.
该函数仅可以从线程调用。这通常是导致对设备驱动程序调用的客户级代码。在无
内核
配置的情况下,这是运行在缺省的非中断级别的代码。
DSR
该函数可被DSR或线程代码调用。
ISR
该函数可被ISR, DSR或线程代码调用。
下表显示了每个API(API的含义同上)函数可被调用的级别:
 
Callable from
Function
ISR
DSR
Thread
cyg_drv_isr_lock
 
x
x
cyg_drv_isr_unlock
 
x
x
cyg_drv_dsr_lock
 
 
x
cyg_drv_dsr_unlock
 
 
x
cyg_drv_mutex_init
 
 
x
cyg_drv_mutex_destroy
 
 
x
cyg_drv_mutex_lock
 
 
x
cyg_drv_mutex_trylock
 
 
x
cyg_drv_mutex_unlock
 
 
x
cyg_drv_mutex_release
 
 
x
cyg_drv_cond_init
 
 
x
cyg_drv_cond_destroy
 
 
x
cyg_drv_cond_wait
 
 
x
cyg_drv_cond_signal
 
x
x
cyg_drv_cond_broadcast
 
x
x
cyg_drv_interrupt_create
 
 
x
cyg_drv_interrupt_delete
 
 
x
cyg_drv_interrupt_attach
x
x
x
cyg_drv_interrupt_detach
x
x
x
cyg_drv_interrupt_mask
x
x
x
cyg_drv_interrupt_unmask
x
x
x
cyg_drv_interrupt_acknowledge
x
x
x
cyg_drv_interrupt_configure
x
x
x
cyg_drv_interrupt_level
x
x
x
 
返回
13.5 API
本节详述驱动程序的内核接口。这些接口函数的大部分和内核C API的调用完全相同
,且
在大多数配置中是它们的wrapper。在无内核的配置中,这些函数由HAL直接支持,
或由
模仿所需行为的代码支持。
该API定义在头文件cyg/hal/drv_api.h中。
cyg_drv_isr_lock
Function:
void cyg_drv_isr_lock()
Arguments:
None
Result:
None
Level(指同步级别):
DSR
描述:
禁止中断的传递,禁止所有ISR的执行。该函数维护一个计数器,记录它被调用的次
数。

cyg_drv_isr_unlock
Function:
void cyg_drv_isr_unlock()
Arguments:
None
Result:
None
Level:
DSR
描述:
重新允许中断的传递,允许ISR运行。该函数减少cyg_drv_isr_lock()维护的计数器
且仅
当计数器为0时重新允许中断。
cyg_drv_dsr_lock
Function:
void cyg_drv_dsr_lock()
Arguments:
None
Result:
None
Level:
Thread
描述:
禁止DSR的调度。该函数维护一个计数器,记录它被调用的次数。
cyg_drv_dsr_unlock
Function:
void cyg_drv_dsr_unlock()
Arguments:
None
Result:
None
Level:
Thread
描述:
重新允许DSR的调度。该函数减少cyg_drv_dsr_lock()维护的计数器且仅当计数器为
0时
重新允许DSR被交付。
cyg_drv_mutex_init
Function:
void cyg_drv_mutex_init(cyg_drv_mutex *mutex)
Arguments:
mutex - pointer to mutex to initialize
Result:
None
Level:
Thread
描述:
初始化参数mutex所指的互斥信号。
cyg_drv_mutex_destroy
Function:
void cyg_drv_mutex_destroy( cyg_drv_mutex *mutex )
Arguments:
mutex - pointer to mutex to destroy
Result:
None
Level:
Thread
描述:
删除(destroy)参数mutex所指的互斥信号。
cyg_drv_mutex_lock
Function:
cyg_bool cyg_drv_mutex_lock( cyg_drv_mutex *mutex )
Arguments:
mutex - pointer to mutex to lock
Result:
如果线程得到了锁,返回TRUE,否则返回FALSE。
Level:
Thread
Description:
Attempt to lock the mutex pointed to by the mutex argument. If the mutex
is
already locked by another thread then this thread will wait until that th
rea
d is finished. If the result from this function is FALSE then the thread
was
broken out of its wait by some other thread. In this case the mutex will
no
t have been locked.
描述:
试图锁住参数mutex所指的互斥信号。如果互斥信号已经被另一个线程锁住,那么该
线程
将等待直至拥有锁的线程结束。如果该函数的返回值为FALSE,则表明线程被其它线
程中
止它的等待(例如,某线程调用了cyg_drv_mutex_release)。在这种情况下,该线
程没
有获得互斥信号的锁。
cyg_drv_mutex_trylock
Function:
cyg_bool cyg_drv_mutex_trylock( cyg_drv_mutex *mutex )
Arguments:
mutex - pointer to mutex to lock
Result:
如果mutex被锁住,返回TRUE,否则返回FALSE。
Level:
Thread
描述:
试图锁住参数mutex所指的互斥信号,但不等待。如果互斥信号已经被另一个线程锁
住,
那么该函数返回FALSE。如果函数能够不等待地锁住互斥信号,则返回TRUE。
cyg_drv_mutex_unlock
Function:
void cyg_drv_mutex_unlock( cyg_drv_mutex *mutex )
Arguments:
mutex - pointer to mutex to unlock
Result:
None
Level:
Thread
描述:
解锁参数mutex所指的互斥信号。如果有线程在等待获得锁,其中一个线程被唤醒,
尝试
并获得锁。
cyg_drv_mutex_release
Function:
void cyg_drv_mutex_release( cyg_drv_mutex *mutex )
Arguments:
mutex - pointer to mutex to release
Result:
None
Level:
Thread
Description:
Release all threads waiting on the mutex pointed to by the mutex argument
. T
hese threads will return from cyg_drv_mutex_lock() with a FALSE result an
d w
ill not have claimed the mutex. This function has no effect on any thread
th
at may have the mutex claimed.
描述:
释放所有在参数mutex所指的互斥信号上等待的线程。这些线程将从cyg_drv_mutex_
loc
k()返回FALSE且不拥有互斥信号。该函数对任何可能获得互斥信号的线程没有影响
。?

cyg_drv_cond_init
Function:
void cyg_drv_cond_init( cyg_drv_cond *cond,cyg_drv_mutex *mutex )
Arguments:
cond—condition variable to initialize
mutex—mutex to associate with this condition variable
Result:
None
Level:
Thread
描述:
初始化由参数cond所指的条件变量。参数mutex必须指向一个与该条件变量相关联的
互斥
信号。当一个线程锁住相关联的互斥信号时,它可能只在该条件变量上等待。等待
使互
斥信号被解锁,且当线程被重新唤醒时,线程在继续执行前将自动获得锁。
cyg_drv_cond_destroy
Function:
void cyg_drv_cond_destroy( cyg_drv_cond *cond )
Arguments:
cond - condition variable to destroy
Result:
None
Level:
Thread
描述:
删除参数cond所指的条件变量。
cyg_drv_cond_wait
Function:
void cyg_drv_cond_wait( cyg_drv_cond *cond )
Arguments:
cond - condition variable to wait on
Result:
None
Level:
Thread
描述:
等待参数cond所指的条件变量的信号通知。线程必须先锁住相关联的互斥信号,然
后才
能在条件变量上等待。当线程等待时,互斥信号被解锁,并在该函数返回前重新锁
住。
由于在条件变量上等待的线程有可能偶尔被假唤醒,因此,有必要在循环中使用该
函数
以便在函数每次返回时重新测试条件。
cyg_drv_cond_signal
Function:
void cyg_drv_cond_signal( cyg_drv_cond *cond )
Arguments:
cond - condition variable to signal
Result:
None
Level:
DSR
描述:
向参数cond所指的条件变量发送信号。如果有线程在该变量上等待,至少一个线程
被唤
醒。在这种形式下该函数和cyg_drv_cond_broadcast()可能没有什么区别。
cyg_drv_cond_broadcast
Function:
void cyg_drv_cond_broadcast( cyg_drv_cond *cond )
Arguments:
cond - condition variable to broadcast to
Result:
None
Level:
DSR
描述:
向参数cond所指的条件变量发送信号。如果有线程在该变量上等待,该线程将被唤
醒。

cyg_drv_interrupt_create
Function:
void cyg_drv_interrupt_create(
cyg_vector_t vector,
cyg_priority_t priority,
cyg_addrword_t data,
cyg_ISR_t *isr,
cyg_DSR_t *dsr,
cyg_handle_t *handle,
cyg_interrupt *intr
)
Arguments:
vector—vector to attach to
priority—queueing priority(ISR在VSR中的处理优先级)
data—data pointer
isr—interrupt service routine
dsr—deferred service routine
handle—returned handle
intr—put interrupt object here
Result:
None
Level:
Thread
描述:
创建一个中断对象并返回它的句柄。中断对象包含如下信息:使用的中断向量,在
中断
对象捆绑后将被调用的ISR和DSR。中断对象在内存中分配,并由参数intr传入函数
。中
断对象并不立即捆绑,它必须通过调用函数cyg_interrupt_attach()来捆绑。
cyg_drv_interrupt_delete
Function:
void cyg_drv_interrupt_delete( cyg_handle_t interrupt )
Arguments:
interrupt—interrupt to delete
Result:
None
Level:
Thread
描述:
将参数interrupt所指的中断对象与对应的向量分离,并释放在函数cyg_drv_interr
upt
_create()中参数intr所传入的存储块以便重用。
cyg_drv_interrupt_attach
Function:
void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
Arguments:
interrupt—interrupt to attach
Result:
None
Level:
ISR
描述:
将参数interrupt所指的中断对象捆绑到对应的向量上。这样,当中断发生时,中断
能被
传递到指定的ISR。
cyg_drv_interrupt_detach
Function:
void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
Arguments:
interrupt—interrupt to detach
Result:
None
Level:
ISR
描述:
将参数interrupt所指的中断对象与对应的向量分离,这样,中断将不再被传递到IS
R。

cyg_drv_interrupt_mask
Function:
void cyg_drv_interrupt_mask(cyg_vector_t vector )
Arguments:
vector—vector to mask
Result:
None
Level:
ISR
描述:
对中断控制器进行编程以停止给定向量上的中断传递。在实现中断优先级的体系结
构上
,这同时将禁止所有低优先级的中断。
cyg_drv_interrupt_unmask
Function:
void cyg_drv_interrupt_unmask(cyg_vector_t vector )
Arguments:
vector—vector to unmask
Result:
None
Level:
ISR
描述:
编程中断控制器以重新允许给定的中断向量上中断的传递。
cyg_drv_interrupt_acknowledge
Function:
void cyg_drv_interrupt_acknowledge( cyg_vector_t vector )
Arguments:
vector—vector to acknowledge
Result:
None
Level:
ISR
描述:
执行中断控制器和CPU要求的处理以取消中断请求。ISR可能还需要对设备硬件进行
编程
以便防止中断的立即再触发。
cyg_drv_interrupt_configure
Function:
void cyg_drv_interrupt_configure(
cyg_vector_t vector,
cyg_bool_t level,
cyg_bool_t up
)
Arguments:
vector—vector to configure
level—level or edge triggered
up—rising/falling edge, high/low level
Result:
None
Level:
ISR
描述:
根据中断源的特点编程中断控制器。参数level选择是电平触发中断还是边沿触发中
断。
参数up选择是高电平还是低电平触发(对于电平触发),或选择是上升沿触发还是
下降
沿触发(对于边沿触发)。该函数仅对能控制这些参数的中断控制器起作用。
cyg_drv_interrupt_level
Function:
void cyg_drv_interrupt_level(
cyg_vector_t vector,
cyg_priority_t level
)
Arguments:
vector—vector to configure
level—level to set
Result:
None
Level:
ISR
描述:
编程中断控制器以便在提供的优先级传递给定的中断向量。该函数仅对能控制该参
数的
中断控制器起作用
cyg_ISR_t
Type:
typedef cyg_uint32 cyg_ISR_t(
cyg_vector_t vector,
cyg_addrword_t data
)
Fields:
vector—vector being delivered
data—data value supplied by client
返回值:
位掩码指示是否中断已处理完毕以及是否DSR应被调用。
描述:
中断服务例程的定义。当中断对象被创建时,一个原型为cyg_ISR_t的函数指针被传
递给
cyg_interrupt_create()。当中断发生时,该函数被调用,其调用参数是传递给cyg
_in
terrupt_create()的向量号码和data值。
返回值是一个位掩码,包含下面的一位或全部两位。
CYG_ISR_HANDLED
表明该中断由ISR处理完毕。在这种情况下是否阻止其它的ISR运行是可配置的选项

CYG_ISR_CALL_DSR
导致传递给cyg_interrupt_create()的DSR被调度执行。
cyg_DSR_t
Type:
typedef void cyg_DSR_t(
cyg_vector_t vector,
cyg_ucount32 count,
cyg_addrword_t data
)
Fields:
vector—vector being delivered
count—number of times DSR has been scheduled
data—data value supplied by client
Result:
None
描述:
延迟服务例程的定义。当中断对象创建时,原型为cyg_DSR_t的函数被传递给cyg_in
ter
rupt_create()。当ISR要求调度它的DSR时,该函数在随后的某个时刻被调用。除了
和I
SR相同的参数vector和data外,一个关于ISR要求该DSR被调度的次数的计数器也被
传递
给DSR。每次DSR真正运行时,该计数器被清零,因此该计数器指示自上次DSR运行以
来发
生了多少次中断。
返回
-------------------------------------------------------------------------
---
----
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值