有用VXWORKS的吗?大家进来谈谈你对它的认识,交流交流

蓝天 2003-02-27 12:30:32
刚开始学习,总觉得知识串不起来,零零散散的
...全文
217 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hooboo 2003-05-08
  • 打赏
  • 举报
回复
实时系统的特点
具有和被控系统变化保持同步的能力。
实时系统执行具有确定性即其响应时间是可以预定的。

一个实时系统有以下要求:可以控制独立的,同步的,以及异步的外部组件。具有快速的响应速度。在确定的时间内具有确定的操作,延迟的响应被认为是错误的响应。

多任务是指从宏观上看,系统中可以同时运行多个任务。这些任务可以有不同的优先级和一定的关联关系,从而可以完成复杂的操作。

任务的状态
一个没有挂起的任务可以处于以下四种状态之一。
就绪态 任务获得运行的条件,所有就绪的任务中优先级最高的任务得到执行,其他任务则等待占用CPU。
睡眠态 任务等待一段时间流逝而不做其他事情。
阻塞态 任务等待一个特定事件。
阻塞与睡眠态 任务等待一个特定事件,并且设定一定时间的超时。

一个被挂起的任务将不会被执行,处于就绪、睡眠、阻塞以及阻塞与睡眠状态的任务都有可能被挂起,当它们被恢复时则恢复到相应的状态。

下图是任务状态的转换图。



任务切换和优先级

所有任务由VxWorks的WIND内核来管理,内核根据一定的调度算法来给各个任务分配CPU资源。同时使用任务控制块(Task Control Blocks 简称TCBs)来描述各个任务。任务切换时,将原来执行的任务的相关内容存到它的任务控制块中,同时取出要执行的任务的任务控制块从而实现任务切换。如下图所示:



任务的调度是抢占式的,高优先级的任务可以抢占低优先级的任务。下面就是一个基于优先级的调度图示。

图中低优先级的任务C被中优先级的任务B抢占,当任务B被阻塞之后,任务C再次得以调度,但是当任务B再次变为就绪态之后再次抢占任务C,当高优先级的任务A就绪之后,任务B和任务C都被阻塞。任务A得以调度。

创建任务
int taskSpawn (name, priority, options, stackSize, entryPt, arg1, ..., arg10)
name 任务名字,如果是NULL则系统分配一个默认的名字。
priority 任务的优先级:0-255。
options 任务选项:VX_UNBREAKABLE.
stackSize 任务栈的大小(以字节为单位)
entryPt 任务入口
arg1, ..., arg10 参数

每个VxWorks任务都有一个自己的任务栈和一个任务控制块TCB。如果创建成功则返回任务ID否则返回ERROR。
任务ID是任务的唯一标识。可以用taskIdSelf()函数获得当前任务ID,用taskIdListGet()获得所有存在的任务,用taskIdVerify()确认一个任务的ID是否有效。
任务名字是为了方便识别,任务名字并不一定唯一。通常默认情况下以t开头。相关的函数有taskName()获得某个任务ID对应的任务名字。taskNameToId()通过任务名字获得任务的ID。
优先级是调度任务时的依据。相关的函数有taskPriorityGet (tid, &priority)获得某个任务的优先级。taskPrioritySet (tid, priority)重新设置某个任务的优先级。
任务栈,在任务创建之后,任务栈的大小就固定不变了。由于内核会占用一些空间,栈的可用大小可能稍小于申请的大小。

任务选项
VX_FP_TASK 支持浮点。
VX_NO_STACK_FILL 不在栈内用0XEE填充。(可以节省任务创建时间)
VX_UNBREAKABE 不能设置断点。
VX_DEALLOC_STACK 在任务存在时释放栈和任务控制块。
可以用taskOptionsGet() 获得任务的各个选项。用taskOptionsSet() 取消VX_DEALLOC_STACK选项。

删除任务
taskDelete(tid) 将删除任务并且释放栈和任务控制块。
exit (code) 删除当前任务本身。

控制任务
taskRestart (tid) 任务重启。
taskSuspend (tid) 任务挂起。
taskResume (tid) 任务恢复。
STATUS taskDelay (ticks) 任务进入睡眠。

任务钩子
taskSwitchHookAdd () 任务切换钩子。
taskCreateHookAdd () 任务创建钩子。
taskDeleteHookAdd () 任务删除钩子。

系统任务

任务名字 任务优先级 任务功能
tUsrRoot 0 初始化任务,配置系统,并创建Shell,然后退出。
tLogTask 0 系统日志。
tExecTask 0 异常处理。
tWdbTask 3 WDB代理。
tNetTask 50 任务级网络功能。
tFtpdTask 55 FTP服务器。

2.2 信号量
信号量是一种内核对象,信号量操作会引起任务的状态跃迁。常用的有三种信号量:同步信号量,互斥信号量,和计数信号量。同步信号量可以使任务阻塞,直到它等待的事件发生为止。互斥信号量可以使任务在访问共享资源时,获得一个独占的锁。而计数器信号量可以限制资源被占用的次数。

