【Vxworks操作系统】实时多任务介绍-NO.2

这篇具有很好参考价值的文章主要介绍了【Vxworks操作系统】实时多任务介绍-NO.2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

   实时多任务

1.1  任务生命周期管理

 1.2  任务状态控制

1.3  任务调度

1.4   用户接口

结语:


       实时操作系统是基于多任务任务间通信的概念的操作系统,多任务环境允许一个实时应用由一组各自独立的任务组成,每个任务拥有自己的执行线程和一组系统资源。

   实时多任务

        任务管理和调度是实时操作系统的核心,该模块提供任务生命周期管、控制和调度支持。
    
        任务生命周期管理包括:任务创建、任务删除等。
    
        任务状态控制包括:任务在就:绪态(Ready)、阻塞(Pend)、挂起(Suspend)、延时(Delay)四个状态间的切换,任务优先级设置与获取,任务调度锁定。
    
       任务调度,提供基于优先级抢占式任务调度,在同优先级的任务提供可选的Round-Robin时间片轮转调度。

1.1  任务生命周期管理

   1、任务创建和删除。
    任务创建使用taskSpawn()函数,
    函数原型:  
    int taskSpawn()
    {
        char* name,
        int periority,
        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
        }
    
       该函数共有15参数,分别表示:任务名、任务优先级、任务选项字、任务堆栈大小、任务入口函数、以及任务入口函数的10个可选参数;
    
      任务创建和激活成功后返回任务ID号,失败时返回ERROR;
    
      针对参数有一下要求:
    
    1)任务名:便于记忆,最好是以t或者u开始的一个字符串;
    
    2)任务优先级:0~255之间,最高优先级是0,最低优先级是255,建议创建任务优先级在150之后;
    
    3)任务选项字:当任务有浮点数操作计算或者调用浮点计算函数时,任务选项字是VX_FP_TASK;当任务没有浮点数操作计算,也不调用浮点计算函数时,任务选项字是0;
    
    4)任务堆栈:创建任务时分配的内存,包含了任务控制块(TCB)和任务名,剩余内存是任务堆栈,默认使用0XEE填充,这种初始化填充主要用于任务堆栈检查函数checkStack();
    
    5)任务入口函数:任务创建和激活成功后,系统调用这个函数,最多有10个可选参数,任务入口函数在任务堆栈空间运行,因此必须设置足够大的任务堆栈,并且任务入口函数及其调用函数中不允许使用大量占用空间的数组,结构体变量等。
    
     2、任务删除函数;
    
    taskDelete()
    
    函数原型:
    
    STATUS taskDelete
    {
        int tid;
    }
    taskDelete()只有一个参数,是任务名称,任务删除成功后返回OK,失败时返回ERROR。

 1.2  任务状态控制

      任务状态控制包括:就绪(Ready)、阻塞(Pend)、挂起(Suspend)、延迟(Delay)
    
       内核记录系统中每个任务的当前状态,应用程序的内核函数调用可以使得每个任务从一个状态转换为另一种状态,当任务被创建时,任务进入挂起状态,激活很快,任务可以先创建后激活,还有一种方式是直接使用taskSpawn例程,可以在创建任务的同时激活任务。且任务可以在任何状态下被和删除。
    
    
    一、任务状态情况:
    
    1)READY:任务处于等待获取CPU并执行的状态;
    
    2)PEND:任务等待某种资源而处于阻塞状态;
    
    3)DELAY:任务处于等待一个时间段的状态;
    
    4)SUSPEND:任务处于一个不可执行的状态,该状态主要用于调试,suspend状态除了禁止任务执行外,并不禁止任务的状态迁移,因此,pended-suspend状态的任务
    
    可以被unlock,而处于delayded-suspend状态的任务可以被awake;
    
    5) DELAY + S:任务处于delay-suspend的状态
    
    6)PEND + S:任务处于pended-suspend的状态
    
    7)PEND + T:任务处于pend状态,但有timeout值,一旦超时,任务的pend状态将被清除;
    
    8)PEND + S + T:任务处于pend-suspend状态,但有timeout值,一旦超时,任务的pend状态将被清除;
    
    9)stste + 1:任务处于state状态(stste表示上述状态之一),且有继承优先级1;
    
    引起任务迁移的函数如下:
    
    ready-->pended 【semTake()/msgQReceive】
    
    ready-->delayed 【taskDelay】
    
    ready-->suspend【taskSuspend】
    
    pended-->ready 【semGive()/msgQSend】
    
    pended-->suspend 【taskSuspend】
    
    delayed-->ready 【expired delay 延时耗尽】
    
    delayed-->suspend 【taskSuspend】
    
    suspend-->ready 【taskResume()/taskActivate()】
    
    suspended-->pended 【taskResume】
    
    suspended-->delayed 【taskResume】
    
    二、任务优先级设置
    
    优先级设置函数原型:taskPriorityGet()
    
    STATUS taskPrioritySet()
    {
        int tid;
        int newpPriority
    }
    函数taskPriority()有两个参数,第一个参数是任务的id号,第二个参数是新优先级,优先级范围从0~255,优先级设置成功返回OK,当任务ID非法时返回ERROER;
    
    三、任务优先级获取
    
    任务优先级获取函数原型:
    
    taskPriorityGet()
    
    STATUS taskPriorityGet()
    {
        int tid,
        int *pPriority
    }
    
       函数taskPriorityGet()有两个参数,第一个参数是任务ID号,第二个参数是整型指针,表示优先级地址。任务优先级获取任务时返回OK,当任务非法时返回ERROR。

