-
Vxworks
操作系统内核
Vxworks
内核(
wind
)的基本功能可以分为如下几类:
(
1
)
任务;
(
2
)
任务间通信
(
3
)
中断服务程序
(
4
)
定时器服务(
watchdog
timers
)
(
5
)
POSIX
时钟和定时器
(
6
)
POSIX memory-Locking
接口
1.
任务
任务是代码运行的一个射象,从
系统的角度看,任务是竞争系统资源的最小运行单元。
2.
任务结构
实际引用中任务更好的对客
观世界的事件做出反应。
Vxworks
是多任务环境,每个任
务
都有自己的上下文(
context
)
,记录了任务运行时的
cpu
环境和
系统资源状况,
context
切换时,比保护在任务控制块中
(
TCP
)
,一备下次调用是恢复运行
环境。
Context
包括:任务号
,CPU
寄存器和浮点寄存器,可变栈几函数调用,标准的输入
和输
出,延迟时间,时间的大小,内核控制结构,信号处理函数(
signal
handlers
)
,调用和
性能监视。
3
,任务状态和任务迁移
实时系统最基本的状况有以下四种:
1)
就绪态
(Ready)
:任务只等待系统分配
CUP
资源。
2)
挂起态
(Pend)
:
任务需等待某些不可利用的资源而被阻塞。
3)
休眠态
(suspend)
p>
:如果系统不需要某一个任务工作,则这个任务处于休眠状态。
4)
延迟态
< br>(Delay)
:任务被延迟时所处的状态。
当系统函数对某一个任务进行操作时,
任务从一种状态跃迁到另一种状态
。
处于任一状态的
任务都可被删除。
V
xWorks
的任务跃迁如图
1
所示。
ready
?
pend
semtake() /msgQReceive()
ready
?
delay
taskDelay()
ready
?
suspend
taskSupend
()
pend
?
ready
sem
Give
()
/msgQsend()
pend
?
suspend
taskSuspend()
delay
?
ready
expired delay()
delay
?
suspend
taskSuspend()
suspend
?
ready
taskResume()/
taskActiveate()
suspend
?
pend
taskResume()
suspend
?
delayed
taskResume()
kernelTimeSlice()
control round-robin scheduling
taskPrioritySet()
change the priority of a task
taskLock()
disable task
rescheduling
taskUnlock
enable task rescheduling
优先级抢占方式
抢允许、禁止;
如果任务设置了抢占
允许位,
当此任务处于运行态时,
如果高一级优先
级任务因某各系统调用阻塞态或挂起态迁移为就绪,
则此高优先级任务会立即
抢占当前任务
的运行,
如果设置了禁止,
则当前任务不可被处于就绪的高优先级任务抢占,
继续运行阻塞,
刮起或者改变抢占设置为止。
Wind
有
< br>256
优先级,
(
0-255<
/p>
)
0
的优先级最高,
255
最低。在
程序运行中,可通过
taskPriorityset
设置改变优先级。
轮询方式:
时间轮转的方式;
通过<
/p>
KernelTimeSlice
()函数为任务分配时间片;<
/p>
优先级锁
通过
taskLock
()
和
TaskUnlock
()函数设置抢占方式;
任务控制:
任务控制包括:任务创建、控制、信息。
tsakSpawn
()
create and activate a new task;
taskInit()
InitiaLize a new task
taskActivate
Activate an initialized task
taskSpawn()
函数可以做底层分配和初始化和任务激活,
。初始化和激活函数分别是<
/p>
taskInit
()和
taskAct
ivate
()
;
< br>如果你不给你的应用程序中任务起名,
vxworks
会
给每个没有名字的任务器名字,名字统一
格式为
tN
,
N
是十进制数,每次加
1
;
taskName
()
get
the task name associated with a task Id
taskNameToId()
look up the task ID
associate with a task name.
taskIdSelf()
get the calling task ID
taskidVerify()
Verify the
existence of a specified task
taskSpawn(
char *name
//
名称
int priority
//
任务的优先级
int options
//
任务可选项
int stacksize
//
任务堆栈大小
FUNCPTR
entrypt
//
任务入口函数
Int arg1
//
任务入口函数所带参数
Int arg2
…
int arg 10
)
Options
任务可选项:
VX_FP_TASK
0x8
运行带浮点的斜处理器,
VX_NO_STACK_FILL
0x00
不使用
0xee
填充堆栈
VX_PRIV
ATE_ENV
0x80
用私有环境进行任务
VX_UNBREAKABLE
0x2
任务内的断点失败
VX_SUPERVIDOR
0
用户任务常量用值
taskOptionsGet()
examine task options
taskOptionsSet()
set
task options
任务信息(
task
information
)
通过下列函数可以查到任务信息,
但是所查询的信息是查询时刻的信息,因为任务状态
是不断变化的,所以查询的信息可能
不是当前该任务的信息,除非该任务进入睡眠状态。
taskIdListGet()
fill an array
with the Ids of all cative tasks
taskInfoGet()
get information about a task
taskPriorityGet()
examine the
priority of a task
taskPegsGet ()
examine a
task
’
s registers
taskRegsSet()
set a task
’
s
registers
taskIsSuspended
check if a task is suspended
taskIsready()
check if task is read ti
tun
taskTcb()
get a pointer to
task
’
s comtrol block
任务的删除及安全删除
任务可以被删除,
这些函数用于删除任务和保护任务以免误删。
Exit
()
taskDelete
()
taskSafe
()
taskUnsafe
()
在任务被终止时该任务运行期间分配的内存将不会被释放的
<
/p>
任务一般式调用
exit
()终止自己,
但也可以显示的调试
exit()
来杀死自己,一个任务
可以调用
taskdelete
()来杀死另
一个任务。
一个任务被删除的时候,其他任务不会被通知,函
数
tasksafe
()和
taskU
nsafe
()被
用来保护任务,避免误删。
< br>TaskSafe
()用来保护任务不被其他任务删除,这种保护通常是
任务运行在临界区或者使用共享资源的时候被使用。
例如:
一个任务可能使用信号量来访
问访问一段数据结构,
当正在使用该数据结构时,
该任务被删除
,
因为该任务还没有访问完该结构,
所以此时数据结构可能处于
一种被破坏状
态,此时,用于信号量不能在被该任务释放,所以共享资源也不能在被利用
了。
使用
tasksafe
()
保护任务任何其他想删除该任务的任务被
阻塞,
当任务访问共享资源
结束后,用
taskUnsfe
()函数使用自己处于可被删除态,
tas
kSafe
()和
taskUnsafe()
可以
被多次使用,一个计数器来记录其使用次数,
当计
数器为
0
的时候,任务可以被删除,
一
个
任务不能让其它任务
tasksafe
()和
taskUnsafe
()
。