创建同步信号量
SEM_ID semBCreate (options, intialState)
options 指定任务阻塞在信号量后的各任务排队的队列类型 (SEM_Q_PRIORITY 按照优先级排队 或者SEM_Q_FIFO 按照先来先服务的顺序排队)
initialState 信号量的初始化状态:SEM_FULL 代表事件已经发生过或者 SEM_EMPTY代表事件还没有发生。
通常创建同步信号量时都初始化为SEM_EMPTY 态。
如果创建成功则返回SEM_ID 否则返回 NULL 。

创建互斥信号量
SEM_ID semMCreate (options)
options 指定任务阻塞在信号量后的各任务排队的队列类型 (SEM_Q_PRIORITY 按照优先级排队 或者SEM_Q_FIFO 按照先来先服务的顺序排队) ,SEM_DELETE_SAFE安全删除属性,允许任务优先级安全倒置SEM_INVERSION_SAFE 。

对信号量的操作
STATUS semTake (semId, timeout)
semId 创建信号量时返回的SEM_ID。
timeout 等待信号量的时间。可以是tick数或者WAIT_FOREVER或者NO_WAIT。

如果操作成功返回OK,如果超时或者信号量ID无效则返回ERROR。
此操作可以引起任务阻塞,直到semGive操作发生或者超时。

STATUS semGive (semId)
semId 创建信号量时返回的SEM_ID。

如果操作成功返回OK,如果信号量ID无效则返回ERROR。
此操作将使阻塞在此信号量处的任务脱离阻塞。

STATUS semFlush (semId)
semId 创建信号量时返回的SEM_ID。

如果操作成功返回OK,如果信号量ID无效或者此操作不被支持则返回ERROR。
此操作使得所有阻塞在此信号量处的信号量脱离阻塞。同时信号量的状态并不发生改变。此操作一般用于同步操作,对互斥信号量不能进行此操作。

STATUS semDelete (semId)
semId 创建信号量时返回的SEM_ID。

如果操作成功返回OK,如果信号量ID无效则返回ERROR。
此操作终止此信号量,并且释放信号量所占用的内存。

同步信号量的使用方式
首先创建一个同步信号量以等待某个同步事件。
同步信号量可以处于两者状态:FULL态或者EMPTY态。FULL态代表等待的事件已经发生过,EMPTY态代表等待的事件还没有发生。
等待事件发生的任务调用semTake (semId, timeout)操作后,将阻塞任务直到同步事件发生,获得信号量。上述同步事件发生,获得信号量的过程,一般是有任务或者中断服务程序检查到事件发生,调用semGive (semId),这个操作将等待信号量而阻塞的任务变成非阻态。


以上是同步信号量执行semTake (semId, timeout)操作的图示。
zhouzhaohan 2003-03-22
  • 打赏
  • 举报
回复
SI3US-027272-21847
zhouzhaohan 2003-03-22
  • 打赏
  • 举报
回复
SI3US-802752-95343
心念不空过 2003-03-13
  • 打赏
  • 举报
回复
gz
wzm007xiao 2003-03-05
  • 打赏
  • 举报
回复
还有它的破解文件在哪能找到!
wzm007xiao 2003-03-05
  • 打赏
  • 举报
回复
楼上,source insight升级到3.5了?哪里可以下载啊!?可以告诉我么?
蓝天 2003-03-04
  • 打赏
  • 举报
回复
为什么是__asm__而不是asm??
zhouzhaohan 2003-03-01
  • 打赏
  • 举报
回复
同意,我从来不用它的编辑器,一般是在tornado里设置使用外部的编辑器,就是ultraedit。不过要查找符号的话,还是用source insight比较方便。这个东西终于升级到3.5了。
wzm007xiao 2003-03-01
  • 打赏
  • 举报
回复
我们现在在用VXWORKS,不过用的时候觉得他的编译器还需要改善,比如,编译的时候看到的结果很乱。它的编辑器也不是很方便,通常我们都用VC或什么UE来编辑,然后再到TORNADO中。
zhouzhaohan 2003-02-28
  • 打赏
  • 举报
回复
都没做过,现在已经不做vxworks了,不过我们买了vxworks协议栈的源代码。就做了做驱动,和BSP bootloader之类的。
liuliu008 2003-02-28
  • 打赏
  • 举报
回复
楼上的,你也在做VxWorks协议栈?有做IPSEC吗?有时间我们可以切磋一下,,
qmzh888@hotmail.com

Lachine 2003-02-27
  • 打赏
  • 举报
回复
我用vxworks,但是对他的系统还需要进一步了解,不过他不错,但是协议栈还不完美,我们已经抛弃他的协议栈,重新移用linux的协议栈啦!
zhouzhaohan 2003-02-27
  • 打赏
  • 举报
回复
http://www.xs4all.nl/~borkhuis/vxworks/vxworks.html 经典faq

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