基于嵌入式操作系统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 14870080

0 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做“按位或”操作使得任务支持浮点运算(如果仅包含此选项,则不需进行或操作):

时间: 2024-10-29 20:12:41

基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制的相关文章

基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念

1引言 嵌入式系统定义义为:嵌入到对象体系中的专用计算机系统."嵌入性"."专用性"与"计算机系统"是嵌入式统的三个基本要素,对象系统则是指嵌入式系统所嵌入的宿主系统.目前,随着高端消费类电子产品(如PDA.手机.智能家电)的普及,嵌入式计算机系统获得了相当广泛的应用.  操作系统在嵌入式软件体系中占据着重要低位,学习和掌握相关的知识是一名嵌入式系统研发人员的必须. 1.1本文的读者对象与写作目的 本文针对的读者对象为入门级的嵌入式系统软件开发人

嵌入式操作系统风云录:历史演进与物联网未来.

嵌入式操作系统风云录: 历史演进与物联网未来 何小庆 著 图书在版编目(CIP)数据 嵌入式操作系统风云录:历史演进与物联网未来 / 何小庆著. -北京:机械工业出版社,2016.10 ISBN 978-7-111-55085-3 Ⅰ. 嵌-   Ⅱ. 何-   Ⅲ. 实时操作系统   Ⅳ. TP316.2 中国版本图书馆CIP数据核字(2016)第248216号 本书全面回顾了嵌入式操作系统的演进历史,主流的嵌入式操作系统的技术特点.成长历程以及背后的商业故事,展望了嵌入式操作系统未来的技术路

嵌入式操作系统风云录:历史演进与物联网未来第2章 Chapter2

第2章 Chapter2 嵌入式操作系统的历史 20世纪70年代末,嵌入式操作系统商业产品开始在北美出现,20世纪90年代末嵌入式OS的数量呈井喷式增加,最鼎盛的时候有数百种之多,即使经过30多年的发展和淘汰,现在嵌入式OS依然有数十种之多.最早的嵌入式操作系统是实时多任务操作系统(RTOS)内核,支持8位和16位微处理器,它初期使用汇编和PLM语言编程,后来支持C和Ada.本章讲述了RTOS发展历史中几个重要产品背后的故事. VRTX:嵌入式操作系统的开拓者 最早出现的商业嵌入式操作系统当属V

嵌入式操作系统---重点知识

嵌入式系统的特点:1. 精简内存空间  2.待机时间长  3.可与外界设备连接  4.动态加载应用程序  5.网络通信 嵌入式处理器分类:1.嵌入式微处理器  2.嵌入式微控制器  3.嵌入式DSP处理器  4.嵌入式片上系统 MIPS:即"无内部互锁流水级的微处理器",其机制是尽量利用软件办法避免流水线中的数据相关问题. ARM处理器:ARM处理器既是一个公司名字,也是一类微处理器的统称,还是一种技术的名字.ARM处理器主要用于工业控制.无线通信.网络应用.消费类电子产品.成像和安全

常用嵌入式操作系统

嵌入式操作系统与通用的操作相比较主要特点在于: 1.小内核,稳定可靠. 2.需要可装卸.可裁剪,以便能灵活应对各种不同的硬件平台. 3.面向应用,强实时性,可用于各种设备控制当中. 国际上常见的嵌入式操作系统大约有40种左,右如:Linux.uClinux.WinCE.PalmOS.Symbian.eCos.uCOS-II.VxWorks.pSOS.Nucleus.ThreadX .Rtems .QNX.INTEGRITY.OSE.C Executive .他们基本可以分为两类,一类是面向控制.

嵌入式操作系统风云录:历史演进与物联网未来Chapter3 第3章

Chapter3 第3章 开源的嵌入式操作系统 今天开源软件正大行其道,从服务器.云计算.桌面到手机和嵌入式设备,到处都可以见到开源软件和开源的操作系统.本章介绍对嵌入式系统发展具有重要影响的几种开源的操作系统. 开源软件与嵌入式操作系统 Linux支持多种微处理器.总线架构和设备,半导体公司SoC芯片的驱动程序.应用相关的中间件.工具和应用程序都是先为Linux开发,后来才移植到其他OS平台.这些特性都非常适合于嵌入式系统应用. 在讨论开源的嵌入式操作系统(简称嵌入式OS)之前,我们先把开源软

嵌入式操作系统Palm webOS该怎么操作

现今随便逛逛各大科技博客.资讯网站,关于iOS.Android.wp7几个时下主流移动操作系统的消息铺天盖地,如若再赶上新产品的发布,那更是风头一时无两.前有Google I/O大会和android 3.1版本的正式推出,今有WWDC大会和iOS5的发布,思来想去打算聊点"小资"的."非主流"的,所以今天就来聊聊webOS的故事. 对于很多人来说webOS还是个陌生的事物,但如果我们提到Palm,很多就会恍然大悟,"哦,原来是他", 对,就是他,

《智能路由器开发指南》——1.3 开源嵌入式操作系统比较

1.3 开源嵌入式操作系统比较 开源嵌入式操作系统,其字面意思有3点,即开放源代码.嵌入式和操作系统,但实质上其流行的关键在于其可扩展性. 开源是指开放源代码,是指软件在开放源代码许可证下发布软件,保障软件用户自由查看软件源代码的权利.这同时也保障了用于修改.复制和再分发的权利,但仍需遵守开源许可协议中的一些约束.开放源代码不仅仅指开放源代码的软件,也是一种软件开发模式. "许可证"是指授权条款,是指使用.修改.复制和再分发的条款和条件的法律文件.最常见的开源许可证有几种:GNU GP

嵌入式操作系统风云录:历史演进与物联网未来导读

Preface 前 言 我是在1994年正式进入嵌入式系统这个领域的,之前10年,我虽然参与过工业自动化和通信设备开发项目,但在当时,它们还不能算是真正意义上的嵌入式系统.可以这样讲,1994年之前我对实时多任务操作系统有一定的了解,但对嵌入式操作系统基本上是一无所知.20多年一路走过来,我与嵌入式系统和嵌入式操作系统结下了不解之缘. 写作的初衷 本书最初的构想还要从2008年整理的一本小册子<嵌入式系统文集>说起.就在那一年,我自己有了更多的可以自由支配的时间,于是我将前几年撰写的20余篇文