基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制
4 任务与任务状态
VxWorks实时内核Wind提供了基本的多任务环境。对用户而言,宏观上看起来,多个任务同时在执行。而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运行。系统调度器需要使用任务控制块(TCB)数据结构来管理任务调度功能,TCB被用来描述一个任务。TCB中存放了任务的上下文(context)信息,主要包括程序计数器PC、CPU内部寄存器、浮点寄存器、堆栈指针SP、任务信息等。每一任务都与一个TCB关联,当执行中的任务被停止时,任务的上下文信息需要被写入TCB;而当任务被重新执行时,必须要恢复这些上下文信息。
VxWorks的一个任务可能处于如下几种状态:
Ready:就绪状态(不是运行状态),其他资源已经就绪,仅等待CPU,当获得CPU后,就进入Running状态;
Pended:阻塞状态,由于等待某些资源(CPU除外)而阻塞;
Suspended:挂起状态,这种状态需要用taskResume才能恢复,主要用于调试。不会约束状态的转换,仅仅约束任务的执行;
Delayed:睡眠状态,任务以taskDelay主动要求等待一段时间再执行;
这些状态之间的转换关系如下:
| 任务状态转换 | 完成方式 |
| Ready->pended | 通过semTake()/msgQReceive()调用 |
| Ready->delayed | 通过taskDelay() |
| ready->suspended | 通过taskSuspend() |
| pended->ready | 通过其它任务对semaGive()/msgQSend()的调用 |
| pended->suspended | 通过其它任务对taskSuspend()调用 |
| delayed->ready | 延迟期满 |
| delayed->suspended | 通过taskSuspend()调用 |
| suspended->ready | 通过taskResume()/taskActivate()调用 |
| suspended->pended | 通过其它任务的taskResume()调用 |
| suspended->delayed | 通过其它任务的taskResume()调用 |
5 任务控制5.1创建任务
VxWorks程序员创建任务需使用如下API:
|
1
2
3
4
|
taskSpawn (char *name, int priority, int options, int stackSize, FUNCPTR entryPt, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10); |
该API的参数定义如下:
name:任务名;
priority:任务优先级;
options:任务选项,下表给出了各种option及其含义:
| 选项 | 16进制值 | 含义 |
| VX_FP_TASK | 0x0008 | 执行浮点协处理 |
| VX_NO_STACK_FILL | 0x0100 | 不对任务堆栈填充0xee |
| VX_PRIVATE_ENV | 0x0080 | 执行一个环境私有的任务 |
| VX_UNBREAKABLE | 0x0002 | 使任务不能断点 |
| VX_DSP_TASK | 0x0200 | 1 = DSP协处理支持 |
| VX_ALTIVEC_TASK | 0x0400 | 1 = ALTIVEC协处理支持 |
stacksize:任务堆栈大小;
main:任务入口函数;
arg1,…arg10:任务入口函数参数
下面来看一个具体的例子:
例1:创建任务
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/* includes */
#include "vxWorks.h"#include "taskLib.h"#include "sysLib.h" int tid; /* task function */void myFunc(void)
{ int i; printf("Hello, I am task %dn", taskIdSelf()); /* Print task Id */ for (i = 0; i < 10; i++) { printf("%d ", i); taskDelay(sysClkRateGet ( ) / 2); } } /* user entry */void user_start(){ printf("ready to begin a new taskn"); tid = taskSpawn("myTask", 90, VX_NO_STACK_FILL, 2000, (FUNCPTR) myFunc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);} |
程序运行,在VxSim上输出:
|
1
2
|
Hello, I am task 148700800 1 2 3 4 5 6 7 8 9 |
taskDelay(sysClkRateGet ( ) / 2)语句的含义为将任务延迟0.5S,因此,0、1~9的数字输出之间间隔0.5S。
要特别注意taskSpawn函数的options参数,在如下几种情况下我们都要将其它options与 VX_FP_TASK做“按位或”操作使得任务支持浮点运算(如果仅包含此选项,则不需进行或操作):
基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制的更多相关文章
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念
1引言 嵌入式系统定义义为:嵌入到对象体系中的专用计算机系统."嵌入性"."专用性"与"计算机系统"是嵌入式统的三个基本要素,对象系统则是指 ...
- 嵌入式操作系统VxWorks中网络协议存储池原理及实现
嵌入式操作系统VxWorks中网络协议存储池原理及实现 周卫东 蔺妍 刘利强 (哈尔滨工程大学自动化学院,黑龙江 哈尔滨,150001) 摘 要 本文讨论了网络协议存储池的基本原理和在嵌入式操作系 ...
- 【转】嵌入式操作系统VxWorks中TFFS文件系统的构建
时间:2005-02-20 来源:21IC中国电子网 作者:771所加固机工程部 蔡本华 高文炜 关键字:VxWorks TFFS 嵌入式操作系统 文件系统 摘要:目前的嵌入式 ...
- 【重学计算机】操作系统D6章:并发程序设计
1. 并发程序的基本概念 程序顺序性 内部顺序性:CPU严格按照顺序执行指令 外部顺序性:程序员设计程序时往往用顺序设计的思想 顺序程序特性 程序执行的顺序性 计算环境的封闭性: 程序执行时犹如独占资 ...
- 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试
一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于 ...
- 学习STM32,你不得不了解的五大嵌入式操作系统
学习STM32,你不得不了解的五大嵌入式操作系统 原标题:学习STM32,你不得不了解的五大嵌入式操作 ...
- PC端操作系统、移动端操作系统、嵌入式操作系统
左侧部分已是历史的操作系统,右侧的还是活跃的操作系统.安卓系统Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序-- 移动电话工作所需的全部软 ...
- RT-thread嵌入式操作系统相关的问题
面试中问到 RT-thread嵌入式操作系统相关的问题 RT-thread操作系统调度器的实现细节 RT-Thread中提供的线程调度器是基于优先级的全抢占式调度: 在系统中除了中断处理函数.调度器上 ...
- 《实战Java高并发程序设计》读书笔记
文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2. ...
随机推荐
- 高通HAL层之Sensor HAL
高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...
- ABP 数据迁移
我主要是在项目部署的时候.当添加一个租户的时候.那么租户是有一个单独的数据库.而我的并没有用多租户单数据库. 因此我的模块里面有一个领域事件 当租户添加时将生前表生成到对应的数据库中.如果那位网友有更 ...
- BZOJ 2882: 工艺 [后缀自动机+map]
Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...
- ASM字节码框架学习之动态代理
ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...
- 自动化测试selenium(三) 由于iframe 定位不到元素
iframe原因定位不到元素 现在的项目后台基本都是上左右结构,要出现这个结构效果,需要使用到了iframe标签: 我们先说说iframe在java中使用的方法: driver.switchTo(). ...
- 2018-01-08 学习随笔 SpirngBoot整合Mybatis进行主从数据库的动态切换,以及一些数据库层面和分布式事物的解决方案
先大概介绍一下主从数据库是什么?其实就是两个或N个数据库,一个或几个主负责写(当然也可以读),另一个或几个从只负责读.从数据库要记录主数据库的具体url以及BigLOG(二进制日志文件)的参数.原理就 ...
- Visual Studio 2017 for Mac 连接Git的奇怪问题
VS for Mac连接Git的时候遇到个奇怪的问题, 无法将已存在的解决方案绑定并提交到GitHub中去. VS版本7.3.3 问题复现 以为自己操作有问题, 新建项目测试一下, 新建的时候没有勾选 ...
- TinyMce 使用初探
https://www.cnblogs.com/nkxyf/p/3883586.html 参考:http://www.tinymce.com/ 官网 http://www.tinymce.com ...
- centos6下从源码安装setuptools和pip
1. 下载setuptools及pip的源码包 setuptools与pip都是python的模块 setuptools源码包: https://pypi.python.org/pypi/setupt ...
- iterm2 快捷键大全
Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iterm2 摆在那,基本上也就没有多少出场机会了 I ...