1.3  任务调度

       多任务需要一个调度算法在就绪任务之间分配CPU,VxWorks的默认调度算法是基于优先级的可抢占调度,但是用户也可以在相同优先级任务之家选择Round-Robin调度算法;
    
    1)可抢占的优先级调度
    
       使用可抢占优先级调度时,每个任务都有自己的优先级,内核保证将CPU分配给优先级最高的任务并运行该任务,这个调度是可抢占的,如果有一个比当前任务优先级更高的任务就绪时,内核马上保存当前任务的上下文,切换到高优先级任。
    
    
    2)Round-Robin调度算法;
    
       可抢占优先级调度可以由Round-Robin调度算法扩充,Round-Robin调度算法尝试在所有相同优先级就绪任务之间平等共享CPU,Round-Robin调度使用时间片成组地在相同优先级任务之间公平分配CPU,每个组中的每个任务执行指定的时间间隔或者时间片,然后在另一个任务执行相同的时间,循环往复。Round-Robin调度由函数kernelTimeSize()启动,将时间片或者时间间隔作为参数。这个时间间隔是每个任务在放弃CPU给相同优先级之间执行的所有时间。如果一个任务在它的时间片被高优先级任务抢占,它的运行计数器被保存。当任务重新执行时就恢复;
    
    3)抢占锁
    
      内核可以通过调用taskLock()和taskUnlock()来使调度器生效和失效。当一个任务调taskLock()使调度器失效,任务运行时没有基于优先级的抢占发生,然而,如果任务被阻塞或者被悬置时,调度器就从就绪队列中去取出最高优先级的任务运行,当设置禁止抢占的任务接触阻塞,再次开始运行时,抢占又被禁止。抢占锁阻止了任务上下文切换但并不封锁中断处理。抢占所可以用于完成互斥,但是为了保证系统响应应该保持抢占锁定的时间最短。

1.4   用户接口


     1、任务调度控制函数:
        
            1)kernelTimeSlice():控制Round-Robin调度;
        
            2)taskPerioritySet():改变任务优先级;
        
            3)taskLock():取消任务调度;
        
            4)taskUnlock():启动任务调度;
        
        2、任务创建函数:
      
 
            1)taskSpawn():创建和激活一个新任务;
            
            2)taskInit():初始化一个新任务;
            
            3)taskActivate():激活一个已经初始化的任务;
            
        3、任务名称和ID函数:
        
            1)taskName():得到和任务ID相关的任务名称;
            
            2)taskNameTold():得到和任务名称相关的任务ID;
            
            3)taskIDSelf():得到调用任务的ID;
            
            4)taskIdVerify():检验特定任务的存在性;
            
        4、任务选项函数:
        
            1)taskOptionsGet():检验任务选项;
            
            2)taskOptionsSet():设置任务选项;
            
        5、任务信息函数:
        
            1)taskIdListGet():将所有激活任务的id填充一个数组;
            
            2)taskInfoGet():得到一个任务的信息;
            
            3)taskPriorityGet():检查任务的优先级;
            
            4)taskRegsGet():检查任务的寄存器;
            
            5)taskRegsSet():设置任务的寄存器;
            
            6)taskIsSuspended():检查任务是否挂起;
            
            7)taskIsReady():检查任务是否就绪;
            
            8)taskTcb():得到任务控制块指针;
            
        6、任务删除函数:
        
            1)exit():终止调用任务,释放内存空间(只是任务堆栈和任务控制块);
            
            2)taskDelete():终止指定的任务,释放内存空间(只是任务堆栈和任务控制块);
            
            3)taskSafe():从删除中保护调用任务;
            
            4)taskUnsafe():撤销taskSafe()(使得调用任务对于删除可用)
            
        7、任务控制函数
        
            1)taskSuspend():挂起一个任务u;
            
            2)taskResume():重新激活一个任务;
            
            3)taskRestart():重启一个任务;
            
            4)taskDelay():延时一个任务,延时单位是滴答;
            
            5)nanosleep():延时一个任务,延时单位是ns;
            
        8、任务扩展函数
        
            1)taskCreatHookAdd():添加一个函数,在任务创建时调用;
            
            2)taskCreatHookDelete():删除一个原先添加的任务创建函数;
            
            3)taskSwitchHookAdd():添加一个函数,在任务切换时调用;
            
            4)taskSwitchHookDelete():删除一个原先添加的任务切换函数;
            
            5)taskDeleteHookAdd():添加一个函数,在任务删除时调用;
            
            6)taskDeleteHookDelete():删除一个原来添加的任务删除函数;
            
            

