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

简介: 4 任务与任务状态 <p>  VxWorks实时内核Wind提供了基本的多任务环境。对用户而言,宏观上看起来,多个任务同时在执行。而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运行。系统调度器需要使用任务控制块(TCB)数据结构来管理任务调度功能,TCB被用来描述一个任务。TCB中存放了任务的上下文(context)信息,主要包括程序计数器PC、CPU内部
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做“按位或”操作使得任务支持浮点运算(如果仅包含此选项,则不需进行或操作):

相关文章
|
1月前
|
安全 Unix Linux
Unix是一个多用户、多任务的操作系统
Unix是一个多用户、多任务的操作系统
86 3
|
18天前
|
存储 iOS开发 MacOS
MacOS环境-手写操作系统-33-多任务多窗口
MacOS环境-手写操作系统-33-多任务多窗口
16 0
|
1月前
|
Web App开发 Linux iOS开发
操作系统的演变:从单任务到多核并发
在数字时代的浪潮中,操作系统作为计算机硬件与应用程序之间的桥梁,其发展历史充满了创新与变革。本文将带领读者穿越时空,探索操作系统如何从简单的单任务处理演化为今天能够高效管理多核处理器的复杂系统。我们将一窥各个时代下操作系统的设计哲学,以及它们是如何影响现代计算的方方面面。加入我们的旅程,一起见证技术的力量如何在每次迭代中重塑世界。
37 7
|
1月前
|
机器学习/深度学习 人工智能 算法
操作系统的未来:从多任务到深度学习的演变之路
本文将探讨操作系统如何从处理简单多任务发展到支持复杂的深度学习任务。我们将分析现代操作系统面临的新挑战,以及它们如何适应人工智能和大数据时代的要求。文章不仅回顾过去,也展望未来,思考操作系统在技术演进中的角色和方向。
48 3
|
1月前
|
人工智能 算法 数据挖掘
操作系统的演变:从单任务到多任务的旅程
操作系统(OS)是计算机系统的核心,它管理硬件资源、提供用户界面并运行应用程序。本文将探讨操作系统如何从单任务环境演变为支持多任务的环境,包括这一过程中的技术挑战和解决方案。我们将看到,随着计算需求的增长,操作系统必须适应更复杂的任务管理和资源分配策略,以提高效率和用户体验。通过这个旅程,我们不仅能够理解操作系统的发展,还能洞察未来可能的趋势。
47 5
|
2月前
|
机器学习/深度学习 人工智能 安全
操作系统的未来:从多任务处理到人工智能
【8月更文挑战第23天】本文将探讨操作系统的发展历程及其未来趋势,特别是人工智能在操作系统中的应用。我们将看到如何通过引入人工智能技术,操作系统能够更加智能化地管理资源,提高系统性能和用户体验。
|
2月前
|
缓存 安全 数据库
探索后端开发的核心原则与实践操作系统的未来:从多任务处理到智能优化
【8月更文挑战第23天】在数字化时代的浪潮中,后端开发作为技术架构的支柱,承载着数据处理、业务逻辑实现和系统性能优化的关键任务。本文将深入探讨后端开发的几大核心原则,包括模块化设计、性能优化、安全性强化及可维护性提升,旨在为读者揭示如何构建一个健壮、高效且安全的后端系统。通过分析这些原则背后的理念及其在实际开发中的应用,本文意在启发读者思考如何在不断变化的技术环境中,持续优化后端开发实践,以适应新的挑战和需求。
|
2月前
|
调度 UED
操作系统中的多任务处理机制
【8月更文挑战第23天】在数字时代,操作系统的核心功能之一是多任务处理。它允许用户同时运行多个程序,优化资源使用,并提高生产效率。本文将深入探讨操作系统如何实现多任务处理,以及这一机制对用户体验和系统性能的影响。通过理解多任务处理的工作原理,用户可以更好地管理计算资源,提升个人和组织的工作效率。
|
2月前
|
人工智能 算法 物联网
操作系统的演变:从单任务到多任务的旅程
【8月更文挑战第20天】在数字时代的浪潮中,操作系统作为计算机系统的核心,经历了从简单的单任务处理到复杂的多任务并行处理的转变。本文将探讨这一转变过程中的关键里程碑,包括早期的批处理系统、多道程序设计的出现、分时系统的创新以及现代操作系统中的多任务处理机制。通过这一旅程,我们将了解操作系统如何适应不断增长的计算需求,并预见未来可能的发展方向。
|
2月前
|
机器学习/深度学习 人工智能 自动驾驶
操作系统的演化之路:从单任务到多任务处理
【8月更文挑战第16天】 本文将探索操作系统(OS)的演进历程,聚焦于它们如何从处理单一任务的简单系统,发展成为能够同时处理多个任务的复杂系统。我们将分析这一转变背后的技术驱动因素,以及它对用户体验和系统性能的影响。文章还将探讨现代操作系统在面对日益增长的计算需求时所面临的挑战,以及未来的发展方向。