结语:

       以上就是对VxWorks实时多任务的介绍啦,接下来的篇章我将展开来讲一讲VxWorks任务间间通信的结构和使用方式,希望与各位读者朋友一起探讨进步,我是指尖比比,我们下个好文再见!!!
       
    
    
    
    
    
    
    
    
    
    文章来源地址https://www.toymoban.com/news/detail-629231.html

到了这里,关于【Vxworks操作系统】实时多任务介绍-NO.2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微控制器实时操作系统实践1实时系统介绍

    这本实践指南将为你提供最重要的功能知识,以使实时操作系统(RTOS)在微控制器(MCU)上启动和运行。如果你有兴趣学习如何通过使用实际硬件的实例来实现RTOS的应用,并讨论常见的性能与开发时间的权衡,那么你就来对地方了!我们将使用自由RTOS来实现代码! 我们将使

    2024年02月08日
    浏览(42)
  • 简单介绍STM32上的FreeRTOS实时操作系统

    FreeRTOS是一款广泛使用的开源实时操作系统(RTOS),它为嵌入式系统提供了可靠的任务调度和并发管理。在嵌入式领域中,STM32微控制器广受欢迎,并且与FreeRTOS的结合使用可以提供强大的功能和灵活性。在本篇博客中,我们将深入探究STM32上的FreeRTOS,并了解其核心概念、任

    2024年02月16日
    浏览(54)
  • 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核&任务&中断)、与硬件的关系&实现

    上一课: 【小黑嵌入式系统第九课】PSoC 5LP第一个实验——LED、字符型LCD显示实验 下一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数 一. 凡从事嵌入式系统开发工作的人,必须对嵌入

    2024年02月05日
    浏览(50)
  • 【VxWorks】VxWorks系统详细介绍说明,环境搭建说明,使用场景,使用实例

    目录 1.VxWorks 概述 2.详细介绍 2.环境搭建说明 3.使用场景 4.使用实例         VxWorks 是一款实时操作系统(RTOS),广

    2024年02月15日
    浏览(39)
  • FreeRTOS_从底层学习实时操作系统

    目录 1. 裸机系统和多任务系统 2. 任务的定任务切换的实现 2.1 什么是任务? 2.2 调度器 2.3 临界段 3. 空闲任务和阻塞延迟 4. 时间片 裸机系统:         裸机系统 分为 轮询系统 和 前后台系统 ;(51单片机就属于裸机系统)         轮询系统 是在裸机编程的时候,先初始化

    2024年02月07日
    浏览(38)
  • 物联网实时操作系统1RTOS简介(上)

    在大型计算机的世界里,操作系统(OS operating systems)已经存在了相当长的一段时间。最基本的操作系统可以追溯到20世纪50年代。到20世纪70年代中期,操作系统的概念、结构、功能和界面已经非常成熟。 微型系统大约在 1970年出现。在基于微处理器的设备中迅速应用操作系统

    2024年02月16日
    浏览(56)
  • 微控制器实时操作系统实践5选择IDE

    集成开发环境(IDE integrated development environment)有能力极大地影响开发。集成开发环境被设计成具有较小的学习曲线,并且通常提供一种简单的方法来从现有的驱动程序和中间件建立解决方案。 在本章中,我们将讨论如何选择IDE,看看不同类型的IDE,并选择一个IDE来创建你在

    2024年02月08日
    浏览(46)
  • 嵌入式实时操作系统的设计与开发

    在RTOS中,时钟具有非常重要的作用,通过时钟可实现延时任务、周期性触发任务执行、任务有限等待的计时。 大多数嵌入式系统有两种时钟源,分别为实时时钟RTC(Real-Time Clock)和定时器/计数器。 实时时钟一般是靠电池供电,即使系统断电,也可以维持日期和时间。由于实

    2024年02月11日
    浏览(38)
  • FreeRTOS实时操作系统(六)列表与列表项

    FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS实时操作系统(四)中断任务管理 FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复 FreeRTOS实时操作系统(六)列

    2024年02月10日
    浏览(52)
  • 嵌入式实时操作系统的设计与开发(十)

    RTOS的引导是指将操作系统装入内存并开始执行的过程。在嵌入式系统的实际应用中,针对不同应用环境,对时间效率和空间效率有不同的要求。因此,操作系统启动时应充分考虑这两种限制。 时间限制主要包括两种情况:系统要求快速启动和系统启动后要求程序能实时运行

    2024年02月07日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包